用 Codex 逆向恢复丢失的源代码:5 天实战记录

本文转载自 宝玉 (@dotey)Twitter


丢过源代码吗?那种感觉太糟糕了。

几年前,我做了一个 Electron 绘图应用。然后源代码丢了。只剩下编译后的版本。

我想过从头重写,但一想到要重新实现所有那些细节就觉得太累了。后来我看到 OpenAI 的博客说他们用 Codex 在 28 天内做出了 Sora Android 应用,我有了一个想法:编译后的代码还在,能不能让 Codex 逆向工程把它恢复成源代码?

五天后,我拿到了可运行的 TypeScript 源代码。下面是具体过程。


1. 从混淆代码中提取模块结构

Electron 应用把所有东西打包进一个 asar 文件。第一步是让 Codex 从里面提取 JS 和 CSS 文件。

提取出来的 JavaScript 是编译过、混淆过的。变量名都是 a、b、c。函数调用缠绕成不可读的链式调用。人看了会头晕,但对 Codex 来说,这只是另一段需要分析的代码。

我让 Codex 分析主要的 JS 文件,列出模块。它居然做到了。原始的模块名已经没了,但根据代码结构和逻辑模式,Codex 重建了一个相当完整的模块清单。

有了这个清单,我让 Codex 制定恢复计划:把每个模块从混淆的 JavaScript 转换回可读的 TypeScript。模块清单变成了检查表,每完成一个就打个勾。


2. 第一个问题:Codex 想"证明"代码能跑

恢复过程早期,我遇到了一个麻烦。

Codex 有个本能:它特别想验证生成的代码真的能运行。为了让代码能编译成功,它会悄悄跳过它认为"暂时不必要"的部分。

写新代码时,这是个好习惯。恢复旧代码时,这是灾难。我需要的是完整恢复,不是一个能编译的最小子集。

解决方法很简单。我在 CODEX.md 里加了一条严格的规则:

“逐个恢复模块。不要担心代码能不能编译。”

这一行改变了一切。Codex 不再纠结于构建错误,开始忠实地一个个恢复模块。


3. 第二个问题:上下文满了,记忆消失

Codex 的上下文窗口是有限的。当时它跑一会儿就会停下来,我得不断输入"continue"。如果开新会话,就得重新解释整个任务。

问题是:新的 Codex 会话不知道之前发生了什么。你得从头解释整个背景。

我的解决方案是建立一个**“外部记忆"系统**:

  • 在 CODEX.md 中描述整体任务背景
  • 创建一个 PLAN.md 文件来追踪恢复计划和当前进度
  • 在 CODEX.md 里加一条规则:总是先读 PLAN.md,每次工作完后更新 PLAN.md

这样,每个新会话只需要输入"continue”。Codex 会自动读取进度文件,从上次停下的地方继续。

最后我连手动操作都懒得做了。我让 Codex 写了一个脚本,检测上下文快满了就自动开新会话,自动输入"continue"。

于是我就看着它跑。隔一会儿检查一下,又多完成了几个模块。


4. 把零件组装成可运行的应用

几天后,所有模块都恢复成了 TypeScript 文件。但这些还只是散落的零件。

下一步:把它们组装成一个真正能跑的 Electron 应用。我让 Codex 用 Electron Forge 脚手架创建新项目,然后把恢复的代码放进去。

这时候,我重写了 CODEX.md 和 PLAN.md,解释如何编译和测试。然后同样的流程:自动开新会话,continue,更新 PLAN。

接下来发生的事情几乎是魔法。

我看着 Codex 持续修复编译错误。它会检查原始编译代码来验证逻辑,运行 npm start 测试应用,发现问题,修复,继续。

模块基本能编译后,我和 Codex 一起写了覆盖主要用户流程的集成测试。测试准备好后,又是同样的循环:让 Codex 生成代码,跑测试,修问题。


5. 五天后

第五天结束时,我有了一个带完整源代码的 Electron 应用,而且真的能跑。

说"完美恢复"有点夸张。还有一些运行时 bug。一些边缘功能的行为和以前略有不同。但主要功能都在,结构清晰,最重要的是——我终于可以改代码了


6. 我学到了什么

很多人说 Codex 不需要外部循环机制。我觉得不对。

对于长时间运行的任务,Codex 需要类似 ralph-loop 插件这样的东西。否则你就会像我一样,自己写脚本定期开新会话输入"continue"。这应该是内置功能。

还有几个教训:

计划和检查表对长任务至关重要。 每次工作完必须更新进度。如果上下文断了、进度没保存,之前的工作就白费了。

给 Codex 验证方式同样重要。 它能自动修 bug,唯一原因是它能跑 npm start 看结果,跑测试检查正确性。没有验证手段,Codex 只能盲写。

有时候你需要告诉 Codex 什么不该做。 那条"不要担心编译"的规则,让 Codex 解放出来,专注于真正重要的事。


总结

OpenAI 的博客讲的是用 Codex 从头做一个生产应用花了 28 天。我的故事是反过来的:用 Codex 逆向工程,把丢失的代码库恢复成源代码,花了 5 天。

方向不同,但核心方法论一样:

  • 把 Codex 当作一个能力很强但需要清晰指令的队友
  • 建立外部记忆系统来保持连续性
  • 提供验证方式让它能自我纠正

原文作者:宝玉 (@dotey)

如果这篇文章对你有帮助,欢迎请我喝杯咖啡,支持我继续创作更多内容。

Buy me a coffee