首页
社区
课程
招聘
[原创]windbg拦截驱动
发表于: 2012-1-13 21:00 26366

[原创]windbg拦截驱动

2012-1-13 21:00
26366

驱动的加载有几种方式,查看CreateService就可以知道。
1、SERVICE_BOOT_START = 0x00000000,被系统loader加载,这类驱动是最早加载的。驱动文件必须放在C:\Windows\System32\drivers目录下,因为此时系统只能读注册表,不能打开文件,不能打出调试信息。看了下面的分析就清楚了。
2、SERVICE_SYSTEM_START = 0x00000001,系统初始化完成后才加载的
3、SERVICE_DEMAND_START = 0x00000003,手动加载

环境:win7 32bit,
目标:拦截hookport.sys
方法:
通常拦截驱动,可以在nt!MmLoadSystemImage下断点。
1、显示驱动全名并显示驱动基址:
bp nt!MmLoadSystemImage".if(1){!ustr poi(esp+4); dd poi(esp+0x18);}.else{gc;}"
poi(esp+0x18)就是保存驱动基址的指针ImageBaseAddress
2、nt!MmLoadSystemImage返回后,dd ImageBaseAddress,显示的就是驱动基址
3、给驱动起点函数下断点
bp 驱动基址+poi(poi(驱动基址+0x3c)+ 驱动基址+0x28)
4、运行,就停在驱动的起点函数


NTSTATUS
MmLoadSystemImage (
    IN PUNICODE_STRING ImageFileName,
    IN PUNICODE_STRING NamePrefix OPTIONAL,
    IN PUNICODE_STRING LoadedBaseName OPTIONAL,
    IN BOOLEAN LoadInSessionSpace,
    OUT PVOID *ImageHandle,
    OUT PVOID *ImageBaseAddress
    )


但是hookport.sys就不能用上面的方法来,因为它的加载类型是SERVICE_BOOT_START,如下图:

通过研究系统,可以用下面的断点:
下断点bp nt!PnpInitializeBootStartDriver".if(1){!ustr poi(esp+8);}.else{gc;}",此时可以显示驱动的注册表信息

断下来后,在nt!IopInitializeBuiltinDriver里面找第一个call    dword ptr [eax],

下断点即可,跟进去就是驱动的入口点了

其实可以计算  INIT:007A79CF                 call    dword ptr [eax]  与nt的rva,直接下断点就可以了  bp nt基址+0x003A79CF


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (33)
雪    币: 4984
活跃值: (3330)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
用“__asm int 3”的路过
2012-1-13 23:20
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
3
sxe ld
2012-1-13 23:21
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
4
回楼上,sxe ld hookport  是不能断下来的,我以前也试过的。
2012-1-14 09:23
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
5
这种问题,09年已经讨论滴很详细咯。。。
http://www.debugman.com/thread/2943/1/1
http://www.debugman.com/thread/3692/1/1
2012-1-14 11:43
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
6
LS的,在win7 32bit 下你自己试下就知道了,确实拦截不下来,360的hookport.sys是SERVICE_BOOT_START,
2012-1-14 13:46
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
7
我是指普通的用sxe ld就够了,BOOT0驱动就用IOP*。
链接里的两个帖子里面3年前就已经讨论过了。
2012-1-15 01:07
0
雪    币: 70
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你应该没有启动bootmanager的调试,是可以断的,千真万确.
2012-1-15 11:20
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
9
我这里主要是讨论SERVICE_BOOT_START类型驱动的拦截,,
楼上的兄弟,能不能说清楚点,,具体怎么设置的
2012-1-15 15:33
0
雪    币: 70
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
(1)以管理员身份模式运行cmd

(2)键入如下bcdedit命令

bcdedit /set {bootmgr} bootdebug on
bcdedit /set {bootmgr} debugtype serial
bcdedit /set {bootmgr} debugport 1
bcdedit /set {bootmgr} baudrate 115200

设置windbg

连接上后...

