Windbg实时调试中如何定位DriverEntry?以nt模块为例
实时调试场景下如何查找DriverEntry?
内核驱动模块的PE文件头中标记的入口点通常不是真正的DriverEntry——以系统核心模块nt为例,PE入口对应的是内核初始化入口KiSystemStartup,而非驱动入口DriverEntry。下面结合示例说明验证过程,以及正确的定位方法:
验证PE入口非DriverEntry的过程
- 获取模块基地址
使用lmvm命令查看目标模块的加载信息,提取start列的基地址:
kd> lmvm nt Browse full module list start end module name fffff802`1bc00000 fffff802`1cc47000 nt (pdb symbols) ...
这里fffff8021bc00000就是nt`模块的加载基地址。
- 查看PE头的入口点偏移
用!dh命令解析PE头,找到address of entry point对应的偏移值:
kd> !dh fffff802`1bc00000 ... A71010 address of entry point ...
- 验证该入口并非DriverEntry
将基地址与偏移相加得到入口地址,用u命令反汇编查看:
// 计算地址:基地址 + 入口偏移 = fffff802`1bc00000 + 0xA71010 kd> u fffff802`1bc00000+0xA71010 L1 nt!KiSystemStartup: fffff802`1c671010 4883ec38 sub rsp,38h
可以看到这个入口是KiSystemStartup,不是我们要找的DriverEntry。
正确定位DriverEntry的方法
方法一:利用符号直接查找(推荐)
如果目标模块有完整的PDB符号,直接用x命令搜索模块的DriverEntry:
kd> x nt!DriverEntry fffff802`1c05d000 nt!DriverEntry
反汇编确认函数结构:
kd> u nt!DriverEntry L5 nt!DriverEntry: fffff802`1c05d000 48895c2410 mov qword ptr [rsp+10h],rbx fffff802`1c05d005 48896c2418 mov qword ptr [rsp+18h],rbp fffff802`1c05d00a 4889742420 mov qword ptr [rsp+20h],rsi fffff802`1c05d00f 57 push rdi fffff802`1c05d010 4883ec50 sub rsp,50h
方法二:无符号时解析导出表查找
如果没有符号支持,需要手动解析模块的导出表:
- 用
!dh查看导出表的相关RVA:
kd> !dh fffff802`1bc00000 ... Export Directory TimeDateStamp: 55c40a3d Major/Minor: 0/0 Name: ntkrnlmp.exe Base: 1000 Number of functions: 2b9e Number of Names: 2b9e Address of functions: fffff802`1bc00000 + 0x9f0000 = fffff802`1c5f0000 Address of names: fffff802`1bc00000 + 0xa50000 = fffff802`1c650000 Address of ordinals: fffff802`1bc00000 + 0xa6c000 = fffff802`1c66c000 ...
- 遍历导出表中的名称列表,找到
DriverEntry对应的函数地址;或者根据内核驱动的导出规则,定位到驱动入口函数。
内容的提问来源于stack exchange,提问作者jimmy
相关产品推荐
相关产品推荐

