
Win10的HANDLE_TABLE_ENTRY没有Object成员,只有ObjectPointerBits,为了提取对象(头)指针,必须这样:

下面讲如何逆向得到上述两种算法。
反汇编nt!ObpReferenceObjectByHandleWithTag()。Win10使用TypeIndex时有个混淆机制涉及全局变量ObHeaderCookie。去IDA中F5,Alt-T搜"ObHeaderCookie",定位:

上面的ObjectHeader本来不是这个名字,但我知道这个混淆算法细节,自然推断出哪个是ObjectHeader。
然后在F5结果中向低址方向寻找对ObjectHeader的赋值操作:

nt!ObpReferenceObjectByHandleWithTag+0x33e附近的代码用C语言描述:

不考虑符号位扩展的情况下,前述C代码等价于:

观察到ObjectPointerBits最高位总是1,此时若考虑符号位扩展,上述C代码修正成:

在C编程时,将VolatileLowValue定义成int64,直接对之进行>>,方法A更接近汇编语义;方法B强烈依赖于ObjectPointerBits最高位总是1的事实,偏离汇编语义。不过,可能方法B更接近源代码C语义。因为只是逆向,权当瞎猜,微软用sar指令,可能就是让ObjectPointerBits省2个字节的意思。
周期性吐槽,微信订阅号只能当RSS用,截图是因为无法排版。感兴趣者请在PC上用浏览器查看原文。
文章转载自青衣十三楼飞花堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




