在 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 /m main # 混合源码(若有)
nm / readelf(看函数符号)nm ./a.out
readelf -s ./a.out
T / t:代码段函数radare2 / r2IDA ProGhidraobjdump -d ./a.out | less
你会看到:
0000000000401146 <main>:
401146: endbr64
40114a: push rbp
40114b: mov rbp, rsp
...
✅ <main> 就是函数名
file ./a.out
# stripped
这时:
<main>push rbp
mov rbp, rsp
sub rsp, xxx
...
pop rbp
ret
入口通常是:
call 后面的目标地址ret 结束_start 入手_disassemble _start
Linux 程序入口不是 main,而是 _start:
call __libc_start_main
第一个参数通常是 main 地址。
gdb ./a.out
(gdb) start
gdb 会自动停在 main
源码:
int add(int a, int b) {
return a + b;
}
反汇编(Intel):
0000000000401150 <add>:
push rbp
mov rbp, rsp
mov eax, edi
add eax, esi
pop rbp
ret
分析:
edi = aesi = beaxobjdump -d ./a.out | grep -A 30 '<main>'
objdump -d ./a.out | grep call
gdb ./a.out
(gdb) break main
(gdb) run
(gdb) stepi
Linux 反汇编看函数:
- 有符号 → 直接看
<函数名>- 无符号 → 从
_start找main,用push rbp / ret识别函数边界- 工具:
objdump+gdb最常用
如果你有具体程序 / 架构(x86 / ARM) / 想看某个函数,可以贴出来我帮你分析。