ARTICLE · 1323054
软件只说「文件无效」,REA 能帮你查到什么?
同事发来一份账本,你点了导入,软件只说「文件无效」。回消息时,有两种写法。「麻烦再发一遍。」或者「麻烦按旧格式导出一份。」光靠手上的软件和账本,能不能查清该发哪一句?
我用一个自己编译的 Windows 小程序模拟了这种情况。它扮演手头那个只认旧格式的导入器。我喂给它两份后缀相同的账本,里面都是 18、24、42 这三笔。第一份导入成功,报出「3 笔,合计 84」。第二份只回 Invalid file.,也就是「文件无效」。
两份账本暂时放一边。要弄明白这句话,我先查说出这句话的软件。
先找到谁说了「文件无效」
这次把导入器编译好的 .exe 交给 Codex,问它一件事。程序在什么条件下会说「文件无效」?账本留在手边,等查到具体条件,再拿来核对。
Codex 是对话里的助手,负责把这个问题一步步追下去。REA 是接给它用的本地分析工具,让它能打开编译好的程序、查看里面的代码线索。它的开源仓库在 GitHub,叫 morluto/rea,全名 Reverse Engineer Anything。
REA 先识别出这是一个基于 .NET 的程序。这类程序编译以后还保留着一些内部名字。REA 把这些名字和调用关系列了出来。程序入口先读取文件,接着调用一个叫 AcceptsHeader 的检查。
这个名字可以理解成「这份文件的开头,我认不认」。把文件开头的几格想成一个小封面,软件可以先看它是哪种文件、按哪一版格式写的。接下来就查这段代码到底认哪些值,以及它说「不认」以后,软件会做什么。
它先看文件的前五个字节
为了看清那段判断,我让 REA 调用一个叫 ILSpy 的工具。ILSpy 根据编译成品重建出可读代码,REA 把它带回对话。我从里面读到了两处能接起来的判断。
第一处在程序入口。检查失败,软件就打印「文件无效」并停下。第二处是检查本身。它要求文件至少有五个字节,前四个写着 LDGR。检查版本的那句是 data[4] == 1。程序从零开始数,这句问的是「第五个字节等不等于 1」。
前四个像文件的身份标记,告诉软件「这是账本」。第五个才是格式版本。这样就有了一个可以直接回去核对的问题。两份账本的第五个字节,分别是什么?
能打开的那份 以 LDGR开头,第五个字节是01。打不开的那份 也以 LDGR开头,第五个字节是02。
我直接读了两份账本,从头到尾只有这一处不同,后面的三个金额连字节都一样。再回到导入器的原始文件,我也核对了检查版本的那几条指令。这份账本卡在导入器只接受版本 1。 到这里,报给同事的情况可以从「麻烦再发一次」变成「麻烦按旧格式导出一份」。
同一句提示,还能是另一回事
我另外做了第三份账本。这次保留版本 01,只把开头第一个字母从 L 改成 X。导入器还是说「文件无效」。
把两次失败放在一起看,处理办法就分开了。版本 2 的那份要找兼容的导出方式。开头标记被改坏的那份,应该先核对来源,必要时拿一份完好的副本。真实文件的版本还可能决定后面每一笔数据怎么写,需要由导出工具生成对应格式。这次的两份对照刻意让金额部分一样,是为了单独验证版本检查。
这是我在这次实验里想从 REA 得到的东西。一句含糊的提示,最后能落在「导入器读了文件开头的哪一格,拿它和什么比」。工具返回的代码能帮我把范围缩到那里。两份文件的原始字节,以及原程序实际给出的结果,则让我能把这句话写进排障记录。
这个 GitHub 仓库适合怎么用
REA 本身可以从命令行调用,也可以通过 MCP 接给 Codex 这类助手。MCP 在这里就是助手调用本地工具的接口。给助手一个你有权检查的文件,再给一个具体问题,比如「这句提示在什么情况下出现」,就有了第一条线索。
选哪种分析工具,要看手里的程序是什么。这次的 .NET 样本用 REA 读取结构,再用 ILSpy 还原可读代码。我之前查另一个 Windows 原生程序时,REA 接的是 Ghidra。对使用者来说,两次都从 Codex 对话发起,真正读程序的工具随文件类型变化。
截至 2026 年 11 月 6 日,公开发布版是 rea-agents 6.8.0。安装文档给出的起点是 npx rea-agents setup,完成配置后重启助手。想做文中这种 .NET 代码还原,还需要按文档给 REA 配好 ILSpy。
下一次再看到一句「文件无效」,我会先留下一个能打开的样本和一个打不开的样本。把软件和原话交给助手之后,我想知道三件事。软件读了哪个值?为什么这份文件没过?我现在该找谁做什么?
资料
GitHub 仓库 morluto/rea(https://github.com/morluto/rea)
同系列的 Windows 原生程序排障视频(https://www.bilibili.com/video/BV1Ad486hEsi/)















































































