news 2026/4/30 14:19:15

IDA Pro逆向实战:从一堆int到清晰结构体,我是如何修复一个C++游戏对象内存布局的

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
IDA Pro逆向实战:从一堆int到清晰结构体,我是如何修复一个C++游戏对象内存布局的

IDA Pro逆向实战:从一堆int到清晰结构体,我是如何修复一个C++游戏对象内存布局的

当面对一个被IDA Pro反编译出来的C++游戏二进制文件时,最令人头疼的莫过于看到满屏的field_0field_8这样的无意义字段名。这些自动生成的名称不仅难以理解,还掩盖了程序原本的逻辑结构。本文将分享我在逆向分析一个类似"大富翁"的棋盘游戏时,如何从这些杂乱无章的字段开始,一步步还原出接近源代码的结构体布局的完整过程。

1. 逆向分析的起点:从内存分配推测结构体大小

逆向工程往往从最基础的线索开始。在这个案例中,我首先注意到程序中频繁出现的new操作:

v0 = operator new(0x70uLL); sub_2602(v0, "Arbington", 0LL, 0LL, 0LL, 0LL); qword_A1C0 = v0;

这段代码透露了几个关键信息:

  1. 分配的内存大小为0x70字节
  2. 分配后立即调用了一个看起来像构造函数的函数
  3. 返回的指针被存储在一个全局变量中

基于这些观察,我首先在IDA中创建了一个大小为0x70的初步结构体:

00000000 struc_1 struc ; (sizeof=0x70, align=0x8) 00000000 field_0 dq ? 00000008 field_8 dq ? [... 省略类似字段 ...] 00000068 field_68 dq ? 00000070 struc_1 ends

重要技巧:在初步创建结构体时,我选择使用dq(8字节)作为字段类型,因为:

  • 目标程序是64位的
  • 8字节对齐在64位程序中很常见
  • 如果类型假设错误,IDA会在伪代码中产生明显的异常,便于后续修正

2. 结构体字段的逐步修正

将初步创建的结构体应用到变量上后,我开始观察伪代码的变化。特别是对构造函数sub_2602的分析揭示了多个需要修正的字段:

LODWORD(a1->field_48) = -1; LODWORD(a1->field_60) = a4; HIDWORD(a1->field_60) = a5; LODWORD(a1->field_68) = a4/2;

这段代码中出现的LODWORD/HIDWORD宏表明IDA正在将64位字段拆分为两个32位部分进行操作。这提示我们需要将对应的dq类型字段拆分为两个dd类型字段:

00000048 field_48 dd ? 0000004C field_4C dd ? 00000060 field_60 dd ? 00000064 field_64 dd ? 00000068 field_68 dd ? 0000006C field_6C dd ?

修正后,伪代码变得更加清晰:

a1->field_48 = -1; a1->field_60 = a4; a1->field_64 = a5; a1->field_68 = a4/2;

3. 从程序逻辑推断数组和字段用途

进一步分析构造函数中的循环操作,我发现对field_4C的访问模式明显是在操作数组:

for ( i = 0; i <= 4; ++i ) a1->field_4C[i] = a3 / 2 * (i + 1);

于是我将field_4C修改为包含5个元素的数组:

0000004C field_4C dd 5 dup(?)

这个修改使得伪代码中的数组访问语义更加明确,为进一步理解程序逻辑奠定了基础。

4. 全局变量与交叉引用分析

游戏中多个全局变量之间存在明显的关联:

sub_28BA(&unk_A3C0, 0LL); sub_28BA(&unk_A440, 1LL);

通过计算地址差(0x80)和交叉引用分析,我确定这些全局变量属于同一类型,并据此创建了第二个结构体struc_2,大小为0x80字节。

实用技巧:在修改全局变量类型时,我养成了以下习惯:

  1. 先备份IDA数据库
  2. 使用虚拟机快照功能
  3. 记录每次修改的内容,便于回退

5. 从输出字符串还原有意义的字段名

程序中的输出语句是还原字段名称的宝贵线索:

printf("your money: %d\n", (unsigned int)global_struct1.field_64); printf("%s throw %d, now location: %d, %s\n", v2, v4, v1, v0);

