【发布时间】:2022-01-03 22:36:48
【问题描述】:
考虑以下代码:
struct A {
int64 member;
int32 member2;
virtual void f();
};
struct B {
int16 member3;
virtual void b();
};
struct C : A, B {
virtual void b() override;
};
我有兴趣在C 中找到B 的偏移量。以前使用其他没有虚拟继承的结构,并且第一个成员只有一个基类offsetof 似乎可以工作。我已经反编译了一些代码(在 IDA 中)并且基类在这里很好地突出显示(十六进制):
在函数中,通过将偏移量添加到void*(通过转换为char*),这些精确的基类偏移量用于将void* 转换为派生类。结构体A、B和C与编译后的代码中的结构体类似,包括具有虚函数的类和多个基类。
我的问题是他们是怎么做到的,我该怎么做?我尝试过类似i32 offset = (i64)((B*)((C*)NULL)); 但没有运气。
【问题讨论】:
-
“虚拟基类”没有出现在这里。你有虚拟成员的基地,而不是虚拟基地。如果您有虚拟基地,答案将是“没有唯一的答案”
-
谁是“他们”,他们是否有权访问该程序的调试符号?
-
你的权利,意思是虚拟成员函数。它是一个游戏引擎,是的,因为如果这就是你的意思,我有 PDB。查找偏移量的代码将在编译时生成,因为我可以在可执行文件的数据段中看到原始偏移量
标签: c++ class virtual-table