如果要建立完全的NT内核调试(KD)会话,调试引擎还需要一个比较重要的结构体,它是nt内核中的一个全局变量,名为KdVersionBlock。
因为对于不同版本的NT内核,这个全局变量的偏移是不一样的。所以需要大家想办法找到。
对于GDK7预装的nt内核,请查阅下面的表格填写。
对于大家自己升级过的内核,可以通过如下方法来查找。
使用串口方式调试你所用版本的内核,可以使用虚拟机,也可以使用真机,机器不限,只要内核的版本一致就可以
模仿如下步骤,查找nt!KdVersionBlock的地址和内容。
2: kd> x nt!KdVersionBlock
fffff801`1400f3f8 nt!KdVersionBlock = <no type information>
2: kd> dq fffff801`1400f3f8
fffff801`1400f3f8 00470206`4a61000f 00000033`030c8664
fffff801`1400f408 **fffff801`13400000** fffff801`1402a820
fffff801`1400f418 fffff801`14040810 00000002`00000000
fffff801`1400f428 00000000`00000000 0000007f`fffff000
fffff801`1400f438 00000000`00000027 0000007f`fffff000
fffff801`1400f448 00000000`00000004 004c4b40`00000048
fffff801`1400f458 000003e8`0000001e 00000000`000003e8
fffff801`1400f468 00000000`00000064 00000000`00000032
上面加**部分是nt内核的基地址,如果与lv命令显示的一致,则代表正确。
2: kd> lm vm nt
Browse full module list
start end module name
fffff801`13400000 fffff801`14446000 nt (pdb symbols) C:\liujiali\Debuggers\x64\sym\ntkrnlmp.pdb\2F5ADEE106E341E8FE0539A8EEA780C11\ntkrnlmp.pdb
Loaded symbol image file: ntkrnlmp.exe
Image path: ntkrnlmp.exe
Image name: ntkrnlmp.exe
Browse all global symbols functions data
Image was built with /Brepro flag.
Timestamp: C9669E93 (This is a reproducible build file hash, not a timestamp)
CheckSum: 00A651AC
ImageSize: 01046000
Translations: 0000.04b0 0000.04e4 0409.04b0 0409.04e4
Information from resource tables:
计算在nt内核模块内部的偏移地址
2: kd> ? fffff8011400f3f8-fffff801
13400000
Evaluate expression: 12645368 = 00000000`00c0f3f8将偏移地址写到ndb.cfg
[syspara]
kd_version_block=0xc0f3f8修改配置文件后,再使用dci方式调试,启动过程中一般会自动加载nt模块。如果希望看到完整的模块列表,可以执行.reload命令(需要几秒钟时间)。
.reload
Target: machine 8664, kernel base 0xfffff80113400000, dbgdata 0x0, modhead 0x0 orig 0x0, printk buffer 0x0 length 0x0
Successfully read KD_VERSION_BLOCK from target 0xc0f3f8
Connected to Windows 10 19041 x64 target at (Mon Aug 12 11:58:03.314 2024 (UTC + 8:00)), ptr64 TRUE
Loading Kernel Symbols
………………………
执行.reload时,如果看到类似上面的输出,则表示前面的设置成功,ndb可以顺利找到KdVersionBlock了。
这时再lm显示模块列表,一般就可以看到大量模块了:
lm
start end module name
00007ff602080000 00007ff6
02091000 svchost (deferred)
00007ffcc22e0000 00007ffc
c24fd000 OpcServices (deferred)
00007ffcc9560000 00007ffc
c9724000 AppxPackaging (deferred)
00007ffcd1370000 00007ffc
d1393000 CRYPTXML (deferred)
00007ffcd2100000 00007ffc
d214c000 AppxSip (deferred)
00007ffcd5c60000 00007ffc
d5ca2000 AppxApplicabilityEngine (deferred)
00007ffcd5cb0000 00007ffc
d5ce9000 appxapplicabilityblob (deferred)
00007ffcd5e00000 00007ffc
d5e52000 mrmdeploy (deferred)
00007ffcd5e70000 00007ffc
d6237000 appxdeploymentserver (deferred)
00007ffcd6c00000 00007ffc
d6d46000 Windows_StateRepositoryPS (deferred)
00007ffcd9940000 00007ffc
d9a94000 webservices (deferred)
00007ffcda850000 00007ffc
daaaf000 msxml6 (deferred)
00007ffcdf3a0000 00007ffc
df3c8000 srvcli (deferred)
00007ffcdf3f0000 00007ffc
df5dc000 urlmon (deferred)
00007ffcdfab0000 00007ffc
dfb61000 StateRepository_Core (deferred)
00007ffce0310000 00007ffc
e05ce000 iertutil (deferred)
00007ffce7080000 00007ffc
e7178000 MrmCoreR (deferred)
00007ffce8940000 00007ffc
e8a43000 AppXDeploymentClient (deferred)
00007ffce8cc0000 00007ffc
e8ccb000 AppxStreamingDataSourcePS (deferred)
00007ffcea4a0000 00007ffc
ea4d6000 XmlLite (deferred)
00007ffcea5b0000 00007ffc
ea5c6000 usermgrcli (deferred)
【省略很多】
附录1:
已知的KdVersionBlock(KVB)偏移地址:
| NT版本 | KVB偏移地址 |
| —————— | ———— |
|Windows 10 19041 | 0xc0f3f8 |
|Windows 10 18363.836 | 0x42a3d8 |
| | |
附录2
更多资料:
https://www.nanocode.cn/wiki/docs/gdk7_primer/gdk7_KdVersionBlock
最后编辑:zuoyingying 更新时间:2024-12-09 10:54