在 CentOS(或其他 Linux 发行版) 中,“反汇编指令”通常指用 objdump / gdb / objdump -d 等工具把二进制文件(可执行文件、库、内核模块等)反汇编成 汇编代码。下面从「怎么用」到「怎么读」一步步说明。
objdump -d ./a.out
常用选项:
-d:反汇编可执行代码-D:反汇编所有段(包括数据段)-M intel:使用 Intel 语法(默认是 AT&T)-S:混合反汇编 + 源代码(需要 -g 编译)-l:显示行号示例:
objdump -d -M intel ./a.out
gdb ./a.out
(gdb) disassemble main
或:
(gdb) disassemble /m main # 混合源码
切换语法:
set disassembly-flavor intel
以 objdump -d 为例:
0000000000400526 <main>:
400526: 55 push rbp
400527: 48 89 e5 mov rbp, rsp
40052a: 48 83 ec 10 sub rsp, 0x10
40052e: c7 45 fc 0a 00 00 00 mov DWORD PTR [rbp-0x4], 0xa
地址: 机器码 助记符 操作数
400526: 55 push rbp
mov %rsp, %rbp
movl $0xa, -0x4(%rbp)
特点:
%$b/w/l/q)mov rbp, rsp
mov dword ptr [rbp-4], 0xa
切换:
objdump -M intel
| 指令 | 含义 |
|---|---|
push rbp |
保存栈基址 |
mov rbp, rsp |
建立新栈帧 |
sub rsp, 0x10 |
分配栈空间 |
call func |
调用函数 |
ret |
返回 |
mov [rbp-4], 0xa |
给局部变量赋值 |
cmp / je |
比较 + 跳转 |
lea |
取地址(不是取值) |
C 程序:
int main() {
int a = 10;
return a;
}
反汇编(Intel):
push rbp
mov rbp, rsp
sub rsp, 0x10
mov DWORD PTR [rbp-4], 0xa
mov eax, DWORD PTR [rbp-4]
pop rbp
ret
解读:
a = 10eaxobjdump -d vmlinux
或模块:
objdump -d mymod.ko
你可以直接贴一段 CentOS 下的反汇编输出,我可以:
只要把内容发出来就行。