kd> sxe ld:hookport.sys
kd> g
nt!DbgLoadImageSymbols+0x47:
83a55fa6 cc              int     3
kd> lmvm hookport
start    end        module name
8f263000 8f284e80   hookport (deferred)   

kd> bp 8f263000+poi(poi(8f263000+3c)+8f263000 +28)

kd> g

类似这样,就到了驱动的driverentry了

我都是如此调试360的几个驱动的....应该没有意外的
2012-1-15 15:52
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
11
亲爱的楼上的兄弟,你所写的1,2步就是设置系统为调试模式,
我按照你所说的试验了一遍,断不下来,,
2012-1-15 16:20
0
雪    币: 70
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我刚刚又连上办公室的机子,用了这个步骤,一切很ok啊

win 7 32位 sp1 旗舰简体中文 + vmware 8.0 + windbg 6.11.0001.404 x86

难道,是我人品好?

上传的附件:
2012-1-15 22:21
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
13
看来个体差异很大啊,,呵呵,,,

上传的附件:
2012-1-15 23:28
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
14
我这边愣没断下来,
看来还是 在nt!IopInitializeBuiltinDriver里面找第一个call    dword ptr [eax],这样断可行些。。
2012-1-15 23:44
0
雪    币: 2291
活跃值: (2185)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
15








明白了不,亲。
上传的附件:
2012-2-24 23:46
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
16
小小纠正1下lz的某句话
驱动文件必须放在\System32\drivers目录下,因为此时系统只能读注册表,不能打开文件,不能打出调试信息

其实可以打印调试信息的,打开文件也可以,不过,由于windbg的 kernel debugger还没有完全启动,无法下断点,要在你看见那个windbg自动定下的int3之后才行

另外还有一个 ntldr+windbg的调试哦,这才是真正的boot debuger,这个大米牛应该很有研究的,不过还有更早的16位汇编模式下的,那个就只能qemu+windbg了
2012-2-26 14:21
0
雪    币: 136
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习下
2012-2-26 15:13
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
18
这位同学可以自己去试下,在下面这种情况下,打调试信息和读写文件操作,都是不行的,操作注册表是可以的,我在调试驱动的时候遇到过的。

1、SERVICE_BOOT_START = 0x00000000,被系统loader加载,这类驱动是最早加载的。驱动文件必须放在C:\Windows\System32\drivers目录下,因为此时系统只能读注册表,不能打开文件,不能打出调试信息。
2012-2-26 15:31
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
19
如果可以的话,说说怎么做的,
2012-2-26 15:32
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
20
[QUOTE=莫灰灰;1047616]







明白了不,亲。[/QUOTE]

亲爱的小灰灰,哥哥我这样做了,确实断不吓来啊,
2012-2-27 10:16
0
雪    币: 111
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21

楼主的好像没有冒号 :
2012-2-29 18:34
0
雪    币: 379
活跃值: (152)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
22
一些还原软件就是boot型驱动,windbg中是可以调试的,只要在ntldr之后。虽然在windbg你看到它已加载,但是该驱动其实还未运行,直接下bp 驱动模块名称+oep,可以断下来
2012-2-29 22:12
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
23
[QUOTE=flyliying;1048964]
楼主的好像没有冒号 :[/QUOTE]

没有区别,请看图
上传的附件:
2012-2-29 23:20
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
24
[QUOTE=guxinyi;1038590]我这边愣没断下来,
看来还是 在nt!IopInitializeBuiltinDriver里面找第一个call    dword ptr [eax],这样断可行些。。[/QUOTE]

还是自己总结的方法好用,呵呵
2012-2-29 23:23
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
我碰到个问题,不是所有的模块加载windbg都会得到通知的。
以我的XP为例子,MmLoadSystemImage加载了lbrtfdc.SYS,但windbg得不到通知,而且lm中也看不到,请问是什么原因,是不是和驱动的类型有关?
2012-3-14 17:34
0
游客
登录 | 注册 方可回帖
返回
//