首页
论坛
课程
招聘
[总结]获取内核ntoskrnl.exe基地址的几种常见办法
2008-1-17 09:38 32535

[总结]获取内核ntoskrnl.exe基地址的几种常见办法

2008-1-17 09:38
32535
如果大家写过shellcode一定还记得,shellcode中开头要找kernel32.dll模块的内存加载地址。
同样,如果大家要写一个内核的类似东东的话,第一步也是要找出ntoskrnl.exe模块的内存加载位置。有三种常见办法在这里咱们大体描述下:

1。利用ZwQuerySystemInformation 来检索加载的模块,从加载模块里面搜索出ntoskrnl.exe模块。例子如:http://bbs.pediy.com/showthread.php?t=58199
在开头部分就是利用ZwQuerySystemInformation 来检所ntoskrnl.exe模块的内存加载位置。

2。通过驱动DriverEntry函数的第一个参数,即DriverObject。在DriverObject结构体中有一项
   DriverSection成员指向LDR_DATA_TABLE_ENTRY结构,通过遍历这张表得到ntoskrnl的基址和大小。例子如:http://bbs.pediy.com/showthread.php?t=56042

3。通过驱动DriverEntry函数的返回地址,根据系统布局图,如下:
  
因此,我们可以在从80000000h开始的位置搜索ntosknrl。我们的驱动程序就是加载在系统布局图的80000000h到a0000000h的区间中。

完整代码如下:
.386
.model flat, stdcall
option casemap:none

include GetKernelBase.inc

.code
GetKernelBase proc uses esi edi ebx dwSomewhereInKernel:DWORD

        xor edi, edi                        ; assume error

        mov eax, MmSystemRangeStart
        mov eax, [eax]
        mov eax, [eax]                  ; eax = 80000000h

;  #define PAGE_SHIFT      12
;  #define PAGE_SIZE       (1UL << PAGE_SHIFT)  4k为单位

        .if dwSomewhereInKernel >= eax
                mov esi, dwSomewhereInKernel
                and esi, not (PAGE_SIZE-1)                        ; start down-search from here
                mov ebx, esi
                sub ebx, eax                                        ;     - MmSystemRangeStart
                shr ebx, PAGE_SHIFT                                ; Number of pages to search

                .while ebx
                        invoke MmIsAddressValid, esi
                        .break .if al == FALSE                         ; bad
                        mov eax, [esi]
                        .if eax == 00905A4Dh                        ; MZ signature
                                mov edi, esi
                                .break
                        .endif
                        sub esi, PAGE_SIZE                                ; next page down
                        dec ebx                                                ; next page
                .endw

        .endif

        mov eax, edi
        ret

GetKernelBase endp

DriverEntry proc pDriverObject:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRING

        lea ecx, [ebp][4]      ; 得到DriverEntry返回地址
        push ecx
        invoke MmIsAddressValid, ecx
        pop ecx
        .if al
                mov ecx, [ecx]                                        ; Get return address from stack
                invoke GetKernelBase, ecx
                .if eax != 0
                        invoke DbgPrint, $CTA0("GetKernelBase: ntoskrnl.exe base = %08X\n"), eax
                .else
                        invoke DbgPrint, $CTA0("GetKernelBase: Couldn't find ntoskrnl.exe base\n")
                .endif
        .endif

        mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
        ret

DriverEntry endp

end DriverEntry

看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (32)
雪    币: 892
活跃值: 活跃值 (74)
能力值: ( LV9,RANK:570 )
在线值:
发帖
回帖
粉丝
mickeylan 活跃值 14 2008-1-17 09:46
2
0
好文,收藏了。
雪    币: 109
活跃值: 活跃值 (197)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 活跃值 26 2008-1-17 09:54
3
0
顺便问下诸位,如果帖子标题中有错别字,该怎么修改?怎么我感觉我自己好像不能修改似的。是不是这样呢?
雪    币: 892
活跃值: 活跃值 (74)
能力值: ( LV9,RANK:570 )
在线值:
发帖
回帖
粉丝
mickeylan 活跃值 14 2008-1-17 10:00
4
0
可以修改呀,编辑然后进入高级模式就可以改了。
雪    币: 482
活跃值: 活跃值 (938)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2008-1-17 12:31
5
0
嗯。学习~

