在 x64 系统上获取 MmNonPagedPoolStart

逆向工程 视窗 记忆
2021-06-13 14:07:10

在 x64 Windows 7 上,我想获得非分页池的限制。我知道 _KDDEBUGGER_DATA64 结构有这个信息(像 MmNonPagedPoolStart 和 MmNonPagedPoolEnd 这样的字段)。在 x86 系统上,此结构是从 KPCR.KdVersionBlock 获得的,但在 x64 系统上使用 WinDbg 查找 KPCR 时,KdVersionBlock 似乎始终为空。

有没有办法获得这种结构?或者另一种获得我想要的东西的方式?也许我没有找对地方。

1个回答

nt!KdDebuggerDatablock 曾经是 NT 中的公共全局符号

lkd> x/v nt!KdDebuggerDataBlock
pub global 80545b60             0 nt!KdDebuggerDataBlock = <no type information> 

dpS nt!KdDebuggerDataBlock lxxxx 应该获取 NonPagedPoolStart

lkd> !grep -i -c "dpS nt!KdDebuggerDataBlock la5" -e "pool"
 8055b5a0 nt!ExpPagedPoolDescriptor
 8054ab2c nt!ExpNumberOfPagedPools
 nt!MmMaximumNonPagedPoolInBytes
 80553cb8 nt!MmNonPagedPoolStart

这应该得到完整的结构

lkd> .printf "%ma\t%08x\n" , nt!KdDebuggerDataBlock+10,poi(nt!KdDebuggerDataBlock+14)
KDBG    00000290
lkd> .for (r $t0=0 ; @$t0 <poi(nt!KdDebuggerDataBlock + 14) ; r $t0 = @$t0+4) { .printf "%08x\t%08x\t%y\n", (nt!KdDebuggerDataBlock + @$t0) ,poi(nt!KdDebuggerDataBlock + @$t0) ,poi(nt!KdDebuggerDataBlock + @$t0) }