大模型应用
有旧版符号时如何用 LLM…
当你有旧版本的符号或逆向结果,需要快速迁移到无符号的新版本二进制时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
有旧版符号时如何用 LLM 批量迁移到新特定
解决思路
- 读取 ../field-journal/precedent-reverse.md 确认操作已授权,并确认任务命中适用范围
- 读取 ../tool-index.md 校验工具可用性和实际路径,缺工具时调用 bootstrap,不要猜路径
- 准备数据:将旧版二进制(有 PDB/符号)和新版二进制(无符号)分别加载到 IDA,找到两个版本中相同的锚点函数(导出函数、字符串引用等)
- 批量导出:从旧版导出锚点函数的反汇编 + 伪代码(含符号名),从新版导出同一锚点函数的反汇编 + 伪代码(无符号名)
- 用固定 prompt 模板填充数据:{disasm_for_reference}、{procedure_for_reference}、{disasm_code}、{procedure}、{symbol_name_list},要求 LLM 输出 YAML 格式的符号引用(found_vcall / found_call / found_funcptr / found_gv / found_struct_offset)
- 调用 LLM API 进行比对:默认用 DeepSeek V3 处理中小函数(<200 行),超大函数(>500 行)切 GPT-4o 或 Claude,并发 10-20 提高速度,结果缓存避免重复调用
- 解析返回的 YAML,将符号映射批量应用到新版 IDB:found_call → idapro_rename(addr=call_target, name=func_name);found_vcall → idapro_set_comments(addr=insn_va, comment="vcall: {func_name} @ +{offset}");found_funcptr → idapro_rename(addr=funcptr_target, name=funcptr_name);found_gv → idapro_rename(addr=gv_addr, name=gv_name);found_struct_offset → idapro_set_comments(addr=insn_va, comment="{struct_name}.{member_name}")
- 迭代:第一轮迁移的函数成为新的锚点,进入这些函数继续对比内部调用,重复直到覆盖所有目标函数
- 锚点选择策略:导出函数(最高可靠)、字符串引用(高)、常量/魔数(中)、代码模式(中)
- 每次只比对 1 个函数避免 context 爆炸;超大函数(>1000 行反汇编)需拆分或用大 context 模型
- 关键符号人工抽检,LLM 不是 100% 准确
- 完成自检:执行工作流每一步、使用真实工具路径、产出可复现证据、回写 RULES 要求的 Checklist 项
适用边界 · 注意事项
- 从零开始逆向一个二进制(应使用 ida-reverse/ 或 radare2/)
- 两个完全不同的二进制对比(应使用 BinDiff / Diaphora 等传统工具)
- 锚点本身不可靠或对错时(后续全部白费)