一句话总结:CE 只能告诉你「某个值在哪个地址」,ReClass 让你看到「这个地址周围整块内存长什么样」——本篇用它把玩家对象还原成结构体,直接导出 C++ 代码,把逆向成果变成可维护的偏移表。
前两篇走完了「扫描」和「防守视角」。这篇补上进攻侧欠缺的那块:结构还原。
为什么需要它?CE 找血量,你得到一个地址;但玩家对象里还躺着坐标、阵营、骨骼矩阵、背包指针。逐个用 CE 扫,一晚上能扫出三四个就不错了。ReClass 的思路完全不同:你给我一个地址,我把这一整块内存按结构体展开给你看。
ReClass 的核心概念:一切都是结构体
打开 ReClass,界面就是一个树状表格。第一行定义一个「类」(Class),往下展开字段。每个字段有类型和偏移,值实时从目标进程读。指针类型可以继续展开成子结构,于是整个对象图就一层层铺开了。
理解它只需要一句话:ReClass 不猜值,它把内存按你定义的布局切片,然后显示每一片的内容。你定义得对,看到的就是真实结构;定义错了,看到的就是乱码——所以它本质是个「视图工具」,判断还得靠人。
图 1:同一块内存的两种视角,左边是字节,右边按类型切开后才有语义
实战:还原一个玩家对象
演示对象仍是虚构靶场。假设 CE 找到一个玩家实例地址 0x1A2B3C40(堆对象,每次启动都会变)。步骤如下:
第一步,建类。新建 Class,地址填 0x1A2B3C40。ReClass 会立刻显示前几百字节的内容,大多是零和随机值,正常。
第二步,看开头。x64 程序的对象开头通常是 vtable 指针(8 字节),值形如 0x7FF6xxxxxxxx,指向模块的只读段。看到了就说明这确实是个类实例,而不是一块普通数据。在 ReClass 里把第一个字段设成 ClassPtr 类型,它会把 vtable 的内容也展开——一张函数指针表,顺序固定,这本身也是识别对象类型的依据。
第三步,铺字段。根据已知信息逐个验证:
| 偏移 | 类型 | 字段 | 验证方式 |
|---|---|---|---|
| 0x00 | 指针 | vtable | 指向模块只读段 |
| 0x08 | char* | 昵称 | 展开后是可读字符串 |
| 0x100 | int32 | 血量 | 挨打后数值下降 |
| 0x104 | int32 | 最大血量 | 通常是常量 100 |
| 0x138 | float[3] | 坐标 | 移动后三个值连续变化 |
| 0xF4 | int32 | 阵营 | 取值 2 或 3 |
| 0x114 | float[3] | 速度 | 移动时非零 |
| 0x26A8 | 指针 | 骨骼矩阵 | 展开后是 3×4 矩阵数组 |
每个字段都要动一下游戏再回来看值,这是唯一可靠的验证方式。凭偏移猜字段,十个里能错五个。
第四步,数组化。实体列表本质是「指针数组 + 步长」,在 ReClass 里用数组节点表示:基址 + 索引 × 0x10,每个元素再展开成上面的类。这样整条实体列表就能像调试器里一样浏览,找敌人时不用来回切窗口。
第五步,导出。ReClass 自带导出功能,能生成 C++ 结构体声明。导出的代码稍微整理(改名字、补类型)就能直接用在绘制系列的内存读取里:
struct Player {
void* vtable; // 0x00
char* name; // 0x08
char pad0[0xF8]; // 0x10 - 0x107 未知区
int32_t hp; // 0x100
int32_t maxHp; // 0x104
int32_t team; // 0xF4(注意顺序:靶场布局里 team 在 hp 前面)
Vec3 pos; // 0x138
Vec3 velocity; // 0x114
void* boneMatrix; // 0x26A8
};
结构体一定要加 #pRAGma pack(push, 1) 或者用显式偏移读取,别指望编译器布局跟游戏一致——这是新手最容易翻车的地方。
三个必须知道的事
地址是堆对象,重启就变。ReClass 里填的 0x1A2B3C40 只在当前进程有效。真正要固化的是「基址 + 偏移链」,ReClass 只是帮你把结构看清楚,链还得用 CE 的指针扫描找。
别追求 100% 还原。一个玩家对象可能几百字节,中间大段是未知区(技能冷却、状态机、碰撞体)。只还原你要用的字段就够了,剩下的留空数组占位,别硬猜。
多态对象要看 vtable。同一个数组里可能混着不同子类(玩家、NPC、投影物),字段布局不一样。看 vtable 指针的值来区分类型,比按字段猜靠谱得多。
三篇小结
逆向这条线就到这里:CE 负责找,ReClass 负责看结构,反作弊那篇讲清楚了为什么这些操作在在线游戏上不可行。三篇合起来,配合前面的 C++ 系列(读取、投影、骨骼),一个完整的「找 → 读 → 画」链路就通了。
下一步想深入,两个方向:一是学汇编和调用约定,能读懂 CE 里的「谁访问了这个地址」;二是学调试器(x64dbg),动态跟踪比静态猜结构高效得多。
老规矩,所有练习留在单机靶场。

发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。