通过这些输出,我可以有把握地将字段重命名:

  • field_64money
  • field_68location

这种基于字符串的命名方法极大地提高了代码的可读性。

6. 虚函数表分析与继承关系重建

在分析类的虚函数时,我遵循了一套系统的方法:

  1. 定位虚表地址(通常位于.data.rel.ro段)
  2. 创建虚表结构体,包含所有虚函数指针
  3. 修改对象结构体,使其第一个字段指向虚表
00000000 vtable1 struc ; (sizeof=0x28, mappedto_11) 00000000 print dq ? 00000008 eat dq ? 00000010 sleep dq ? 00000018 work dq ? 00000020 day dq ? 00000028 vtable1 ends

通过分析虚表内容,还能推断出类之间的继承关系。例如,当构造函数中先调用基类构造函数再初始化虚表时,可以确定继承层次。

7. 实战中的经验与教训

在整个逆向过程中,我总结出几个关键点:

  1. 循序渐进:不要试图一次性还原整个结构体,应该从最确定的字段开始,逐步完善
  2. 交叉验证:通过多个函数的交叉引用来确认字段的类型和用途
  3. 命名规范:采用一致的命名规则(如m_前缀表示成员变量)
  4. 注释记录:为每个字段添加注释,记录推理过程和依据

特别注意:当遇到如下代码时:

*(_DWORD*)(qword_A1C0[global_struct1.location]->field_40 + 100) += v4;

应该:

  1. 检查field_40的所有交叉引用
  2. 确定它指向的结构体类型
  3. 创建相应的结构体定义

修正后的代码更加清晰:

qword_A1C0[global_struct1.location]->field_40->money += v4;

逆向工程既是一门科学,也是一门艺术。通过这次对C++游戏对象的逆向分析,我不仅还原了程序的结构,更深入理解了开发者当初的设计思路。每当一个模糊的field_xx变成有意义的player.moneyboard.location时,那种成就感是难以言表的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 14:17:50

基于PLC的小型自动化分生产线控制系统设计

摘 要 随着国内饮料市场的持续扩张与消费者对产品质量要求的提升&#xff0c;国产饮料瓶生产行业正面临自动化升级的迫切需求。传统生产模式因效率低、精度不足等问题&#xff0c;已难以满足现代化生产标准。为此&#xff0c;本文聚焦于基于PLC&#xff08;可编程逻辑控制器&am…

作者头像 李华
网站建设 2026/4/30 14:16:05

在Windows上高效安装Android应用的完整指南

在Windows上高效安装Android应用的完整指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否需要在Windows电脑上安装Android应用&#xff1f;APK Installer为你提…

作者头像 李华
网站建设 2026/4/30 14:12:43

终极指南:如何用Legacy-iOS-Kit让你的旧iPhone/iPad重获新生

终极指南&#xff1a;如何用Legacy-iOS-Kit让你的旧iPhone/iPad重获新生 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit…

作者头像 李华
网站建设 2026/4/30 14:12:27

Umi-OCR的5个隐藏功能:让文字识别效率提升3倍的终极指南

Umi-OCR的5个隐藏功能&#xff1a;让文字识别效率提升3倍的终极指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内置多国语…

作者头像 李华
网站建设 2026/4/30 14:09:29

从 L1 到知识库:Agent 的四级记忆,竟是 CPU 缓存的金字塔翻版?

CPU 用 L1/L2/L3 缓存 主存&#xff0c;让数据离计算核心越来越近。 你的 Agent 用短期/会话/用户/知识四级记忆&#xff0c;让信息离推理越来越近。 一个在硅片上&#xff0c;一个在代码里&#xff0c;结构却惊人相似 —— 都是 越快的层级容量越小&#xff0c;越慢的层级容量…

作者头像 李华
网站建设 2026/4/30 14:09:24

终极指南:如何用 smcFanControl 让 Intel Mac 运行更凉爽更安静

终极指南&#xff1a;如何用 smcFanControl 让 Intel Mac 运行更凉爽更安静 【免费下载链接】smcFanControl Control the fans of every Intel Mac to make it run cooler 项目地址: https://gitcode.com/gh_mirrors/smc/smcFanControl smcFanControl 是一款专为 Intel …

作者头像 李华