IDA Pro中mov eax,[ecx-14h]负号含义及多继承类逆向疑问
关于多重继承下
this - 0x8的本质及类结构处理 这种this - 0x8的操作,核心是C++多重继承的this指针调整机制,问题出在你假设的类结构继承顺序或基类大小估算错误上。
为什么是减而不是加?
当CClass同时继承IClass和IBaseClass两个抽象类时,编译器会按继承顺序把两个基类的子对象依次排布在CClass的内存中。如果实际继承顺序是先IClass、再IBaseClass,内存布局大概是这样:
[CClass起始地址] ├─ [IClass虚表指针] + 成员(总大小0x8) └─ [IBaseClass虚表指针] + 成员
当你通过IBaseClass的虚函数调用getter时,此时的this指针指向的是IBaseClass子对象的起始位置(也就是CClass起始地址+0x8的地方)。要拿到整个CClass对象的起始地址,自然需要this - 0x8——这不是访问成员,而是从基类子对象指针还原出完整的派生类对象指针。
正确处理类结构的方法
确定基类的内存顺序
从this - 0x8能还原到CClass起始地址,说明IClass的子对象占据了CClass的前0x8字节,IBaseClass的子对象在它后面。所以CClass的继承顺序必须是public IClass, public IBaseClass,不能反过来。验证基类大小
确认IClass的总大小是0x8——通常一个虚表指针占8字节,所以IClass可能只有虚表,没有额外成员变量。你可以通过虚表条目数量、成员变量布局来验证这个大小。调试验证
在调试器中定位一个CClass对象的内存:- 对比IClass类型指针和IBaseClass类型指针的数值,两者差值应该是0x8。
- 检查CClass的虚表,前半段应和IClass的虚表完全匹配,后半段和IBaseClass的虚表匹配。
修正类定义
按照正确的继承顺序编写类定义,示例如下:class CClass : public IClass, public IBaseClass { // 此处添加CClass自身的成员变量定义 };这样编译器生成的this指针调整逻辑就会和游戏二进制中的实现匹配,偏移异常问题就能解决。
内容的提问来源于stack exchange,提问作者Ibrahim Mohamed
相关产品推荐
相关产品推荐

