在 Linux 下“反汇编”通常指把可执行文件 / 目标文件 / 内存中的机器码转换为汇编代码。下面按常见场景给你一个实用指南。
objdump(最常用)适合 ELF 可执行文件、.o 文件。
objdump -d ./a.out
常用选项:
objdump -d -M intel ./a.out # Intel 语法(推荐)
objdump -D ./a.out # 反汇编所有段
objdump -d -S ./a.out # 汇编+源码(需 -g 编译)
示例:
gcc -g -o test test.c
objdump -d -M intel -S test
gdb(调试时反汇编)适合运行中的程序或函数级分析。
gdb ./a.out
GDB 中:
disassemble main
disassemble 0x401000
disassemble /m main # 汇编+源码
设置 Intel 语法:
set disassembly-flavor intel
ndisasm(裸机器码)适合 shellcode / 二进制片段。
ndisasm -b 32 shellcode.bin
ndisasm -b 64 shellcode.bin
readelf(辅助分析)查看段、符号、入口地址。
readelf -h a.out
readelf -S a.out
readelf -s a.out
objdump -d -M intel ./a.out | grep -A 30 "<main>:"
disassemble main
例如:
echo -n "\x55\x48\x89\xe5" > code.bin
ndisasm -b 64 code.bin
或用 Python:
import dis
(Python 是字节码反汇编,不是 x86)
gdb -p <pid>
然后:
info proc mappings
disassemble 0x地址
objdump -D -M intel ./a.out > disasm.txt
gcc -g -o test test.c
objdump -d -M intel -S test | less
或:
gdb ./test
(gdb) set disassembly-flavor intel
(gdb) disassemble main
objdump -d + 地址分析-g:看不到源码gdb + 反汇编更直观如果你愿意,可以告诉我:
我可以给你更针对性的命令示例。