给定 C++ 中的内存布局,重新创建未记录的结构/类的“正确”方法?

逆向工程 x86 C++
2021-06-26 23:20:24

首先,我承认这是非常极端的自以为是,但我想强调这更多的是一种可能性,因为默认值的一些缺点只是写下事物的偏移量。

我做了很多逆向工程,然后我编写 C/C++ 代码来混淆我所学到的东西。假设有一个这样的类,代表一个怪物:

OFFSET  SIZE    VALUE
0       8       Pointer to methods
1280    4       X coordinate
1284    4       Y coordinate
128C    4       Z coordinate
1400    4       Health

例如,其中*(float*)((uint8_t*)obj + 0x1280)将给出 X 坐标。类的其余部分是未知的,唯一已知的方法是*(uint32_t*)((uint8_t*)*(uint32_t*)obj + 0xC),它只是设置健康。

这些类型的类可以非常频繁地更新,这使得仅仅记录不同事物的偏移量变得非常烦人。我看到有人建议用 just 创建一个填充类uint8_t[next off - start],但即使这样也感觉很尴尬。

现在我能想到的最好的事情是为访问其成员并自动确定偏移量的对象的不同方法创建一堆不同的字节扫描(不包括偏移量),但仍然如此。

我的问题是,虽然我实际上并不介意更新本身,但我的代码看起来很糟糕我有效地将这些对象视为漂浮的整数,并有一堆分散的函数像对象一样对它们进行操作,但实际上它们不是。

有没有一种“正确”的方法来定义一个带有“建议”偏移量的对象,有或没有库,无论如何,让干净的代码处理像这些没有记录的和大部分未知的对象的体面方法是什么?

1个回答

您可以创建一个指针结构并在运行时初始化它们。在某些情况下,也可以为数组添加别名。

如果使用填充结构,请注意字段的编译器对齐。