温馨提示×

怎么反汇编linux内核代码

小樊
36
2026-09-12 08:26:32
栏目: 智能运维

反汇编 Linux 内核代码通常指把编译后的内核镜像(如 vmlinux、bzImage、模块 .ko)还原成汇编代码,用于调试、漏洞分析、性能优化或学习内核机制。下面按常见场景 + 工具 + 示例系统说明。


一、前提准备

1. 需要的东西

  • vmlinux(未压缩、含符号的内核 ELF 文件)
    • 编译内核后位于源码根目录
    • make 时自动生成
  • 内核模块 .ko
  • bzImage(压缩镜像,需先解压)

2. 工具

常用反汇编工具:

  • objdump(最常用)
  • gdb
  • llvm-objdump
  • readelf
  • nm
  • addr2line

二、反汇编整个 vmlinux(最常用)

1. 查看架构

file vmlinux

输出类似:

vmlinux: ELF 64-bit LSB executable, x86-64

2. 反汇编全部代码

objdump -d vmlinux > vmlinux.asm

3. 反汇编并带源码(推荐)

需要编译时开启调试信息:

CONFIG_DEBUG_INFO=y
objdump -S vmlinux > vmlinux_src.asm

三、只反汇编某个函数

1. 查找函数地址

nm vmlinux | grep sys_open

2. 反汇编指定函数

objdump -d vmlinux --start-address=0xffffffff81234560 \
                   --stop-address=0xffffffff81234700

或者:

objdump -d vmlinux | awk '/<sys_open>:/,/^$/'

四、反汇编内核模块(.ko)

1. 基本反汇编

objdump -d my_module.ko

2. 带源码

objdump -S my_module.ko

五、反汇编 bzImage(压缩内核)

bzImage 不能直接反汇编,需要提取 vmlinux

方法 1:使用 extract-vmlinux

scripts/extract-vmlinux bzImage > vmlinux_extracted

然后:

objdump -d vmlinux_extracted

方法 2:使用 binwalk

binwalk -e bzImage

六、使用 GDB 反汇编(调试级)

1. 启动 GDB

gdb vmlinux

2. 反汇编函数

disassemble sys_open

3. 反汇编指定地址

disassemble 0xffffffff81234560, 0xffffffff81234700

4. 混合源码+汇编

disassemble /m sys_open

七、反汇编 + 符号解析(高级)

1. 查看段信息

readelf -S vmlinux

2. 查看符号

nm vmlinux | less

3. 地址 → 源码行

addr2line -e vmlinux 0xffffffff81234560

八、常见用途示例

✅ 分析系统调用实现

objdump -S vmlinux | less
/search sys_call_table

✅ 分析漏洞(如 CVE)

  • 定位函数
  • 查看边界检查
  • 对比补丁前后汇编差异

✅ 内核优化

  • 看是否 inline
  • 看是否冗余指令
  • 看栈使用

九、注意事项

  1. 发行版内核可能 strip

    • 没有符号,反汇编很痛苦
    • 解决:装 linux-image-*-dbgsym
  2. 内核地址是虚拟地址

    • x86_64 通常是 0xffffffff8xxxxxxx
  3. 不要直接反汇编 bzImage

    • 压缩 + 重定位,无意义

十、最小实用命令清单

# 查看函数
nm vmlinux | grep func_name

# 反汇编函数
objdump -d vmlinux | awk '/<func_name>:/,/^$/'

# 带源码
objdump -S vmlinux > kernel.asm

# GDB
gdb vmlinux
(gdb) disassemble func_name

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

  • 你是 x86 / ARM / RISC-V
  • 学习 / 调试 / 漏洞分析 / 性能
  • 用的是 自己编译的内核还是发行版内核

我可以给你更精确的命令和操作流程。

0