
字节笔记本
2026年10月6日 · 约 11 分钟读完
反编译 Codex 桌面应用:用 AI 还原可读源码
Codex 桌面应用是 Electron 打包的 macOS 程序,全部前端代码都装在一个叫 app.asar 的归档文件里。里面的 JavaScript 经过压缩(minify)、打包(bundle)、混淆(obfuscate)三道工序:变量名变成 a、b、e1,函数挤成一团,人眼基本读不懂。开源项目 decode-codex 要做的,就是把这个过程反过来:用一组脚本加一个 AI agent,把混淆代码还原成命名清晰、结构可读的源码。
分工思路很清楚:解包、解析 AST、批量重命名这类机械活交给脚本;“这个函数到底在干什么、该叫什么名字”这类语义判断交给 AI agent。后者恰好是 AI 比人擅长的活,也是整个项目最聪明的设计。

准备工作
开始前需要备齐四样东西:
| 条件 | 原因 |
|---|---|
| macOS | Codex 是 Mac 桌面应用,解包脚本默认读取 /Applications/Codex.app |
| Codex 桌面 App | 反编译对象,需装在默认位置,可从 chatgpt.com/codex 下载 |
| Node.js | 解包脚本用 node 运行,还会调用 npx @electron/asar 和 prettier |
| Bun | 反混淆脚本是 TypeScript,需要 bun 执行 |
AI agent 不是必需品:项目里所有脚本都能手动执行,agent 的作用只是自动编排这些脚本并完成语义命名,你完全可以自己一步步敲命令。
先确认 Codex 装好了,终端跑一下:
ls /Applications/Codex.app/Contents/Resources/app.asar能看到文件就说明前置条件齐了。
第一步:解包 app.asar 到 ref 目录
克隆项目并安装反混淆脚本的依赖:
git clone https://github.com/JimLiu/decode-codex.git
cd decode-codex
cd .agents/skills/deobfuscate-javascript
bun install
cd ../../..社区普遍建议先把仓库 fork 到自己账号下再克隆:反编译闭源软件,自己玩自己的就好,别把还原出来的代码推回公共仓库。
解包由项目里的 codex-app-ref-refresh 技能完成。用 agent 跑,在项目根目录说一句:
用 codex-app-ref-refresh 从已安装的 Codex App 刷新 ./ref
或者直接手动执行脚本:
node .agents/skills/codex-app-ref-refresh/scripts/refresh-codex-ref.mjs这里有个安全细节必须注意:脚本会先删除再重建 ./ref。它有保护机制,只有目标解析为当前目录下的 ./ref 才会执行,不会误删别处,但你必须站在想让 ref 出现的目录里运行,通常就是项目根目录。第一次用强烈建议先跑 --dry-run 看一眼路径:
node .agents/skills/codex-app-ref-refresh/scripts/refresh-codex-ref.mjs --dry-run脚本还有两个实用参数:--skip-format 只解包不跑 Prettier,省时间;Codex 装在非默认位置时,用环境变量 CODEX_APP_ASAR 手动指定 asar 路径。
跑完之后,Web UI 代码在 ref/webview/ 下:入口是 index.html,主战场是 assets 目录里的一堆 JS 文件。此时代码已格式化、缩进正常,但变量名还是混淆的,需要第二步。
第二步:反混淆还原成可读源码
这是整个流程的核心,也是最烧 token 的一步。它把 ref/webview/assets 里打包压缩的 JS 还原成命名清晰、结构可读的代码,输出到 restored 目录,内部是一条多阶段流水线:
deobfuscate 反混淆 → smart-rename 智能重命名 → polish 润色 → 可选的带类型 .tsx 重写
机械活(解析 AST、拆 bundle、批量替换)由内置的 bun 脚本完成,语义活(判断函数职责、起有意义的名字)由 AI agent 完成。
用 agent 跑,在项目根目录说:
Use deobfuscate-javascript to restore ./ref
中文触发词也认:反混淆 ./ref,或者 deobfuscate ref/webview/assets。脚本都在 .agents/skills/deobfuscate-javascript/scripts/ 下,每个都是独立的 TypeScript 工具,正常交给 agent 自动编排即可,手动串联顺序会比较繁琐。
反混淆分两种深度:
| 深度 | 触发方式 | 产出 |
|---|---|---|
| 可读(默认) | 直接说“还原” | 可读、命名清晰的 JS/TSX |
| 深度/生产级 | 说 deep、full、production、深度、完整 | 额外做带类型 .tsx 重写、npm 依赖解析、完整依赖图编排、验收复审循环 |
想要最完整的结果,一定要用深度模式再配合 /goal:反混淆是逐文件啃的活,/goal 让 agent 循环跑到所有文件都还原完才停,否则还原不了几个文件就结束了。
处理范围默认是整棵依赖树:从 ref/webview/index.html 出发,自动找到应用入口,递归还原所有可达的本地代码块;只贴一个文件给它,就只还原那一个。
还原后的文件落在 restored 目录,有几个特点:命名有意义,不再是 a、b;按语义领域分子目录,而不是按打包后的 chunk 名;每个文件顶部有出处头注释,标明来自哪个原始 chunk;模块对应关系统一记录在 restored/IMPORT_MAP.json。只有整理完成的文件才会进 restored,脚本批量产出的中间产物先放在隐藏临时区,整理好了才提升上去。

