You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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是同一文件,我只是将其复制到不同路径使用。

问题

重加载后的内核模块无法显示正确的符号名称。

验证过程

  1. 查看原始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)
  1. 计算该函数的偏移:
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
  1. 检查重加载模块中地址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,而重加载模块仅显示原始地址。

  1. 验证调用指令的偏移一致:
kd> ?83c4967e-83c14000
Evaluate expression: 218750 = 0003567e
kd> ?89a1667e-899e1000
Evaluate expression: 218750 = 0003567e

提问

请问我哪里操作有误?如何让重加载的模块显示正确的符号名称?


内容的提问来源于stack exchange,提问作者Hacksign

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:33:16