IDA 逆向工作流
SkillDev toolsIDA 工作流:导入→FLIRT→Hex-Rays→idapython。 触发词:IDA、Hex-Rays、idapython
Available today. Use it from your connected AI after setup.
No other account needed.
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等被标注为库函数
操作步骤
-
导入与 auto-analysis:
File > New选择样本 → 等左下角AU: analyzing结束(无 AU 字样且分析日志停止)- 确认
Options > General > Analysis中 Auto-analysis 开启;确认segments与entry point已识别 - 无头批处理:
idat64 -A -S"myscript.py" -L"log.txt" sample(-A自动模式,Windows 用idat64.exe) - 无头脚本开头
ida_auto.auto_wait()等分析完成、结尾idc.qexit(0)退出——缺这两行会拿到空函数列表或进程挂住
-
FLIRT 识别库函数:
File > Load file > FLIRT signature file...选择匹配的.sig(MSVC 选mssdk、vc64rtf等;GNU 选libstdc++系列)- 识别后库函数名自动应用,函数窗口内库函数(浅色)与用户函数分离——直接聚焦非库函数
- 匹配失败(加壳/混淆库)→ 说明壳或自定义编译,转 [[re-anti-analysis]]
-
快捷键主线(静态分析日常):
x交叉引用;n重命名(函数/变量);y改类型(如int __cdecl f(int, char*));;注释(repeatable 用:)G跳地址;Alt+T文本搜索(字符串关键字);Alt+B二进制搜索(字节模式);Esc返回上级F5Hex-Rays 反编译;Tab在伪代码/汇编视图间切换- 完整快捷键与命令表见 [[commands]]
-
Hex-Rays 反编译阅读:
F5进伪代码:先读函数签名与局部变量,再沿调用链(双击 call 进入、Esc返回)走数据流- 重命名局部变量/参数改善可读性;
y修正调用约定与参数类型 - 伪代码与反汇编对不上时(优化导致的结构差异),回反汇编核对——反编译是视图不是事实
- 算法/解密还原: 反编译输出定位循环,配合 idapython 算关键常量(序列见 [[commands]] 操作序列 3)
-
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.qexit是ida_pro.qexit别名,IDA 7.0+ 一致)。 -
免费版限制处理:
- 免费版无 Hex-Rays: 用反汇编 + idapython(按步骤 5 方式人工还原循环/算法),或直接导出给 Ghidra:
菜单
File > Produce file > Dump typeinfo/ 用 idb2pat 生成库签名;或换 [[re-ghidra]] 做反编译 - 免费版功能裁剪:无本地 Hex-Rays(有 x86/x64 云端反编译可先试)、调试器仅限本地 x86/x64、无反汇编器扩展——按裁剪范围调整流程
- 免费版无 Hex-Rays: 用反汇编 + idapython(按步骤 5 方式人工还原循环/算法),或直接导出给 Ghidra:
菜单
-
动态调试(Windows 本地目标,商业版):
F9运行、F2断点切换、F8/F7单步、Ctrl+F2重启——与 [[re-x64dbg]] 同习惯- 反调试检测(
IsDebuggerPresent等)先静态定位再处理,边界见 [[gotchas]]
-
证据核对(收尾):重命名/注释/已恢复结构随 .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