温馨提示×

如何看懂反汇编

小樊
47
2026-07-09 19:30:54
栏目: 编程语言

看懂反汇编(disassembly)其实是一个从机器码到“人脑可理解逻辑”的还原过程,不需要一开始就完全精通汇编,而是掌握关键思路 + 常用指令 + 上下文推断。下面我按由浅入深、实战导向的方式给你讲。


一、反汇编是什么?

反汇编是:

  • 把二进制机器码转成汇编指令
  • 不是源码,但比机器码“可读”
  • 常用于:逆向分析、漏洞分析、调试、理解编译器行为

注意:反汇编 ≠ 反编译

  • 反汇编:汇编指令
  • 反编译:伪 C 代码(如 IDA / Ghidra)

二、先搞懂:CPU 是怎么“想”的(核心模型)

x86 / x64 为例(最常见)

1️⃣ CPU 关心的不是“变量”,而是:

  • 寄存器
  • 内存
  • 指令执行顺序

2️⃣ 常见寄存器(必须认识)

x86(32 位)

EAX  ECX  EDX  EBX
ESP  EBP  ESI  EDI
EIP(指令指针)

x64(64 位)

RAX RCX RDX RBX
RSP RBP RSI RDI
RIP

口诀

  • EAX / RAX:返回值、计算
  • ESP / RSP:栈顶
  • EBP / RBP:栈底(函数帧)
  • EIP / RIP:下一条指令

三、反汇编“看不懂”的主要原因

  1. 没有源码
  2. 编译器优化严重
  3. 不知道函数边界
  4. 不懂调用约定
  5. 被混淆 / 加壳

✅ 解决思路:先抓结构,再抠细节


四、从“函数”开始看(最重要)

1️⃣ 函数典型开头(x86)

push ebp
mov  ebp, esp
sub  esp, 0x10

含义:

  • 保存旧栈帧
  • 建立新栈帧
  • 给局部变量分配空间

2️⃣ 函数结尾

mov esp, ebp
pop ebp
ret

✅ 看到这些,你就知道:

这是一个函数


五、参数和局部变量怎么认?

1️⃣ 参数(调用约定:cdecl / stdcall)

push 2
push 1
call func

函数里:

mov eax, [ebp+8]   ; 第一个参数
mov ecx, [ebp+12]  ; 第二个参数

2️⃣ 局部变量

mov [ebp-4], 10

✅ 记住:

  • ebp+ → 参数
  • ebp- → 局部变量

六、最重要的 10 条汇编指令(够用 80%)

指令 含义
mov 赋值
push 压栈
pop 出栈
call 调用函数
ret 返回
add/sub 加减
cmp 比较
jmp 无条件跳
je/jne/jg/jl 条件跳
lea 取地址

七、控制流怎么看(if / for / while)

1️⃣ if

cmp eax, 0
je  false
...
false:

2️⃣ while

loop_start:
cmp ecx, 0
je  loop_end
...
jmp loop_start
loop_end:

✅ 技巧:

  • cmp + jcc ≈ if
  • 向上跳 ≈ 循环

八、实战:反汇编 → 伪代码

汇编

mov eax, [ebp+8]
add eax, 1
ret

伪代码

int func(int a) {
    return a + 1;
}

九、工具推荐(非常重要)

静态分析

  • IDA Pro(最强)
  • Ghidra(免费、强)
  • Radare2 / Cutter

动态调试

  • x64dbg / OllyDbg
  • gdb + pwndbg

✅ 建议:

先看 Ghidra 的伪 C,再对照汇编


十、学习路线(不踩坑)

✅ 第一阶段(1–2 周)

  • 看懂函数结构
  • 认识寄存器
  • 能找参数和返回值

✅ 第二阶段(1 个月)

  • if / for / while
  • 调用约定
  • 栈变化

✅ 第三阶段

  • 逆向真实程序
  • 分析漏洞
  • 去混淆

十一、一句大实话

反汇编不是“读懂每一行”,而是“猜出它在干什么”

你不需要记住所有指令,只要能回答:

  • 这是函数吗?
  • 它在算什么?
  • 它在判断什么?
  • 它调用了谁?

如果你愿意,我可以:

  • ✅ 带你 逐行分析一段真实反汇编
  • ✅ 给你 x86 / ARM 对照表
  • ✅ 用 CTF 或恶意代码例子
  • ✅ 帮你 从 C → 汇编 → 反汇编闭环理解

你可以直接贴一段汇编,我帮你“翻译”。

0