但有可能系统的内核非ntoskrnl.exe。
所以还是直接用ZwQuerySystemInformation 来检索加载的模块。第一个地址处的便是内核地址了。 ntos*.exe
雪    币: 109
活跃值: 活跃值 (197)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 活跃值 26 2008-1-17 13:32
6
0
,的确没考虑多核的情况。
雪    币: 38
活跃值: 活跃值 (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
炉子 活跃值 3 2008-1-17 15:40
7
0
这样得到的也是第一个模块地址 :)
雪    币: 202
活跃值: 活跃值 (45)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
szdbg 活跃值 5 2008-1-17 16:27
8
0
好文,标记一下,回头再学习



可以啊,进入编辑模式后, 再点击 [高级模式] 就可以,更改标题了
雪    币: 217
活跃值: 活跃值 (36)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
softworm 活跃值 30 2008-1-17 18:17
9
0
从那个KPCR取更省事点
雪    币: 6535
活跃值: 活跃值 (848)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
RuShi 活跃值 2008-1-17 22:22
10
0
收藏学习了。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lOOp 活跃值 2008-1-17 22:37
11
0
大家讨论 我来学习。。
雪    币: 169
活跃值: 活跃值 (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
superleft 活跃值 2008-1-24 11:05
12
0
FS:[0X124]
是不是就是那个传说中的KPCR?  我很想知道这个方法有什么局限没?
(强烈感谢LZ发帖....以前潜了很久的水... 以为看雪只有破解类的文章...现在发现还有这么有价值的帖子..遂决定浮出水面~~~)
雪    币: 482
活跃值: 活跃值 (938)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2008-1-24 11:33
13
0
FS:[0X124]
指向的是ETHREAD.
fs 在内核模式下指向KPCR (Kernel Process Control Region)
用户模式下指向TEB

这个方法无局限性

不管是ntoskrnl.exe还是ntkrnlpa.exe
雪    币: 169
活跃值: 活跃值 (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
superleft 活跃值 2008-1-24 14:05
14
0
感谢sudami
雪    币: 400
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
归类 活跃值 2008-1-26 22:00
15
0
好文章,收藏了
雪    币: 235
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:460 )
在线值:
发帖
回帖
粉丝
火影 活跃值 11 2008-4-23 00:03
16
0
老兄,MmSystemRangeStart 在汇编中怎么使用?
雪    币: 109
活跃值: 活跃值 (197)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 活跃值 26 2008-4-23 09:16
17
0
mov eax, MmSystemRangeStart
        mov eax, [eax]
        mov eax, [eax]

这个符号是在ntoskrnl模块中导出的,直接使用就行。
雪    币: 229
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bruclan 活跃值 2008-7-4 23:15
18
0
真的很不错,收藏了
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
acpl 活跃值 2008-7-4 23:58
19
0
此代码怎么在RAS中进行实现!在xp的进程空间中,系统和用户分别有独立的.一个进程在系统中有一段,在用户空间也有一段!此进程怎么判断其地址?!
雪    币: 6881
活跃值: 活跃值 (366)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
玩命 活跃值 31 2008-7-5 02:09
20
0
先收藏,再学习。。。
雪    币: 215
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
twister 活跃值 1 2008-9-21 20:17
21
0
请问一下,,MASM32上编找不到DDK的INC文件...怎么办到那下啊????那位大哥有...传份给我,,395940818@qq.com 先3q
雪    币: 135
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gongbin 活跃值 2008-12-10 14:22
22
0
学习了..  谢谢... 
雪    币: 135
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kieepog 活跃值 2009-8-2 23:58
23
0
收益匪浅的说,留名慢慢研究
雪    币: 149
活跃值: 活跃值 (12)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
wangttkl 活跃值 2009-8-3 07:35
24
0
不错的文章,收藏了。
雪    币: 284
活跃值: 活跃值 (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jerrynpc 活跃值 2009-8-3 08:35
25
0
超级好的的文章,收藏了。
游客
登录 | 注册 方可回帖
返回