Ghidra中C++派生类(基类位于0x0)虚表类型覆盖问题问询
关于Ghidra中C++继承类虚表识别的优化方案问题
我是Ghidra与逆向工程新手,已学习指定视频教程与黑帽文档,目前遇到以下技术问题:
当存在包含成员变量与虚函数的Base基类,以及继承自Base且基类位于自身0x0偏移位置的Derived派生类时,派生类的vTable与基类vTable的识别出现冲突。
相关代码与内存布局
基类Base代码:
class Base { int var1; int var2; public: virtual void virtual_func_1(void); virtual void virtual_func_2(void); };
Base内存布局:
class Base size(12): +--- 0 | {base_vTable} 4 | var1 8 | var2 +---
派生类Derived代码:
class Derived: public Base { int var3; public: void virtual_func_3(); };
Derived内存布局:
class Derived size(16): +--- | +--- (base class Base) 0 | | {base_vTable} 4 | | var1 8 | | var2 | +--- 12 | var3 +---
构造函数反编译代码:
void __thiscall Derived::Derived_constructor(Derived* this) { Base::Base_constructor((Base*) this);//基类位于Derived的0x0位置 this->var3 = 0; (this->base).base_vTable = &PTR_FUN_004af9f4;//此处实际为Derived vTable,却被识别为BaseVtable类型 } void __thiscall Base::Base_constructor(Base* this) { this->var1 = 0; this->var2 = 0; this->base_vTable = &PTR_FUN_004bf966;//Base vTable地址 }
现有两种结构体方案的局限
我尝试了两种结构体定义方案,但都存在明显局限:
- 方案1:嵌套基类的结构体定义
该方案可同步更新所有派生类的基类成员,但无法识别派生类新增/重写的虚函数。Derived{0x0: Base baseClass; 0xc: int var3;}; //(Case 1) - 方案2:平铺所有成员的结构体定义
该方案能完整识别派生类虚函数,但基类成员无法同步更新,每次基类成员有调整都需要手动修改所有派生类结构体。Derived{0x0: DerivedVtable* derived_vTable; 0x4: int var1; 0x8: int var2; 0xc: int var3;}; //(Case 2)
问题诉求
是否存在一种方案,既能采用方案1的嵌套结构(保证基类成员同步更新),又能将派生类0x0位置的基类部分的虚表解释为DerivedVtable*,同时保留Base类中0x4/0x8偏移的var1/var2成员?拆分基类成员会导致类数量翻倍,有没有更优的解决方式?
内容的提问来源于stack exchange,提问作者nullpointerException101
相关产品推荐
相关产品推荐

