一 .
关于内核目录对象的基础知识请了解其他作者写的博客,
此文只讲述如何动态定位目录对象的起始位置.
二 .
ObpRootDirectoryObject是内核中的一个地址,这个地址里面存放的第一个64位的数据就为目录对象的起始地址。
打红圈的是目录对象的起始地址,前面FFFFF80005675590就是ObpRootDirectoryObject的地址,那么如何在内核动态定位ObpRootDirectoryObject的地址呢?
三 .
通过寻找 KdDebuggerDataBlock结构来动态定位,所以要先获取到
KdDebuggerDataBlock结构的地址,这里我们用在函数的方式定位
①KeCapturePersistentThreadState函数(反汇编)
图中打红圈的就是KdDebuggerDataBlock结构的地址
②地址定位方法:我们首先获取到fffff800055d771c地址
(方法:fffff800’0563b120=fffff800’055d771c+000639fd+7)
四 .
得到KdDebuggerDataBlock结构的地址进行反汇编观察
打红圈的就是ObpRootDirectoryObject的地址
注意:KdDebuggerDataBlock结构是没有被定义(高手可以自行反汇编),我们可以把他想象成数组,每个数组元素都是ULONGLONG类型的,那么这个数组中的第20个数就是ObpRootDirectoryObject的地址。
Example:ULONGLONG *KdDebuggerDataBlock;
KdDebuggerDataBlock=KdDebuggerDataBlock的地址;
ObpRootDirectoryObject的地址=KdDebuggerDataBlock[19];