在 Linux 下进行反汇编并“看函数”,通常分为 定位函数 → 反汇编函数 → 理解函数结构 三步。下面用常见工具和实践方式系统讲一下。
objdump(最基础)objdump -d ./a.out
-d:反汇编可执行代码-M intel 使用(Intel 语法更直观)objdump -d -M intel ./a.out
gdb(动态 + 静态结合)gdb ./a.out
(gdb) disassemble main
或指定函数地址:
(gdb) disassemble 0x401136
nm / readelf(找函数)nm ./a.out | grep main
readelf -s ./a.out | grep func
radare2 / rizinGhidraIDA(最强,但是商业)有符号时:
nm a.out | grep main
输出示例:
0000000000401136 T main
无符号时(strip 过):
call 指令push rbp
mov rbp, rsp
sub rsp, 0x10
objdump -d -M intel ./a.out | sed -n '/<main>:/,/^$/p'
gdb ./a.out
(gdb) disassemble main
示例输出:
Dump of assembler code for function main:
0x0000000000401136 <+0>: push rbp
0x0000000000401137 <+1>: mov rbp,rsp
0x000000000040113a <+4>: sub rsp,0x10
0x000000000040113e <+8>: mov DWORD PTR [rbp-4],0
0x0000000000401145 <+15>: leave
0x0000000000401146 <+16>: ret
push rbp
mov rbp, rsp
sub rsp, xxx
leave
ret
示例:
mov edi, 5
call func
[rbp-4] ; int
[rbp-8] ; long
int add(int a, int b) {
return a + b;
}
add:
push rbp
mov rbp, rsp
mov eax, edi
add eax, esi
pop rbp
ret
call 0x401000
...
ret
rizin ./a.out
[0x00000000]> aaa
[0x00000000]> afl
[0x00000000]> pdf @ main
✅ 看函数:
objdump -dgdb disassemble✅ 找函数:
nmreadelf -s✅ 理解函数:
✅ 进阶:
如果你愿意,可以把一段反汇编代码贴出来,我可以直接帮你“逐行翻译成 C 逻辑”。