2

考虑这段代码:

struct A {
    int64 member;
    int32 member2;
    virtual void f();
};

struct B {
    int16 member3;

    virtual void b();
};

struct C : A, B {
    virtual void b() override;
};

我有兴趣找到 in 的偏移BC。以前使用其他没有虚拟继承的结构,并且offsetof第一个成员只有一个基类似乎可以工作。我已经反编译了一些代码(在 IDA 中),基类在这里很好地突出显示(十六进制):

截屏

在函数中,这些确切的基类偏移量用于通过将偏移量添加到(通过转换为 a )将void*'s 转换为派生类。结构体,和类似于编译代码中的结构体,包括具有虚函数的类和多个基类。void*char*ABC

我的问题是他们是怎么做到的,我该怎么做?我尝试过类似i32 offset = (i64)((B*)((C*)NULL));但没有运气的东西。

4

1 回答 1

2

我尝试了以下方法,它奏效了:

(char*)(B*)(C*)0x100 - (char*)(C*)0x100

它转换C*B*; 这应该可以完成工作。其余的都是支持。我使用了任意数字0x100;它似乎适用于除 0 以外的所有数字。

为什么它对 0 不起作用:它看到一个类型为 的空指针C*;要将其转换为类型的空指针B*,它仍应为空。一个特例。

当然,这使用了未定义的行为。在我的简短测试程序中,它似乎在 Visual Studio 中工作;不保证它会在其他任何地方工作。

于 2021-11-25T18:14:49.623 回答