首页
社区
课程
招聘
[原创]让Windbg在驱动入口前断下来
发表于: 2018-6-17 17:30 10887

[原创]让Windbg在驱动入口前断下来

2018-6-17 17:30
10887

实验环境:Win7 64位

用到windbg命令:

bu 驱动名称!DriverEntry

示例:MyDriver

加载MyDriver,成功的断了下来

对MyDriver所有函数下断点:

其实使用bm MyDriver!DriverEntry,也可以断下来,不需要符号存在.但当使用了通配符就需要符号存在.我把MyDriver卸载,会提示找不到符号.

用到windbg命令

ln 查找地址附近的符号

下断: bp MyDriver+0x6000 (可以使用bp,bu,bm,使用bp只是为了说明它无需符号的支持,避免造成混淆)

加载MyDriver

我们看到并不是DriverEntry,让我们看一下这个函数的完整信息,可以看到有调用DriverEntry的地方.

我们查看一下ESP指向地址的值

fffff800`042cc467 就是其返回地址,我们用ln命令查看一下该地址

是IopLoadDriver+0xa07 处的位置.我们看一下他的上一条指令

我们只要在call qword ptr [rbx+58h],下断即可.

用到windbg 命令

用sx 查看事件异常列表

可以看到 ld - Load module - output

我们在加载模块时中断下来:通过 sxe ld

加载MyDriver,在nt!DebugService2+0x5中断了下来

我们通过Setp Out一层一层的走出函数,来到了我们熟悉的IopLoadDriver,这样子我们就知道怎么到达驱动入口了(不懂请看上面).

如果不需要该事件发生了,可以使用 sxn 命令取消:

 
 
 
 
 
kd> bu MyDriver!DriverEntry
kd> bl
     0 e Disable Clear u                      0001 (0001) (MyDriver!DriverEntry)
kd> bm MyDriver!*
  2: fffff880`03409050 @!"MyDriver!_guard_dispatch_icall_nop"
  3: fffff880`0340e000 @!"MyDriver!GsDriverEntry"
  4: fffff880`03409000 @!"MyDriver!Unload"
  5: fffff880`03409030 @!"MyDriver!_guard_check_icall_nop"
  6: fffff880`0340e02c @!"MyDriver!__security_init_cookie"
breakpoint 0 redefined
  0: fffff880`03409010 @!"MyDriver!DriverEntry"
kd> bl
     0 e Disable Clear  fffff880`03409010  [e:\studio\vs2017\mydriver\mydriver\driver.cpp @ 10]     0001 (0001) MyDriver!DriverEntry
     2 e Disable Clear  fffff880`03409050  [minkernel\crts\crtw32\misc\amd64\guard_dispatch.asm @ 57]     0001 (0001) MyDriver!_guard_dispatch_icall_nop
     3 e Disable Clear  fffff880`0340e000  [minkernel\tools\gs_support\kmode\gs_support.c @ 113]     0001 (0001) MyDriver!GsDriverEntry
     4 e Disable Clear  fffff880`03409000  [e:\studio\vs2017\mydriver\mydriver\driver.cpp @ 4]     0001 (0001) MyDriver!Unload
     5 e Disable Clear  fffff880`03409030  [minkernel\crts\crtw32\misc\guard_support.c @ 81]     0001 (0001) MyDriver!_guard_check_icall_nop
     6 e Disable Clear  fffff880`0340e02c  [minkernel\tools\gs_support\kmode\gs_support.c @ 57]     0001 (0001) MyDriver!__security_init_cookie

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
支持
分享
最新回复 (6)
雪    币: 573
活跃值: (222)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2018-6-19 02:47
0
雪    币: 6977
活跃值: (1786)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
kdBreakPoint
2018-6-19 10:06
0
雪    币: 59
活跃值: (740)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
bu  $iment(模块名)    一直这么用感觉很方便,如果模块名是数字的话,在模块名前加个感叹号就可以了。
2018-6-19 10:51
0
雪    币: 4139
活跃值: (2854)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
5
TopC kdBreakPoint
谢谢提醒,只是为了可以中断任意驱动加载.KdBreakPoint确实也可以中断任意驱动,只需要把相应模块的入口地址代码的一个字节改为0XCC.中断时在还原回去,感觉这个和第2个差不多,而且第2个更加方便一些.当然了调自己代码的时候KdBreakPoint是很方便的.
2018-6-20 06:25
0
雪    币: 4139
活跃值: (2854)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
简单未遂 bu $iment(模块名) 一直这么用感觉很方便,如果模块名是数字的话,在模块名前加个感叹号就可以了。
同感
2018-6-20 06:26
0
雪    币: 47
活跃值: (1867)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
7
chpeagle 谢谢提醒,只是为了可以中断任意驱动加载.KdBreakPoint确实也可以中断任意驱动,只需要把相应模块的入口地址代码的一个字节改为0XCC.中断时在还原回去,感觉这个和第2个差不多,而且第2个更加方 ...
大佬,使用KdBreakPoint怎么去中断的
2022-10-11 21:43
0
游客
登录 | 注册 方可回帖
返回
//