温馨提示×

linux反汇编怎么看调用

小樊
43
2026-09-15 15:04:26
栏目: 智能运维

在 Linux 下“看反汇编里的函数调用”,核心就是 找 call 指令 + 看参数怎么传 + 对照符号/地址。下面按常用场景给你一个实用指南。


一、最常用:用 objdump 看反汇编

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

或针对某个函数:

objdump -d -M intel ./a.out | grep -A 30 "<main>:"

推荐加:

  • -M intel:Intel 语法(比 AT&T 好读)
  • -S:源码+汇编对照(需要 -g 编译)

二、怎么看“调用了谁”

1️⃣ 找 call 指令

call   0x401234
call   printf@plt
call   <foo>

含义:

  • call <函数名> → 有符号,直接知道调谁
  • call 0x401234 → 无符号,需要查地址
  • call *%rax → 函数指针 / 虚函数(间接调用)

2️⃣ 查看被调用函数地址属于谁

objdump -d ./a.out | grep "401234:"
nm ./a.out | grep 401234

或:

addr2line -e ./a.out 0x401234

三、参数怎么看(x86-64 Linux)

✅ System V AMD64 调用约定(Linux 默认)

前 6 个参数:

rdi, rsi, rdx, rcx, r8, r9

第 7 个起:栈

示例:

mov edi, 5
call foo

foo(5)

mov rdi, rax
mov rsi, rbx
call memcpy

memcpy(dest, src)


四、函数开头看“被调用者视角”

push rbp
mov  rbp, rsp
sub  rsp, 0x10

说明:

  • 保存栈帧
  • 局部变量在 rbp-xxx

参数位置:

rbp+0x10  → 第 1 个参数
rbp+0x18  → 第 2 个参数

五、栈上传参(少见但重要)

push 0x10
push rax
call func
add  rsp, 0x10

func(rax, 0x10)


六、动态看调用(强烈推荐)

1️⃣ gdb 实时看调用

gdb ./a.out
break main
run
stepi

看调用:

x/5i $pc
info registers

单步进函数:

si

2️⃣ 打印调用栈

bt

无符号时:

bt full
info frame

七、没有符号怎么办?

file ./a.out
nm ./a.out        # 有符号?
readelf -s ./a.out

strip 过的:

  • 看 PLT / GOT
  • ltrace / strace
ltrace ./a.out
strace -f ./a.out

八、快速判断“调的是系统调用还是库函数”

  • call write@plt → libc
  • syscall → 直接系统调用

九、实战小技巧总结

✅ 看调用顺序:

  • call 在哪
  • 前面寄存器怎么填

✅ 看谁调用我:

  • bt
  • objdumpcall <我>

✅ 看虚函数:

  • call *(%rax)
  • 看对象 vtable

如果你愿意,可以:

  • 贴一段 反汇编代码
  • 或说你是 C / C++ / 恶意分析 / 逆向 / 内核

我可以直接帮你“逐行解释调用关系”。

0