温馨提示×

linux反汇编如何看调用

小樊
45
2026-09-06 13:31:54
栏目: 智能运维

在 Linux 下进行反汇编并分析函数调用关系,可以从“静态反汇编”和“动态调试”两个角度入手。下面用通俗方式说明常见做法和要看什么。


一、静态反汇编看调用

1. 常用工具

  • objdump:最基础
  • gdb + disassemble
  • IDA(最强,图形化)
  • Ghidra(免费、强大)
  • radare2 / rizin

2. 用 objdump 看调用

objdump -d ./a.out > disasm.txt

看调用主要找:

  • call 指令(x86)
  • bl 指令(ARM)

示例(x86-64):

call   400526 <func_a>
call   400540 <printf@plt>

说明:

  • func_a:本地函数
  • printf@plt:PLT 调用(动态库函数)

3. 看调用约定(很重要)

x86-64(System V ABI)

参数顺序:

rdi, rsi, rdx, rcx, r8, r9, 栈

例如:

mov edi, 1
call func

说明 func(1)

ARM

bl func

参数通常在:

r0, r1, r2, r3

4. 看函数边界

函数通常以:

push rbp
mov rbp, rsp

开始(栈帧)

结束:

pop rbp
ret

这帮你确认“这是一个函数”。


二、动态调试看调用(更直观)

1. gdb 单步 + 反汇编

gdb ./a.out
(gdb) break main
(gdb) run
(gdb) disassemble
(gdb) stepi

看:

  • call 执行前后
  • rip / pc 变化
  • 栈变化

2. 断在调用点

(gdb) break *0x400526

或直接:

(gdb) catch syscall

3. 看调用栈

(gdb) backtrace

能看到:

#0 func_a
#1 main

这是“谁调用了谁”。


三、快速看“调用关系图”

1. 用 objdump + 脚本

提取所有 call

objdump -d ./a.out | grep call

2. 用工具自动生成

  • IDA:Function calls 窗口
  • Ghidra:Function Call Tree
  • nm 看符号:
nm ./a.out

四、常见注意点

1. 静态链接 vs 动态链接

  • printf@plt → 动态
  • 无符号 → 可能是 strip 过的

2. 内联函数

没有 call

直接展开在调用处

3. 尾调用优化

jmp func

不是 call,但语义是调用


五、一句话总结

看调用 = 找 call/bl → 看目标地址 → 看参数寄存器 → 用 gdb 验证栈

如果你愿意,可以:

  • 发一段反汇编代码
  • 告诉我架构(x86 / ARM)
  • 或说你是“看漏洞 / 逆向 / 学编译”的

我可以直接帮你逐行分析。

0