前言

IDA Pro 是逆向工程界的瑞士军刀,但它真正强大的地方不仅仅是反汇编和 F5 反编译,更在于它是一个可交互的数据库。分析一个复杂的程序是一个漫长且需要迭代的过程。

核心理念: 我们的目标不是一次性看懂所有代码,而是把每次的理解都记录回 IDA 的数据库 (IDB) 中。你添加的注释、重命名的函数、定义的结构体越多,这个程序对你来说就越“透明”。


基础导航与视图

掌握最基本的“移动”方式是最高效的。

  • Space (空格键):在汇编图表视图(Graph View)和汇编文本视图(Text View)之间切换。
  • F5最核心的功能。查看当前函数的 C 语言伪代码 (Hex-Rays)。你 90% 的分析时间都应该在这里。
  • Tab极度常用。在 F5 伪代码窗口中,按下 Tab 可以在伪代码和对应的汇编代码之间快速同步跳转。
  • **\ (反斜杠):在 F5 伪代码窗口中,隐藏/显示 C 语言的强制类型转换 (Hide/Show Casts)**。按 \ 可以让充斥着强转的伪代码瞬间清爽。
  • **G (Go)**:跳转到指定地址或函数名。
  • X (Xrefs):查看交叉引用。即“谁调用了这个函数?”或“谁访问了这个数据?”。在函数、变量、字符串上按 X 是最常用的溯源手段。
  • **Esc (Escape)**:在代码中后退(返回上一个跳转位置)。
  • **Ctrl + Enter**:在代码中前进(与 Esc 对应)。

关键技巧

数据与代码的格式化

IDA 有时会把代码识别成数据,或者把数据识别成代码,需要手动纠正:

  • C (Code):将当前位置的原始字节强制解析为汇编代码
  • D (Data):将当前位置解析为数据。连续按 D 可以在字节 (db)、字 (dw)、双字 (dd)、四字 (dq) 之间循环切换。
  • A (ASCII):将当前位置的数据解析为字符串(通常用于 IDA 没有自动识别出字符串的情况)。
  • U (Undefine)取消定义。把当前识别的代码或数据打回原形,变成未解析的原始字节(通常在手动修复混淆代码时使用)。

跳转与定位快捷键 (Jump 菜单)

这些快捷键虽然归类为“跳转”,但其本质是根据特定类型进行检索定位:

  • **G (Jump to address)**:最常用的搜索,直接输入地址(如 0x140001000)或已命名的函数名。
  • **Ctrl + P (Jump to function)**:弹出函数列表。你可以直接输入字符进行模糊匹配,快速找到游戏函数。
  • **Ctrl + L (Jump by name)**:在名称管理器中搜索。这不仅包括函数,还包括全局变量、导入符号等。
  • **Ctrl + E (Jump to entry point)**:搜索并列出程序所有的入口点(如导出函数、TLS 回调等)。

搜索

快捷键功能名称适用场景
Alt + T搜索文本 (Text)在反汇编窗口搜索字符串、指令、寄存器名(如 AES_encryptmov eax)。
Alt + B搜索序列 (Binary)搜索十六进制特征码。支持通配符 ?(如 55 8B EC ?? ??)。
Ctrl + T搜索下一个 (Next Text)重复上一次的文本搜索,跳转到下一个匹配项。
Ctrl + B搜索下一个 (Next Binary)重复上一次的字节序列搜索。
Alt + I搜索立即数 (Immediate)搜索代码中的特定数值(如加密算法中的常量 0x61C88647)。
Alt + C搜索指令 (Command)搜索特定的指令组合,比文本搜索更精准(不关心空格和寄存器名)。

注释与重命名

一个全是 sub_XXXXv5a1 的伪代码是根本无法阅读的。

重命名 (Rename) - 快捷键 N

给“地址”赋予一个有意义的“符号名”。现代 IDA Pro 已完美支持中文命名(如 v5 = 计算伤害(a1);),但为了兼容性,依然建议遵循 C 语言命名规范(英文、数字、下划线)。

  • 重命名函数:在 sub_12345 上按 N -> 输入 ParseNetworkPacket
  • 重命名变量:在 F5 窗口的 a1v10 上按 N -> 输入 this_ptrdec_buf

