基本用法和技巧
静态调试
快捷键
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) | 将一段数据定义为字符串。 |
* |
定义数组 | 将选中的变量定义为数组(设置长度)。 |
4. 搜索 (Search)
| 快捷键 | 功能 | 场景/备注 |
|---|---|---|
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) 这种代码时,说明这是一个结构体成员访问。
-
打开 Structures 窗口 (
Shift + F9)。 -
按
Insert创建新结构体。 -
在结构体结束处按
d添加成员(按d切换类型,按n重命名)。 -
回到 F5 窗口,对着那个变量按
y,把类型改成你定义的结构体名字(如MyStruct *)。 -
代码瞬间变成
info->flag,清晰度 MAX。
3. 数组修复
当看到 v1,v2,v3 连续赋值,其实它们是一个数组。
-
双击进入栈变量视图(Stack View)。
-
选中
v1,按*,设置数组大小。 -
回到 F5,你会发现它变成了
buf[0],buf[1]...
逆向分析
字符串定位
适用于大多数逻辑简单的题目。
-
Shift + F12打开字符串窗口。 -
搜索
Correct,Success,Wrong,Flag等关键词。 -
双击字符串,跳转到数据段。
-
按
x(交叉引用),跳转到引用该字符串的代码。 -
F5 反编译该函数,这就是核心逻辑。
关键 API 定位
适用于无字符串提示,或加壳/混淆的程序。
-
打开 Imports 窗口。
-
搜索关键函数:
-
输入类:
GetWindowText,scanf,gets,recv。 -
输出类:
MessageBox,printf,send。 -
文件类:
CreateFile,ReadFile,fopen。 -
加密类:
CryptDecrypt,AES_...。
-
-
双击函数,找交叉引用,定位调用位置。
常量定位
适用于加密算法题(TEA, AES, MD5 等)。
-
如果看到奇怪的数字,如
0x9E3779B9(TEA),0x67452301(MD5)。 -
Alt + I 搜索这些常数。
-
直接定位到加密算法的核心循环。
动态调试
当静态分析看不懂(比如大量指针运算、虚函数调用)时。
-
选择调试器:菜单栏
Debugger->Select debugger->Local Windows debugger。 -
下断点 (F2):在关键判断处(如
cmp eax, ebx)下断点。 -
运行 (F9):程序运行到断点处停下。
-
单步步过 (F8):一行行执行,看寄存器窗口(General registers)的值变化。
-
查看内存:双击寄存器(如
EAX),在 Hex View 中查看它指向的内存内容(是不是 Flag?)。
IDA 插件
-
Keypatch:
-
痛点:IDA 原生修改汇编极其麻烦(要手动填 Hex)。
-
功能:可以直接把
jz改成jnz,或者把call改成nop。 -
用法:选中指令 ->
Ctrl + Alt + K-> 输入汇编指令 -> Patch。
-
-
LazyIDA:
-
功能:快速复制数据。
-
用法:右键数据 ->
Copy as Python array/Copy as C array。写解题脚本。
-
-
FindCrypt:
-
功能:自动扫描程序中的加密常数(AES S盒, MD5 初始值等)。
-
用法:
Edit->Plugins->FindCrypt。
-