温馨提示×

linux反汇编怎样找入口

小樊
56
2026-09-30 13:49:36
栏目: 智能运维

在 Linux 下进行反汇编并寻找“入口”,要先明确你说的入口是哪一种,因为不同场景差别很大:


一、程序入口(最常用)

1. 用户态 ELF 程序入口:_start

Linux 下可执行文件的真正入口不是 main,而是 _start(由 libc/crt 启动代码调用 main)。

方法 1:用 readelf 看入口地址

readelf -h a.out

输出中有:

Entry point address: 0x401000

这就是 CPU 执行的第一条指令地址。

方法 2:用 objdump 反汇编找 _start

objdump -d a.out | grep -A 20 '<_start>'

或:

objdump -d a.out | less
/ <_start>

方法 3:用 GDB

gdb a.out
(gdb) info files

会显示:

Entry point: 0x401000

然后:

(gdb) b *0x401000
(gdb) run

二、找 main 函数(而非 _start)

1. 从 _start 向后跟

_start 会调用:

  • __libc_start_main
  • 其中包含 main 的指针

常见模式(x86_64):

mov rdi, main
call __libc_start_main

2. 用符号表

nm a.out | grep main

如果是** stripped(去符号)**程序:

  • 看 _start 里传给 __libc_start_main 的第二个参数
  • 或用 GDB 在 __libc_start_main 下断点

三、内核 / 模块入口

1. Linux 内核入口

  • x86:_text / startup_32 / startup_64
  • 用:
objdump -d vmlinux | less
/ <startup_64>

2. 内核模块

入口是:

module_init(xxx_init)

反汇编中找:

xxx_init:

四、动态库(.so)入口

动态库没有程序入口,但有:

  • 初始化函数(.init / .ctors)
  • 用:
readelf -d xxx.so

五、实用工具总结

目的 工具
看入口地址 readelf -h
反汇编 objdump -d
动态调试 gdb
符号 nm / strings
去符号分析 radare2 / IDA

六、一句话总结

Linux 程序入口 = ELF 的 Entry Point = _start,不是 main

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

  • 是 用户程序 / 内核 / 驱动 / 固件
  • 是否 stripped
  • 用的架构(x86 / ARM)

我可以给你更具体的命令和示例。

0 踩