温馨提示×

linux反汇编怎样看函数

小樊
37
2026-10-03 11:38:45
栏目: 智能运维

在 Linux 下进行反汇编并“看函数”,通常是为了分析二进制程序(无源码或调试逆向)。下面从工具、方法、怎么识别函数、常见示例几个方面讲。


一、常用工具

1. objdump(最基础)

objdump -d ./a.out
  • -d:反汇编所有可执行段
  • 配合 -M intel 用 Intel 语法(更直观)
objdump -d -M intel ./a.out

2. gdb(动态 + 反汇编)

gdb ./a.out
(gdb) disassemble main

或:

(gdb) disassemble /m main   # 混合源码(若有)

3. nm / readelf(看函数符号)

nm ./a.out
readelf -s ./a.out
  • T / t:代码段函数
  • 有符号时可直接看到函数名

4. 高级逆向工具

  • radare2 / r2
  • IDA Pro
  • Ghidra

二、如何“看函数”

1️⃣ 有符号的程序(最简单)

objdump -d ./a.out | less

你会看到:

0000000000401146 <main>:
  401146: endbr64
  40114a: push   rbp
  40114b: mov    rbp, rsp
  ...

✅ <main> 就是函数名


2️⃣ 没有符号(strip 过的程序)

file ./a.out
# stripped

这时:

  • 没有 <main>
  • 只能靠函数特征判断

函数典型特征(x86-64)

push rbp
mov  rbp, rsp
sub  rsp, xxx
...
pop  rbp
ret

入口通常是:

  • call 后面的目标地址
  • ret 结束

三、怎么定位“main 函数”

方法 1:从 _start 入手

_disassemble _start

Linux 程序入口不是 main,而是 _start:

call __libc_start_main

第一个参数通常是 main 地址。


方法 2:用 gdb 自动识别

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 = a
  • esi = b
  • 返回值在 eax

五、实用技巧

只看某个函数

objdump -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) / 想看某个函数,可以贴出来我帮你分析。

0 踩