IDA 逆向工作流

SkillDev tools

IDA 工作流:导入→FLIRT→Hex-Rays→idapython。 触发词:IDA、Hex-Rays、idapython

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the IDA 逆向工作流 skill

What this skill tells your AI

The instructions your AI receives, as published by dslsdzc/rev-skills in .claude/skills/re-ida/SKILL.md and read by ahel’s review.

何时使用 / 何时不用

  • 用:已有 IDA 授权/免费版,目标需要 FLIRT 库识别、Hex-Rays 反编译、idapython 批处理
  • 用:大规模重复性标注/导出(无头批处理 idat64 -A -S,序列见 [[commands]])
  • 不用:免费版无法处理时(无 Hex-Rays → 用 [[re-ghidra]] 兜底);只需快速结论([[re-triage]])
  • 不用:内存受限环境(大二进制卡顿,换 [[re-radare2]]);纯命令行快速分析([[re-radare2]] 更轻)
  • 不用:macOS/Linux 目标动态调试([[re-lldb]] / [[re-gdb]]);IDA 调试器只对 Windows 本地目标价值最大

工具准备

参考 [[re-analyze/platform-tips]]——静态分析免沙箱;用 IDA 调试器做动态调试时按最高原则默认沙箱执行。

IDA(商业版 / 免费版)

  • 下载: hex-rays.com(IDA Free 免费版,支持 x86/x64;其他架构与分析器需商业版)
  • Windows: 安装程序直接运行;choco install ida-free(社区包,或官网手动下载)
  • macOS/Linux: 官网 tar 包解压运行 ida / ida64(Windows 对应 ida.exe/ida64.exe,无头用 idat/idat64
  • 验证: 启动后成功打开一个样本完成 auto-analysis,函数窗口有内容;idat64 --help 有输出;无头模式试跑 idat64 -A -L"t.log" /bin/true 能正常退出
  • 版本差异: 7.5 起数据库统一 .i64(旧 .idb/.idb64 可升级);8.x 需 64 位宿主;9.0 起 32/64 位安装合一、内置 FLIRT 签名管理器、idalib 无头 API——详见 [[gotchas]]

idapython(内置)

  • IDA 6.8+ 内置 Python 环境,无需单独安装;IDA 9 用 idapyswitch(IDA 根目录)切换外部 Python(3.8–3.13)
  • 验证: 菜单 File > Script command(Shift+F2)执行 print(idaapi.IDA_SDK_VERSION) 输出版本

FLIRT 签名库

  • IDA 自带 sig/ 目录(flair),应用后自动标注库函数;IDA 9 的签名管理器可在线下载更多签名
  • 验证: 对已知 libc 程序应用签名后,_init/malloc 等被标注为库函数

操作步骤

  1. 导入与 auto-analysis

    • File > New 选择样本 → 等左下角 AU: analyzing 结束(无 AU 字样且分析日志停止)
    • 确认 Options > General > Analysis 中 Auto-analysis 开启;确认 segmentsentry point 已识别
    • 无头批处理: idat64 -A -S"myscript.py" -L"log.txt" sample-A 自动模式,Windows 用 idat64.exe
    • 无头脚本开头 ida_auto.auto_wait() 等分析完成、结尾 idc.qexit(0) 退出——缺这两行会拿到空函数列表或进程挂住
  2. FLIRT 识别库函数

    • File > Load file > FLIRT signature file... 选择匹配的 .sig(MSVC 选 mssdkvc64rtf 等;GNU 选 libstdc++ 系列)
    • 识别后库函数名自动应用,函数窗口内库函数(浅色)与用户函数分离——直接聚焦非库函数
    • 匹配失败(加壳/混淆库)→ 说明壳或自定义编译,转 [[re-anti-analysis]]
  3. 快捷键主线(静态分析日常)

    • x 交叉引用;n 重命名(函数/变量);y 改类型(如 int __cdecl f(int, char*));; 注释(repeatable 用 :
    • G 跳地址;Alt+T 文本搜索(字符串关键字);Alt+B 二进制搜索(字节模式);Esc 返回上级
    • F5 Hex-Rays 反编译;Tab 在伪代码/汇编视图间切换
    • 完整快捷键与命令表见 [[commands]]
  4. Hex-Rays 反编译阅读

    • F5 进伪代码:先读函数签名与局部变量,再沿调用链(双击 call 进入、Esc 返回)走数据流
    • 重命名局部变量/参数改善可读性;y 修正调用约定与参数类型
    • 伪代码与反汇编对不上时(优化导致的结构差异),回反汇编核对——反编译是视图不是事实
    • 算法/解密还原: 反编译输出定位循环,配合 idapython 算关键常量(序列见 [[commands]] 操作序列 3)
  5. idapython 批处理(解密循环/批量标注)

    import ida_bytes, idc
    # 批量 patch: 0x401000 起 0x100 字节异或 0x55
    base = 0x401000
    for i in range(0x100):
        ida_bytes.patch_byte(base + i, idc.get_byte(base + i) ^ 0x55)
    
    # 批量重命名: 给所有未命名导入标注来源
    import ida_funcs, ida_name
    # 遍历函数: ida_funcs.get_func() / idc.get_func_name()
    

    无头运行: idat64 -A -S"script.py log.txt" sample,脚本末尾 idc.qexit(0) 保证退出(idc.qexitida_pro.qexit 别名,IDA 7.0+ 一致)。

  6. 免费版限制处理

    • 免费版无 Hex-Rays: 用反汇编 + idapython(按步骤 5 方式人工还原循环/算法),或直接导出给 Ghidra: 菜单 File > Produce file > Dump typeinfo / 用 idb2pat 生成库签名;或换 [[re-ghidra]] 做反编译
    • 免费版功能裁剪:无本地 Hex-Rays(有 x86/x64 云端反编译可先试)、调试器仅限本地 x86/x64、无反汇编器扩展——按裁剪范围调整流程
  7. 动态调试(Windows 本地目标,商业版)

    • F9 运行、F2 断点切换、F8/F7 单步、Ctrl+F2 重启——与 [[re-x64dbg]] 同习惯
    • 反调试检测(IsDebuggerPresent 等)先静态定位再处理,边界见 [[gotchas]]
  8. 证据核对(收尾):重命名/注释/已恢复结构随 .i64 存档(File > Save,副本备份原库);无头导出产物(函数清单/反编译 .c)与 [[re-triage]] 初勘值对照入档;关键结论写 [[re-analyze/analysis-contract]]——IDA 里的标注要能还原到报告,别只留在数据库里

函数分析上下文清单

分析每个函数前先收集(见 [[re-analyze/analysis-contract]] 上下文清单):xrefs、目标函数引用的字符串、caller/callee 签名、已命名符号表、已恢复 struct。一次性给足再分析;主动申请额外证据每函数不超过 8 次工具调用。

深分析按 [[re-analyze/analysis-contract]] 的「单函数深分析顺序」五步推进(types → constants → vtables → identity → decompilation);IDA 下类型用 idapython get_type/结构体定义,符号/常量证据可用 readelf / strings / objdump 导出辅助。

跨域联合

  • [[re-binary-core]]:工作流第 5 步备选反编译器(RE_DECOMPILER=ida
  • [[re-cracking]]:注册算法/校验逻辑定位常用 IDA
  • [[re-malware]]:恶意样本调试(IDA 调试器)与分析
  • [[re-plugin-dev]]:IDAPython 是插件语言,脚本→插件工程化
  • 免费版无 Hex-Rays 时对接 [[re-ghidra]]

常见坑与陷阱

  • 免费版无反编译:IDA Free 无 Hex-Rays——先确认版本能力,缺反编译直接走 Ghidra,别在反汇编里硬读

  • 反调试检测:样本可用 IsDebuggerPresent/NtQueryInformationProcess 检测 IDA 调试器(调试器默认标记)——静态分析为主,或用隐藏调试器插件(ScyllaHide 类)

  • 大二进制卡顿:auto-analysis 全开对 100MB+ 二进制极慢——关掉部分分析选项(如 constant propagation)或换 [[re-radare2]]

  • FLIRT 匹配的是"去壳后"的真实库——带壳样本先脱壳再跑签名

  • 地址型 API 返回值没判 BADADDR:现象——idapython 脚本在部分样本上拿到 0xFFFFFFFFFFFFFFFF 之类的地址,后续寻址/改名全错或崩溃;原因——IDA API 用 BADADDR(-1)表示失败(名字不存在、地址非法、函数不存在),脚本没检查返回值就继续用;对策——每个返回地址的 API(get_name_ea/get_func 等)调用后先判 == BADADDR,失败先打印现场再继续;脚本先只读验证再写库(见下条)

  • 修改型脚本直接在原库上跑,改坏难回滚:现象——批处理改名/改字节脚本跑完发现一堆错误标注,撤销费劲甚至不可逆;原因——跳过只读验证直接写库,也没对副本操作;对策——官方推荐先跑只读脚本(打印库路径/架构/函数与字符串统计)确认预期,修改型脚本逐步增量验证(最小脚本→看输出→加功能);批量改动前先复制一份 .i64/.idb 或在副本上跑

  • Hex-Rays interr(decompiler 内部错误):现象——无头反编译跑到某个函数报 interr: create_stkvar(...) dtype=7 之类后整个进程崩溃,跳过/重试无效;原因——decompiler 对特定栈布局的内部 bug,与样本/脚本无关;对策——换 Ghidra 完成该目标(互证也更好),别在同一函数上硬刚;批量反编译场景先小样本试跑确认不触发再全量

  • 无头批量导出没等 auto-analysis 完成(静默产出 0 个函数):现象——idat64 -A -S"export.py" sample 批量导出跑完,产物 0 个函数或严重不全,日志无任何报错;原因——-A 模式下脚本注入与 auto-analysis 异步并行,脚本在分析完成前就遍历函数列表得到空集,失败被静默吞掉;对策——收集函数前先 ida_auto.auto_wait() 阻塞至分析结束;导出循环逐函数 try/except,单个函数失败只记入清单(地址/名字/原因)后继续,结尾汇总 total/exported/failed,不中断全量;只导出非库函数(FUNC_LIB 标志)时无用户代码的小二进制合法产出 0 个,验证用「日志关键字 + 产物计数」双通道并容忍这种合法空产出;调用图(callers/callees)先整体算好缓存再进反编译循环,导出按便宜到贵排序(strings → imports → exports → memory → decompile),每函数一个按地址命名的文件 (来源:LazyReverse(a0yami),MIT)

  • IDA 9 脚本迁移(get_struc 等已移除)、版本差异与反调试边界见 [[gotchas]]

Signals

GitHub stars
57
Forks
8
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
re-ida
Source
github.com/dslsdzc/rev-skills