好久没写博客了。
去年开始,工作里会频繁接触到 JS 逆向,这几天又在玩 Codex,就想着:能不能做个 skill,让 AI 去干一部分 JS 逆向的活,当然这版只算是体验品,真要当作生产力起码得在工作中覆盖使用一段时间才行。

这是仓库: https://github.com/14u9h/js-url-auto-reverse

先说结论:如果 token 成本能接受,用 Codex 做 JS 逆向是可行的。至少对渗透测试里常见的前端加密场景,已经够用了。

安装 Codex

1、先安装 Node.js:https://nodejs.org/zh-cn
2、使用 ZCF(推荐):npx zcf,然后输入 1 选项先安装 Codex
3、或者 npm 安装 Codex:npm install -g @openai/codex

建议用 ZCF,能引导式配置第三方模型供应商 API,也方便装 MCP(这个很重要)。

Skill 是什么

可以把它理解成“可复用的工作流 + 自动化脚本入口”。
说白了就是什么时候该做什么、先后顺序怎么走,AI 调用 skill 时就按写好的流程执行。

下面是 Codex 根据我的要求,以及公开的 JS 逆向方法,给出的带脚本 Skill:js-url-auto-reverse

目录结构

js-url-auto-reverse
├── SKILL.md                        # 技能主定义(触发条件、模式、流程、边界)
├── agents/openai.yaml              # UI 元数据
├── references
│   ├── dynamic-mode-guidelines.md  # 动态模式触发条件与限制
│   ├── hook-templates.js           # 运行时 Hook 模板
│   ├── manual-fallback.md          # 自动失败时人工兜底流程
│   ├── replay-validator-guide.md   # 重放验证使用说明
│   ├── static-audit-checklist.md   # 静态审计检查项
│   └── workspace-venv-policy.md    # 仅允许工作区虚拟环境策略
├── scripts
│   ├── fetch_js_from_url.py        # 抓取 HTML/JS/inline/dynamic import/worker/sw/wasm/sourcemap
│   ├── deobfuscate_basic.py        # 基础去混淆
│   ├── locate_js_candidates.py     # 自动候选定位(显式打分)
│   ├── static_source_sink_audit.py # Source-Sink 静态审计与置信度
│   ├── advanced_reverse_analysis.py# 高级分析(反调试/加密原语/指纹/WASM)
│   ├── dynamic_capture_playwright.py # 动态捕获(Hook/控制台/CDP断点暂停 + summary-only摘要输出)
│   ├── replay_validator.py         # 重放验证(adapter + vectors)
│   ├── run_js_reverse_pipeline.py  # 总控入口(static/dynamic/auto + budget-level + force-dynamic/force-cdp + verbose-output)
│   └── run_regression_tests.py     # 回归测试总入口
└── tests/cases
    ├── static-basic
    ├── dynamic-import
    └── mini-obfuscated

为什么要做这个

做过逆向的人都知道,最耗精力的不一定是“算法本身”,而是前面的定位和筛选:文件太多、chunk 太碎、入口太散、环境太杂。

这个 skill 的价值就在这:
把重复劳动抽成固定流程,让你把注意力集中在真正要判断的地方,比如:

  • 这条链路到底是不是加密链路
  • 这个 key 是硬编码、派生,还是服务端传递
  • 加密函数到底在哪个文件、哪一段调用链

这套流程怎么跑

总控会先做静态分析,再按证据情况决定是否进入动态流程,默认策略是:

  • 静态 -> Hook 采集 -> (必要时) CDP 断点暂停
  • 默认 budget-level=low,优先省成本
  • 只有 Hook 证据不够、Hook 失败,或你强制要求时,才升级到 CDP

另外,输出默认是压缩摘要,完整日志会落盘在 runs/ 目录。只有排障时,才建议开 --verbose-output,避免 token 爆炸。

实测感受

我自己做了 4 次测试(2 次站点:1 靶场 + 1 实站,2 次 JS 逆向题),都能产出可用结果。

用的时候直接在 Codex CLI 提需求即可。静态证据不足时,它会按策略自动升级动态采集(前提是 Playwright 依赖按文档装好):

使用 js-url-auto-reverse 逆向站点 httpx://XXXXXXXX:8080/#/login,得到登录接口账号密码加密密文的密钥、加密方法位置和关键调用链信息。

或者直接要求提取某项数据,提供给它cookie就行:

使用 js-url-auto-reverse 抓取这个站点的所有数字并求和: https://match.yuanrenxue.cn/match/14 ,Cookie: xxxxxxx



提供统计,使用gpt-5.3-Codex(输入 $0.6600/M输出 $5.2800/M),完成统计猿人学困难难度逆向题,共消耗$0.28:

例如也可以直接跑命令:

python3 scripts/run_js_reverse_pipeline.py "https://target" --mode auto --allow-dynamic --budget-level low

边界和预期

这个 skill 对常见前端签名/加密场景很有帮助。

但如果是强对抗目标(重 WASM VM、服务端协同签名、强风控),可能会触发人工兜底流程:自动化没法稳定拉取或定位时,手动把关键文件保存到本地,再让 AI 继续审计,先把范围收敛下来。

另外说清楚一点:它已经具备“自动化断点暂停采集”能力(CDP),但还不是完整的交互式人工单步调试器。

最后

这东西可能对大佬来说不算新鲜,但对我来说,用实践的方式确实把 skill 和 MCP 跑通了,对这两块有了一定的概念。