首页
社区
课程
招聘
[总结]获取内核ntoskrnl.exe基地址的几种常见办法
发表于: 2008-1-17 09:38 34885

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

2008-1-17 09:38
34885

如果大家写过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


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (32)
雪    币: 1004
活跃值: (75)
能力值: ( LV9,RANK:570 )
在线值:
发帖
回帖
粉丝
2
好文,收藏了。
2008-1-17 09:46
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
3
顺便问下诸位,如果帖子标题中有错别字,该怎么修改?怎么我感觉我自己好像不能修改似的。是不是这样呢?
2008-1-17 09:54
0
雪    币: 1004
活跃值: (75)
能力值: ( LV9,RANK:570 )
在线值:
发帖
回帖
粉丝
4
可以修改呀,编辑然后进入高级模式就可以改了。
2008-1-17 10:00
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
5
嗯。学习~

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



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

这个方法无局限性

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

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