在二进制反汇编领域,传统多轮交互提示虽灵活,但人类干预需求高、吞吐低,无法规模化处理大量函数。Claude 3.5 Sonnet 的 one-shot prompting 模式,通过自动化循环显著提升效率,无需 fine-tuning 即可匹配复杂 MIPS binary,适用于游戏逆向如 N64 Snowboard Kids 2 项目。
Chris Lewis 在其 Snowboard Kids 2 decomp 项目中采用此方法,三周内匹配函数数超过前三月总和,预计 79% 函数可自动化处理。“在采用此工作流的三周内,我在 Snowboard Kids 2 项目上取得的进展超过前三个月。” 相比 Codex 等代理,Claude Opus 4.5(Sonnet 类似)在匹配率和指令遵循上更优,Sonnet 在 7 个难函数中解决 5 个。
核心在于构建 scorer-Claude-tools-driver 闭环。Scorer 使用 logistic regression 模型预测函数难度,避免 Claude 浪费在高复杂任务上。特征包括指令数(instruction_count)、分支数(branch_count)、跳转数(jump_count)和标签数(label_count),初始权重经数百匹配 / 失败数据微调。堆栈大小(stack_size)经测试无关,已移除。定期重训模型,提升准确率。
Claude 核心 prompt 置于 CLAUDE.md:1)为目标函数创建隔离匹配环境;2)使用工具反汇编并迭代生成 C 代码;3)10 次无进步即放弃,标记为 difficult_functions;4)匹配成功则验证构建、提交 Git。Headless 模式确保 one-shot 执行,无需人类反馈,提高 8+ 小时无人值守吞吐。
工具链模拟 Unix 风格,便于 Claude 组合:build-and-verify.sh 编译 C 并 diff 汇编,输出匹配率(100% 为完美匹配),限制输出节省 token;disassembly 转 MIPS asm;obj-diff 规范化寄存器 diff 对象文件。防御设计关键:明确错误消息(如 “BUILD HAS FAILED”)、守卫滥用(如目录 catchall make 规则引导回主项目)。
Driver 脚本 vacuum.sh 管理循环:选函数 → 调 Claude → 非零退出则退避(5 分钟轮询限额) → Ctrl-C 安全中断 → 完整日志调试失败。Token 优化:scorer 预选最易函数,避免 Claude 自选浪费。
可落地参数与清单:
Scorer 参数
- 公式:score = instruction_count + w1 * branch_count + w2 * jump_count + w3 * label_count
- 初始权重:branch/jump/label ≈ 2-3,经 logistic regression 优化(e.g., branch 权重高于初始猜测)
- 阈值:低分优先,难函数移至 difficult_functions
Prompt 阈值
- 放弃:10 次无进步
- 匹配标准:100% asm diff + 构建 checksum 一致
- 风格:C89 兼容,idiomatic N64 C(避免 goto 滥用、数组而非指针算术)
工具阈值
- 构建缓冲:92% token 触发压缩(可选扩展)
- 输出限:build-and-verify.sh 仅关键 diff,避免冗长日志
实施清单
- 提取未匹配函数 asm(decomp.me 或 splat)。
- 建 scorer 模型(Python sklearn logistic)。
- 隔离 env:CLAUDE.md + tools/ 目录。
- 跑 vacuum.sh --max-iters 无限循环。
- 监控:tail log,grep “matched” 计数;difficult_functions 人工审。
- 回滚:Git commit 每匹配,日志回溯失败。
监控要点:token 消耗(API quota)、匹配率(histogram 难度分布)、Claude 循环次数(>10 警告)。风险:hallucination 污染 repo(commit 前验证);quota 耗尽(driver 退避);复杂函数(>79% 需人类 + permter 如 decomp-permuter)。
扩展:RAG 检索历史匹配;XML prompt 提升遵循;集成 permuter 工具近 100% 匹配 nudge。Sonnet 3.5 编码基准领先,one-shot 适用于 x86/ARM 等 binary。
此方法将 decomp 从专家瓶颈转向计算限,未来 LLM 输出清理将主导。
资料来源:Chris Lewis 博客 The Unexpected Effectiveness of One-Shot Decompilation with Claude 和 Using Coding Agents to Decompile N64,GitHub cdlewis/snowboardkids2-decomp。