温馨提示×

linux反汇编怎样看调用

小樊
34
2026-09-30 13:45:36
栏目: 智能运维

在 Linux 下进行反汇编并分析“函数调用(call / 调用关系)”,通常可以按下面几个层次来做。


一、常用工具

1. objdump(最基础)

objdump -d ./a.out

或针对某个函数:

objdump -d -M intel ./a.out | grep -A 30 "<main>:"
  • -d:反汇编
  • -M intel:Intel 语法(比 AT&T 好看)
  • 看到 call 指令就是函数调用

示例:

call   0x401136 <foo>

或

call   rax

2. gdb(动态看调用)

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

查看调用栈:

(gdb) backtrace
(gdb) info frame

3. nm / readelf(看符号)

nm ./a.out
readelf -s ./a.out
  • 有符号:能直接看到函数名
  • 无符号(strip):只能看到地址

二、怎么看“谁调用了谁”

1. 静态分析(看 call 指令)

401125: call   401136 <foo>

说明:

  • 401125 处调用了 foo
  • foo 的地址是 401136

如果函数是动态调用:

call   rax

说明调用目标在运行时才确定(虚函数、函数指针)


2. 动态分析(gdb 看调用栈)

(gdb) bt
#0  foo ()
#1  main ()

这就清楚知道:

  • main 调用了 foo

3. 函数入口识别(x86-64)

常见函数开头:

push   rbp
mov    rbp, rsp
sub    rsp, 0x10

或(优化后):

endbr64

返回:

ret

三、如果是 strip 过的程序

1. 用 objdump + 地址

objdump -d ./a.out | less

然后搜:

  • call
  • ret
  • 函数特征(prologue)

2. 用 gdb + 断点

(gdb) break *0x401136
(gdb) run
(gdb) bt

四、快速查看调用关系(进阶)

1. ftrace(内核/用户)

用户态可用:

uftrace ./a.out

2. IDA / Ghidra(推荐逆向)

  • 自动识别函数
  • 图形化调用关系
  • F5 伪代码

五、一个最小示例

C:

void foo(){}
int main(){
    foo();
}

反汇编(Intel):

main:
    call   foo
    ret

如果你愿意,可以告诉我:

  • 是 x86 / x64 / ARM?
  • 是 自己程序 / 第三方二进制?
  • 想 静态分析还是调试?

我可以直接帮你分析具体反汇编代码。

0 踩