看懂反汇编(disassembly)其实是一个从机器码到“人脑可理解逻辑”的还原过程,不需要一开始就完全精通汇编,而是掌握关键思路 + 常用指令 + 上下文推断。下面我按由浅入深、实战导向的方式给你讲。
反汇编是:
注意:反汇编 ≠ 反编译
- 反汇编:汇编指令
- 反编译:伪 C 代码(如 IDA / Ghidra)
以 x86 / x64 为例(最常见)
EAX ECX EDX EBX
ESP EBP ESI EDI
EIP(指令指针)
RAX RCX RDX RBX
RSP RBP RSI RDI
RIP
✅ 口诀:
EAX / RAX:返回值、计算ESP / RSP:栈顶EBP / RBP:栈底(函数帧)EIP / RIP:下一条指令✅ 解决思路:先抓结构,再抠细节
push ebp
mov ebp, esp
sub esp, 0x10
含义:
mov esp, ebp
pop ebp
ret
✅ 看到这些,你就知道:
这是一个函数
push 2
push 1
call func
函数里:
mov eax, [ebp+8] ; 第一个参数
mov ecx, [ebp+12] ; 第二个参数
mov [ebp-4], 10
✅ 记住:
ebp+ → 参数ebp- → 局部变量| 指令 | 含义 |
|---|---|
mov |
赋值 |
push |
压栈 |
pop |
出栈 |
call |
调用函数 |
ret |
返回 |
add/sub |
加减 |
cmp |
比较 |
jmp |
无条件跳 |
je/jne/jg/jl |
条件跳 |
lea |
取地址 |
cmp eax, 0
je false
...
false:
loop_start:
cmp ecx, 0
je loop_end
...
jmp loop_start
loop_end:
✅ 技巧:
cmp + jcc ≈ ifmov eax, [ebp+8]
add eax, 1
ret
int func(int a) {
return a + 1;
}
✅ 建议:
先看 Ghidra 的伪 C,再对照汇编
✅ 第一阶段(1–2 周)
✅ 第二阶段(1 个月)
✅ 第三阶段
反汇编不是“读懂每一行”,而是“猜出它在干什么”
你不需要记住所有指令,只要能回答:
如果你愿意,我可以:
你可以直接贴一段汇编,我帮你“翻译”。