在 Linux 下进行反汇编并寻找“入口”,要先明确你说的入口是哪一种,因为不同场景差别很大:
_startLinux 下可执行文件的真正入口不是 main,而是 _start(由 libc/crt 启动代码调用 main)。
readelf 看入口地址readelf -h a.out
输出中有:
Entry point address: 0x401000
这就是 CPU 执行的第一条指令地址。
objdump 反汇编找 _startobjdump -d a.out | grep -A 20 '<_start>'
或:
objdump -d a.out | less
/ <_start>
gdb a.out
(gdb) info files
会显示:
Entry point: 0x401000
然后:
(gdb) b *0x401000
(gdb) run
main 函数(而非 _start)_start 向后跟_start 会调用:
__libc_start_mainmain 的指针常见模式(x86_64):
mov rdi, main
call __libc_start_main
nm a.out | grep main
如果是** stripped(去符号)**程序:
_start 里传给 __libc_start_main 的第二个参数__libc_start_main 下断点_text / startup_32 / startup_64objdump -d vmlinux | less
/ <startup_64>
入口是:
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
如果你愿意,可以告诉我:
我可以给你更具体的命令和示例。