实验环境: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直播授课