温馨提示×

linux反汇编如何看函数

小樊
42
2026-09-12 08:25:33
栏目: 智能运维

在 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 0x401136

3. nm / readelf(找函数)

nm ./a.out | grep main
readelf -s ./a.out | grep func

4. 高级工具(推荐)

  • radare2 / rizin
  • Ghidra
  • IDA(最强,但是商业)

二、如何“看函数”

1. 找到函数入口

有符号时:

nm a.out | grep main

输出示例:

0000000000401136 T main

无符号时(strip 过):

  • call 指令
  • 看函数 prologue:
push rbp
mov rbp, rsp
sub rsp, 0x10

2. 反汇编某一个函数

objdump

objdump -d -M intel ./a.out | sed -n '/<main>:/,/^$/p'

gdb

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

3. 识别函数结构(x86-64 为例)

函数开头(prologue)

push rbp
mov rbp, rsp
sub rsp, xxx

函数结束(epilogue)

leave
ret

参数传递(System V ABI)

  • 第1参数:rdi
  • 第2参数:rsi
  • 第3参数:rdx
  • 返回值:rax

示例:

mov edi, 5
call func

局部变量

[rbp-4]   ; int
[rbp-8]   ; long

三、C 与汇编对应关系(快速理解)

C 代码

int add(int a, int b) {
    return a + b;
}

汇编

add:
    push rbp
    mov rbp, rsp
    mov eax, edi
    add eax, esi
    pop rbp
    ret

四、没有符号怎么办?

1. 看 call / ret 模式

call 0x401000
...
ret

2. 用 radare2 自动分析

rizin ./a.out
[0x00000000]> aaa
[0x00000000]> afl
[0x00000000]> pdf @ main

五、实用技巧总结

✅ 看函数:

  • objdump -d
  • gdb disassemble

✅ 找函数:

  • nm
  • readelf -s

✅ 理解函数:

  • prologue / epilogue
  • 参数寄存器
  • 栈帧结构

✅ 进阶:

  • radare2 / Ghidra
  • 结合源码对照

如果你愿意,可以把一段反汇编代码贴出来,我可以直接帮你“逐行翻译成 C 逻辑”。

0