Skip to content

基本用法和技巧

静态调试

快捷键

1. 导航与视图 (Navigation)

快捷键 功能 场景/备注
Space 切换视图 在“图形视图 (Graph)”和“文本视图 (Text)”间切换。Graph 看逻辑流,Text 看地址细节。
G 跳转地址 (Go to) 输入地址(如 401000)或函数名(如 main)直接跳转。
Esc 返回 (Back) 跳回到上一次查看的位置(类似浏览器的“后退”)。
Ctrl + Enter 前进 (Forward) 类似浏览器的“前进”。
Shift + F12 字符串窗口 查看程序中所有的硬编码字符串(Flag 提示、报错信息)。
x 交叉引用 (Xref) 查看“谁调用了这个函数”或“谁使用了这个变量”。

2. 数据与代码操作 (Operation)

快捷键 功能 场景/备注
F5 反编译 (Decompile) 将汇编转为类 C 伪代码。逆向的核心。
n 重命名 (Name) 把 sub_401230 改为 check_flag,把 v1 改为 input_len。
y 修改类型 (Type) 把 int v1 改为 char *v1 或结构体指针,修复 F5 的显示错误。
; 添加注释 在汇编或伪代码行尾添加注释(备注你的分析思路)。
/ 伪代码注释 在 F5 伪代码窗口中添加注释。
h 进制转换 在数字上按 h,在 十进制/十六进制/字符 之间切换(如 100 <-> 0x64)。
r 字符转换 把数字转换为 ASCII 字符(如 0x41 -> 'A')。

3. 定义数据类型 (Data Definition)

快捷键 功能 场景/备注
d 定义数据 (Data) 在 db, dw, dd 之间循环切换。让 IDA 识别这是字节、字还是双字。
c 定义代码 (Code) 强制将选中的数据解释为汇编指令(用于对抗花指令)。
u 取消定义 (Undefine) 把一段代码或数据变成未定义的原始字节(当你觉得 IDA 分析错时用)。
a 定义字符串 (ASCII) 将一段数据定义为字符串。
* 定义数组 将选中的变量定义为数组(设置长度)。
快捷键 功能 场景/备注
Alt + T 搜索文本 搜索汇编指令或伪代码中的字符串。
Alt + I 搜索数值 (Immediate) 搜索常量(如 0x3E9 / 1001,加密常数 0x9E3779B9)。
Alt + B 搜索字节 搜索特定的 Hex 字节序列(如 E8 ?? ?? ?? ??)。

伪代码修复

1. 参数修正

如果 IDA 识别的函数参数不对(比如少识别了一个参数),在函数名上 右键 -> Set item type (快捷键 y)。

  • 例子:将 int __cdecl sub_401000(int a1) 改为 int __cdecl sub_401000(int a1, char *str)。

2. 结构体还原 (Structs)

当看到 *(_DWORD *)(a1 + 4) 这种代码时,说明这是一个结构体成员访问。

  1. 打开 Structures 窗口 (Shift + F9)。

  2. 按 Insert 创建新结构体。

  3. 在结构体结束处按 d 添加成员(按 d 切换类型,按 n 重命名)。

  4. 回到 F5 窗口,对着那个变量按 y,把类型改成你定义的结构体名字(如 MyStruct *)。

  5. 代码瞬间变成 info->flag,清晰度 MAX。

3. 数组修复

当看到 v1,v2,v3 连续赋值,其实它们是一个数组。

  • 双击进入栈变量视图(Stack View)。

  • 选中 v1,按 *,设置数组大小。

  • 回到 F5,你会发现它变成了 buf[0], buf[1]...


逆向分析

字符串定位

适用于大多数逻辑简单的题目。

  1. Shift + F12 打开字符串窗口。

  2. 搜索 Correct, Success, Wrong, Flag 等关键词。

  3. 双击字符串,跳转到数据段。

  4. 按 x (交叉引用),跳转到引用该字符串的代码。

  5. F5 反编译该函数,这就是核心逻辑。

关键 API 定位

适用于无字符串提示,或加壳/混淆的程序。

  1. 打开 Imports 窗口。

  2. 搜索关键函数:

    • 输入类:GetWindowText, scanf, gets, recv。

    • 输出类:MessageBox, printf, send。

    • 文件类:CreateFile, ReadFile, fopen。

    • 加密类:CryptDecrypt, AES_...。

  3. 双击函数,找交叉引用,定位调用位置。

常量定位

适用于加密算法题(TEA, AES, MD5 等)。

  1. 如果看到奇怪的数字,如 0x9E3779B9 (TEA), 0x67452301 (MD5)。

  2. Alt + I 搜索这些常数。

  3. 直接定位到加密算法的核心循环。

动态调试

当静态分析看不懂(比如大量指针运算、虚函数调用)时。

  1. 选择调试器:菜单栏 Debugger -> Select debugger -> Local Windows debugger。

  2. 下断点 (F2):在关键判断处(如 cmp eax, ebx)下断点。

  3. 运行 (F9):程序运行到断点处停下。

  4. 单步步过 (F8):一行行执行,看寄存器窗口(General registers)的值变化。

  5. 查看内存:双击寄存器(如 EAX),在 Hex View 中查看它指向的内存内容(是不是 Flag?)。


IDA 插件

  1. Keypatch:

    • 痛点:IDA 原生修改汇编极其麻烦(要手动填 Hex)。

    • 功能:可以直接把 jz 改成 jnz,或者把 call 改成 nop。

    • 用法:选中指令 -> Ctrl + Alt + K -> 输入汇编指令 -> Patch。

  2. LazyIDA:

    • 功能:快速复制数据。

    • 用法:右键数据 -> Copy as Python array / Copy as C array。写解题脚本。

  3. FindCrypt:

    • 功能:自动扫描程序中的加密常数(AES S盒, MD5 初始值等)。

    • 用法:Edit -> Plugins -> FindCrypt。