用 ImHex 逆向 FEZ 游戏的未知存档格式
Reverse Engineering Unknown File Formats with ImHex

多年来,面对如何逆向未知文件格式的提问,我通常只能建议查看反编译代码。这次,我将以游戏 FEZ 的自定义二进制存档为例,展示如何从零开始,利用 ImHex 的 Pattern Language 编写完整的格式定义。通过反编译 C# 编写的游戏代码,定位到 PCSaveDevice 和 SaveFileOperations 等关键类,我们逐步解析了时间戳、布尔标志以及七位编码的字符串序列。最终,这些发现被转化为 ImHex 中的结构化模式,让原本晦涩的十六进制数据变得清晰可读。
多年来,我无数次被问到同一个问题:如何逆向一个未知的文件格式?
HN 评论区
49- kstrauser
故事时间:大学时我在一家汽车旅馆值夜班。说“无聊透顶”都算轻描淡写了。有天晚上,我像往常一样在前台电脑系统里瞎捣鼓,结果找到了它的数据文件。实在没事干,我就用 BASIC 写了个小十六进制转储工具来探索这个文件。我注意到的第一件事是,客户名字之间的间隔正好是 N 个字节。哇哦,定长记录!接下来的大概一周,我都在逆向这个数据库文件格式。我会随意修改某个客户记录里的字段,然后去十六进制转储里看那条记录发生了什么变化,再更新我的笔记。
最后,我又写了个 BASIC 小程序来做数据分析,比如哪些客户在我们这消费最多,还能通过直接写入文件来自动修复拼错的名字(“这里写着 'Bb Jones',你是不是想写 'Bob Jones'?”)。
我的这些黑客操作还让我拿到了一笔相当不错的奖金。
- issung
我最终是在逆向 PS2 记忆卡格式时开始使用 ImHex 的,用于 https://ps2iodb.com。
这程序太棒了,而且口碑极好,以至于尽管我完全不懂逆向工程,还是会在 3-4 年前就毫不犹豫地选择它!顺便也要吹爆它使用的 GUI 库:https://github.com/ocornut/imgui
- truekonrads
我有几条简单的规则:
1) 熵是多少?这有助于判断是否加密或压缩。你可能需要解决这个问题?
2) 上下文是什么?应用是在特定上下文中开发的,上下文往往暗示了格式。如果是 C 语言?那就预期会有结构体。如果需要通过网络传输?那就预期会有游程编码。Python/JS?那就是 JSON 或 pickle。
3) 广义上讲,将数据读回内存的方式只有几种:固定布局、游程编码、终止符。ASN.1 就是个绝佳的案例研究,一旦你亲手写过一个 ASN.1 解析器,就没有什么文件格式能难倒你了。
- Noxwizard
我一直在寻找好用的十六进制编辑器。我试过几次 ImHex,但它不太符合我的需求,对于简单任务我更喜欢 HxD。它的 Pattern Language 挺酷的,我之前还没研究过。对于复杂任务,逆向过程并不总是像博客文章里那样线性的。主要问题在于,在我搞清楚之前,结构里往往会有大量空白。像 ImHex 或 Kaitai 这样的工具,虽然允许你在两个已知对象之间插入占位字段,但这有点烦人。010 Editor 允许你高亮并添加彩色书签,这多少能派上用场。我最终用于逆向内存数据结构的流程是:获取内存的十六进制转储,截图,然后放到 OneNote 里。这样我就可以画彩色框、高亮,并在旁边标注注释,说明这是什么或记录笔记。如果某个字段是指向另一个相关但未知结构的内存地址,我通常会截取那部分内存的简短转储,把截图放在同一页,并画个箭头指向它。这方法挺笨拙的,但我喜欢这种自由的形式。它基本上就是一个逆向工程笔记本,只是没有内置任何实用的逆向功能。如果有任何关于更好发现流程的想法或推荐,我很乐意听听。
- vivzkestrel
- 蠢问题:对于 .unr 文件,你有什么想法吗?
- 这个文件来自游戏《细胞分裂:断罪》(Splinter Cell: Conviction),是用定制的 Unreal 2.5 引擎制作的。
- 我既无法让 UE-Explorer 也无法让 UEViewer 正常工作。
- 我可以把文件发给你,我只是想知道如何修改其中的敌人 AI 生成类型。