温馨提示×

如何反汇编CentOS内核

小樊
46
2026-08-04 08:41:55
栏目: 智能运维

要反汇编 CentOS 的内核,常见目的有:

  • 分析内核函数实现
  • 调试内核漏洞
  • 学习内核机制
  • 逆向分析驱动或内核模块

下面按 常见场景 + 推荐工具 详细说明。


一、准备条件

1. 确认 CentOS 内核版本

uname -r

示例:

3.10.0-1160.el7.x86_64

2. 安装必要工具

yum install -y binutils gdb objdump nm

如果需要源码级调试(可选):

yum install -y kernel-devel kernel-debuginfo

二、反汇编 CentOS 内核的几种方式


✅ 方法一:直接反汇编 vmlinux(最常用)

1. 找到内核 ELF 文件

CentOS 内核的 未压缩 ELF 内核 在:

/usr/lib/debug/lib/modules/$(uname -r)/vmlinux

如果没有,先安装:

yum install kernel-debuginfo

2. 使用 objdump 反汇编

objdump -d /usr/lib/debug/lib/modules/$(uname -r)/vmlinux > vmlinux.asm

只反汇编某个函数(推荐):

objdump -d vmlinux | grep -A 30 "<do_fork>:"

3. 查看符号表

nm vmlinux | grep do_fork

✅ 方法二:反汇编 /boot/vmlinuz(压缩内核)

/boot/vmlinuz-*压缩后的内核,不能直接反汇编。

1. 解压 vmlinuz

file /boot/vmlinuz-$(uname -r)

如果是 bzImage:

extract-vmlinux /boot/vmlinuz-$(uname -r) > vmlinux

extract-vmlinux 来自内核源码 scripts/extract-vmlinux


2. 再反汇编

objdump -d vmlinux > vmlinux.asm

✅ 方法三:使用 GDB 反汇编(调试级)

1. 启动 GDB

gdb vmlinux

2. 反汇编函数

disassemble start_kernel

或指定地址:

disassemble 0xffffffff81000000

✅ 方法四:反汇编内核模块(LKM)

1. 编译模块时保留符号

objdump -d your_module.ko

2. 反汇编已加载模块

cat /proc/kallsyms | grep your_function

或:

objdump -d /sys/module/your_module/sections/.text

三、推荐工具组合(进阶)

工具 用途
objdump 静态反汇编
gdb 动态调试
radare2 / r2 逆向分析
IDA Pro 商业级内核逆向
nm 查看符号
addr2line 地址 → 源码行

四、常见问题

❓ 为什么反汇编出来是乱码?

  • 使用了 压缩内核
  • 使用了 stripped 内核
  • 架构不匹配(x86 vs ARM)

✅ 解决:使用 vmlinux + kernel-debuginfo


❓ 能不能看到 C 源码?

可以,但需要:

kernel-debuginfo
kernel-devel

GDB 中:

list do_fork

五、典型分析流程(推荐)

1. 安装 kernel-debuginfo
2. 获取 vmlinux
3. objdump -d vmlinux
4. nm vmlinux | grep 函数名
5. gdb vmlinux
6. disassemble 函数

六、示例:反汇编 do_sys_open

objdump -d vmlinux | grep -A 50 "<do_sys_open>:"

如果你愿意,我可以:

  • ✅ 帮你 定位某个系统调用
  • ✅ 教你 从 syscall 到内核函数
  • ✅ 演示 CentOS 7 / 8 / Stream 差异
  • ✅ 结合 KASLR / 内核保护机制

只要告诉我你的 CentOS 版本 + 分析目的 即可。

0