在逆向工程领域,二进制反编译一直是高难度任务。传统工具如 Ghidra 或 IDA Pro 虽强大,但生成的伪代码往往难以直接匹配源代码,尤其在优化后的 N64 等嵌入式二进制中。Claude 等大模型的出现,提供了一种新型 one-shot(单次)提示方式:无需多轮交互,直接输入汇编函数,输出匹配的 C 代码,并通过构建验证。该方法在 Snowboard Kids 2 反编译项目中,实现了每周处理数百函数的高吞吐,匹配率达 79%。
单次提示的核心优势与实现要点
One-shot 反编译的关键在于 “无反馈循环”:Claude 接收函数后,独立完成环境搭建、代码生成、构建验证与 Git 提交。若失败,则标记为困难函数并退出。这种设计避免了人类干预的瓶颈,提高了自动化程度。相比多轮对话,one-shot 减少了 token 消耗与上下文污染风险。
工程实践证明,使用 Claude Opus 4.5(优于 Sonnet 4.5,能匹配 Sonnet 失败的 5/7 函数)效果最佳。提示需严格结构化:
- 环境匹配:为目标函数创建隔离目录,预置依赖头文件与 Makefile,仅暴露必要工具。
- 工具调用:提供 Unix-like 工具链,如
build-and-verify.sh,输出明确成功 / 失败信号(e.g., "BUILD HAS FAILED"),防 LLM 误判。 - 失败阈值:10 次尝试无进展即放弃,防止 quota 耗尽。
- 提交规范:成功后强制
git commit,确保持久化。
实际提示模板(基于项目 CLAUDE.md)强调防御性:工具需有清晰错误消息、目录守卫(如 %: make 规则提醒 “仅用指定工具”),并限制构建输出以节省 token。
评分器:优先易函数的动态调度
盲目处理复杂函数易失败。引入 scorer,按难度排序:初始公式 score = instruction_count + 3*branch_count + 2*jump_count + 2*label_count。采集数百匹配 / 失败数据后,用 logistic regression 调优(移除 stack_size 以防过拟合)。
参数建议:
- 特征权重:指令数 1.0,分支 2.8,跳转 1.9,标签 2.1(模型自拟合)。
- 阈值:score < 50 为易函数,优先级高。
- 重训周期:每 200 函数后,准确率提升 5-10%。
此设计奠基简单函数,逐步攻克依赖复杂者。
工作流集成:四组件闭环
完整 pipeline:
- Scorer:选函数 → vacuum.sh 调用。
- Claude:headless 模式执行提示。
- Tools:防御编码,token 优化(e.g., 构建日志截断)。
- Driver:bash 循环,5min 背压、Ctrl-C 陷阱、日志持久。
监控参数:
| 组件 | 关键阈值 | 回滚策略 |
|---|---|---|
| Scorer | score > 200 跳过 | 标记 difficult_functions |
| Claude | 尝试 >10 | 退出,日志分析 |
| Driver | 配额耗尽 | 5min 轮询重试 |
| Tools | 构建超时 30s | 显式失败信号 |
集成 RE 工作流:匹配函数自动 PR,人类审阅复杂者。N64 项目中,此法 3 周进度超前 3 个月。
评估保真度:真实二进制指标
非 token 相似度,而是功能性:
- 构建成功率:90%+,证明语法 / 结构正确。
- 匹配率:79% 函数(难度直方图:简单函数 >90%,复杂 <20%)。
- 语义保真:checksum 匹配,运行等价。
风险:LLM “脱轨”(幻觉代码),限 scaffolding + scorer 缓解。未来:多模型投票、人类后处理提升清晰度(指针 → 数组)。
参数清单落地:
- 模型:Opus 4.5,温度 0.2(确定性)。
- Prompt 长度:<4k token。
- 批次:8h 无人值守,~100 函数。
- 监控:日志 grep 失败模式,迭代工具。
此实践证明,one-shot Claude 反编译已从实验转向生产力工具,结合传统 RE(如 splat, m2c),加速游戏 / 固件复原。
资料来源: