在 Linux 下进行反汇编并看懂汇编代码,通常分为三步:拿到二进制 → 反汇编 → 读汇编。下面用实用角度讲清楚。
objdump -d ./a.out
常用参数:
objdump -d -M intel ./a.out # Intel 语法(推荐)
objdump -S ./a.out # 汇编 + 源码对照
objdump -d -M intel -l ./a.out
gdb ./a.out
(gdb) disassemble main
(gdb) set disassembly-flavor intel
(gdb) layout asm
r2 -d ./a.out
pdf @ main
push rbp
mov rbp, rsp
sub rsp, 0x10
含义:
| 参数 | 寄存器 |
|---|---|
| 第1个 | rdi |
| 第2个 | rsi |
| 第3个 | rdx |
| 第4个 | rcx |
示例:
foo(1, 2);
mov edi, 1
mov esi, 2
call foo
mov DWORD PTR [rbp-4], 10
表示:
int a = 10;
cmp eax, 0
je .L1
对应:
if (x == 0) goto L1;
常见:
je = ==jne = !=jg / jl = > / <.Loop:
...
cmp ecx, 10
jl .Loop
对应:
for (i = 0; i < 10; i++)
leave
ret
等价于:
return;
✅ 先对照 C 源码
gcc -g -O0 -o test test.c
objdump -S test
✅ 从 main 开始看
✅ 关注寄存器
rax:返回值rsp/rbp:栈rdi/rsi/rdx:参数C 代码:
int add(int a, int b) {
return a + b;
}
汇编:
add:
mov eax, edi
add eax, esi
ret
objdump -S如果你愿意,可以:
我可以直接帮你“翻译 + 解释”。