添加注释 (Commenting)

IDA 在汇编视图F5伪代码视图中的注释快捷键是完全不同的:

在 F5 伪代码视图中 (Hex-Rays)

  • / (正斜杠):这是伪代码视图下唯一的注释快捷键。
    • 点在代码行上按 /,添加行级注释。
    • 点在函数声明行(如 int __fastcall main())上按 /,为整个函数添加头部文档注释。

在汇编视图中 (Disassembly)

  • : (冒号) - 普通注释 (Regular Comment):给当前行添加注释。
  • ; (分号) - 可重复注释 (Repeatable Comment):给一个地址/函数添加注释。所有调用引用这个地址的地方,都会在旁边自动显示该注释

逆向的灵魂:数据结构(IDA 9 现代方案)

⚠️ 注意: 在 IDA 9.0 之后,传统的 Structures (Shift+F9)Enums (Shift+F10) 旧版视图已被彻底删除。如今,所有的数据结构、枚举和联合体,全部统一由局部类型 (Local Types) 接管。

局部类型 (Local Types) - 快捷键 Shift + F1

当你看到 F5 里充斥着 *(a1 + 4)*(a1 + 8) 这种基于偏移的内存访问时,a1 几乎 100% 是一个结构体指针。在现代 IDA 中,处理它的效率极高。

工作流:

  1. 打开局部类型窗口:按 **Shift + F1**。

  2. 编写 C 代码定义:按 Ins (Insert) 键,此时会弹出一个纯文本编辑器。你只需要直接把标准的 C/C++ 结构体或枚举代码敲进去(或粘贴进去):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct PlayerState {
    int health;
    int mana;
    char* name;
    };

    enum LoginStatus {
    STATUS_SUCCESS = 0,
    STATUS_FAILED = 1
    };

    IDA 会利用内置的 C 解析器自动为你计算所有底层偏移!

  3. 应用结构体/枚举

    • 结构体指针:回到 F5 伪代码窗口,找到被当作指针操作的变量(如 a1),按 Y (Set Type),输入 PlayerState*。所有的 *(a1 + 4) 将瞬间变成优雅的 a1->mana
    • 枚举数值:光标停在魔法数字(如 if (v5 == 1))上,按 M (Enum),选择 STATUS_FAILED。代码立刻变为 if (v5 == STATUS_FAILED)

如何保存与快速定位

如何保存?

你所做的一切都会自动保存在 .i64 数据库文件中,不需要额外记笔记。

  • 保存:按 Ctrl + W 随时保存。
  • 快照File -> Take database snapshot... 可以在做高危操作(如跑未知脚本、批量刷 FLIRT 签名)前拍快照防毁档。

下次打开如何快速定位?

  • Shift + F4 - 名称窗口 (Names Window)
    • 最常用的定位方式。这里列出了你所有重命名过的函数、变量和地址。按 Ctrl + F 极速搜索。
  • Shift + F12 - 字符串窗口 (Strings Window)
    • 找线索的起点。找到可疑字符串,按 X 查交叉引用,瞬间定位核心函数。
  • Shift + F3 - 函数窗口 (Functions Window)
    • 列出全盘函数。
  • Alt + M / Ctrl + M - 书签 (Bookmarks)
    • Alt + M:在当前位置添加书签。
    • Ctrl + M:打开书签列表。绝佳的“防遗忘”标记位。

总结:一套高效的工作流

  1. **查字符串 (Shift + F12)**:寻找错误信息或关键字。
  2. **溯源 (X)**:顺藤摸瓜找到业务逻辑函数。
  3. **读代码 (F5)**:进入伪代码进行深度分析。
  4. 迭代重构
    • 遇到乱码变量 -> N 重命名。
    • 遇到内存偏移 -> Shift + F1 直接写 C 结构体代码,回 F5 按 Y 应用。
    • 遇到魔法数字 -> Shift + F1 写 Enum 代码,回 F5 按 M 替换。
    • 理清逻辑 -> / 写行注释或函数说明。
  5. 保存与接续:随时 Ctrl + W,下次打开靠 Shift + F4 无缝衔接。