完整流程一气呵成
把上面的步骤串起来,复制粘贴版:
# 0. 前置:装好 Codex App、Node、Bun
ls /Applications/Codex.app/Contents/Resources/app.asar
# 1. 克隆 + 装依赖
git clone https://github.com/JimLiu/decode-codex.git
cd decode-codex
cd .agents/skills/deobfuscate-javascript && bun install && cd ../../..
# 2. Skill 1:解包(先 dry-run 看路径)
node .agents/skills/codex-app-ref-refresh/scripts/refresh-codex-ref.mjs --dry-run
node .agents/skills/codex-app-ref-refresh/scripts/refresh-codex-ref.mjs
ls ref/webview/assets/
# 3. Skill 2:反混淆(在支持 skill 的 agent 里)
# Use deobfuscate-javascript to deep restore ./ref
# /goal all files in ref/webview/assets restored to restored/常见的坑
- 目录不对会出事。Skill 1 会删除 ./ref,必须站在项目根目录跑,第一次先 --dry-run。
- 很烧 token。整棵树反混淆加深度模式可能消耗大量 API 调用,动手前先设消费上限,或者先拿单个文件试跑。
- 质量取决于模型能力。语义命名是 AI 干的,模型越强还原越准;哪个模型反编译效果最好,目前还是个开放问题。
- /goal 是关键开关。没有它让 agent 循环跑到完成,单次运行还原不了几个文件就停。
- Codex 更新后要重跑 Skill 1,让 ref 和当前安装的版本保持对齐。
顺便理解循环工程
decode-codex 恰好是循环工程理念的活样本:两个技能目录里的 SKILL.md 把“怎么解包、怎么反混淆”固化成可复用知识;/goal 充当调度器,让 agent 循环跑到全部完成;深度模式的验收复审循环是典型的生成器与评估器分离;IMPORT_MAP.json 和出处头注释提供跨轮记忆;中间产物先放隐藏临时区、整理好才提升,则是一种隔离设计。想练手循环工程,批量反混淆一堆文件是个现成的实验场。
快速排错
| 问题 | 解决 |
|---|---|
| app.asar not found | 确认 Codex 装在 /Applications/Codex.app,或用 CODEX_APP_ASAR 指定路径 |
| bun: command not found | 安装 Bun:curl -fsSL https://bun.sh/install | bash |
| node: command not found | 安装 Node.js:brew install node |
| Skill 1 删错目录 | 你不在项目根目录,先 cd 到克隆下来的 decode-codex 再跑 |
| 还原的文件很少 | 没用 /goal 加深度模式,补上 deep/full/production 关键词 |
| token 烧得太快 | 先只贴一个文件试跑,流程通了再整树跑,并设 API 消费上限 |
法律边界,再说一遍
项目作者明确声明:本项目仅用于对你已安装软件的个人学习与互操作性研究。解出的代码版权归 OpenAI 所有,请遵守 Codex 应用的许可协议与服务条款,不要分发解出或还原后的代码。自己研究可以,公开传播不行。
本文整理自开源项目 decode-codex 的 README 与 SKILL.md,项目仍在活跃更新,具体脚本参数以仓库最新版本为准。



