Windbg中重加载内核模块无法显示正确符号名称求助
PE模块重加载后符号显示异常问题
我编写了一段代码,可将PE模块重加载到任意地址,以下是该代码重加载Windows内核ntoskrnl.exe后的内存情况:
kd> lm start end module name 83c14000 84018000 nt (pdb symbols) \\vboxsvr\symbols\ntkrnlmp.pdb\00625D7D36754CBEBA4533BA9A0F3FE22\ntkrnlmp.pdb 899e1000 899e1000 nt_ffffffff899e1000 T (pdb symbols) \\vboxsvr\sharedfolder\nt.pdb ......
地址0x83c14000是原始ntoskrnl.exe,0x899e1000是新重加载的模块,两者二进制数据完全一致:
kd> dc 83c14000 L20 83c14000 00905a4d 00000003 00000004 0000ffff MZ.............. 83c14010 000000b8 00000000 00000040 00000000 ........@....... 83c14020 00000000 00000000 00000000 00000000 ................ 83c14030 00000000 00000000 00000000 00000278 ............x... 83c14040 0eba1f0e cd09b400 4c01b821 685421cd ........!..L.!Th 83c14050 70207369 72676f72 63206d61 6f6e6e61 is program canno 83c14060 65622074 6e757220 206e6920 20534f44 t be run in DOS 83c14070 65646f6d 0a0d0d2e 00000024 00000000 mode....$....... kd> dc 899e1000 L20 899e1000 00905a4d 00000003 00000004 0000ffff MZ.............. 899e1010 000000b8 00000000 00000040 00000000 ........@....... 899e1020 00000000 00000000 00000000 00000000 ................ 899e1030 00000000 00000000 00000000 00000278 ............x... 899e1040 0eba1f0e cd09b400 4c01b821 685421cd ........!..L.!Th 899e1050 70207369 72676f72 63206d61 6f6e6e61 is program canno 899e1060 65622074 6e757220 206e6920 20534f44 t be run in DOS 899e1070 65646f6d 0a0d0d2e 00000024 00000000 mode....$.......
\\vboxsvr\symbols\ntkrnlmp.pdb\00625D7D36754CBEBA4533BA9A0F3FE22\ntkrnlmp.pdb与\\vboxsvr\sharedfolder\nt.pdb是同一文件,我只是将其复制到不同路径使用。
问题
重加载后的内核模块无法显示正确的符号名称。
验证过程
- 查看原始ZwCreateFile代码:
kd> u ZwCreateFile L5 nt!ZwCreateFile: 83c47300 b842000000 mov eax,42h 83c47305 8d542404 lea edx,[esp+4] 83c47309 9c pushfd 83c4730a 6a08 push 8 83c4730c e86d230000 call nt!KiSystemService (83c4967e)
- 计算该函数的偏移:
kd> ?83c47300-83c14000 // original function offset in ntoskrnl.exe Evaluate expression: 209664 = 00033300 kd> ?899e1000+00033300 // function address in reloaded ntoskrnl.exe (0x899e1000 is new base address, see above) Evaluate expression: -1985920256 = 89a14300
- 检查重加载模块中地址
0x89a14300处的函数:
kd> u 89a14300 L5 ReadVirtual: 89a14300 not properly sign extended 89a14300 b842000000 mov eax,42h 89a14305 8d542404 lea edx,[esp+4] 89a14309 9c pushfd 89a1430a 6a08 push 8 89a1430c e86d230000 call 89a1667e
两者指令一致,但调用指令处,原始模块显示正确的符号名称nt!KiSystemService,而重加载模块仅显示原始地址。
- 验证调用指令的偏移一致:
kd> ?83c4967e-83c14000 Evaluate expression: 218750 = 0003567e kd> ?89a1667e-899e1000 Evaluate expression: 218750 = 0003567e
提问
请问我哪里操作有误?如何让重加载的模块显示正确的符号名称?
内容的提问来源于stack exchange,提问作者Hacksign
相关产品推荐
相关产品推荐

