一 . 前言
对象类型是以数组的形式存放在内存中,所以获取对象类型首先得定位到存放对象类型数组的表的位置。
二 . WINDBG下查找对象类型数组表
通过在windbg反汇编ObGetObjectType函数得到
图中ObTypeIndexTable就是存放对象类型的数组表起始地址 fffff80005638100
对象类型从数组第三个元素开始。
三 . (一)VC获取对象类型的地址(驱动部分)
①先获取ObGetObjectType函数的地址
RtlInitUnicodeString(&funcName, L"ObGetObjectType");
funcAddress = MmGetSystemRoutineAddress(&funcName)
②定位ObTypeIndexTable
注意:在win7 64位中ObTypeIndexTable的地址获取跟32位不一样
ObTypeIndexTable的地址=fffff80005763f40+ffed41b9+7
(fffff80005763f40:函数这行的起始地址
7:这行指令的字节数48 8d 0d b9 41 ed ff
ffed41b9:为字节指令的最后四个字节(倒序原因是计算机内部大小端排序)
)
得到上述的ObTypeIndexTable的地址在与(&)上0xfffffff0ffffffff才是真正的ObTypeIndexTable(因为做加法运算存在进位的问题)
上诉代码获取ObTypeIndexTable的地址并把每个元素都复制给Result数组
接下来分析下驱动中的READ派遣函数因为用户将从此派遣函数中得到Result数组中的值。
详情请了解驱动与用户层通信的方式(这里才用的是缓存方式的读写)
③创建设备并绑定符号链接(供用户层通信)
三(二)VC获取对象类型的地址(用户层部分)