L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Productivité · SKILL.md

re-ida

re-ida

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

Independent GitHub snapshot · Automated classification · Original documentation governs

Ddslsdzc / rev-skillsApache-2.0

Documentation de la Skill

GitHub

name: re-ida description: > IDA 工作流:导入→FLIRT→Hex-Rays→idapython。 触发词:IDA、Hex-Rays、idapython capabilities: [decompilation, debugging]

IDA 逆向工作流

何时使用 / 何时不用

  • 用:已有 IDA 授权/免费版,目标需要 FLIRT 库识别、Hex-Rays 反编译、idapython 批处理
  • 用:大规模重复性标注/导出(无头批处理 idat -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(Windows 对应 ida.exe,无头用 idat/idat.exe)
  • 验证: 启动后成功打开一个样本完成 auto-analysis,函数窗口有内容;idat --help 有输出;无头模式试跑 idat -A -L"t.log" /bin/true 能正常退出
  • 版本差异: 7.5 起数据库统一 .i64(旧 .idb/.idb64 可升级);8.x 需 64 位宿主;9.0 起 32/64 位安装合一、内置 FLIRT 签名管理器、idalib 无头 API——9.x 可执行文件不再带 64 后缀(ida/idat 一个二进制同时处理 32/64 位),IDA ≤8.x 才分 ida/ida64、idat/idat64——详见 [[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 开启;确认 segments 与 entry point 已识别
    • 无头批处理: idat -A -S"myscript.py" -L"log.txt" sample(-A 自动模式,Windows 用 idat.exe)
    • 无头脚本开头 ida_auto.auto_wait() 等分析完成、结尾 idc.qexit(0) 退出——缺这两行会拿到空函数列表或进程挂住
  2. FLIRT 识别库函数:

    • File > Load file > FLIRT signature file... 选择匹配的 .sig(MSVC 选 mssdk、vc64rtf 等;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()
    

    无头运行: idat -A -S"script.py log.txt" sample,脚本末尾 idc.qexit(0) 保证退出(idc.qexit 是 ida_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 个函数):现象——idat -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]]

Skills enregistrées