温馨提示×

如何反汇编linux内核模块

小樊
49
2026-09-03 09:12:55
栏目: 智能运维

反汇编 Linux 内核模块(.ko 文件)通常用于调试、安全分析或学习内核机制。下面从工具准备、基本方法、常见技巧三个方面说明。


一、准备工具

常用工具:

  • objdump(GNU binutils,必备)
  • file(查看模块信息)
  • readelf(查看 ELF 结构)
  • gdb(配合 vmlinux 可做符号级分析)
  • nm / addr2line(符号与地址转换)

一般系统已自带:

which objdump readelf nm

二、基本反汇编方法

1. 查看模块基本信息

file my_module.ko
readelf -h my_module.ko

2. 反汇编整个模块

objdump -d my_module.ko > my_module.asm

常用选项:

  • -d:反汇编可执行段
  • -S:源码+汇编(若有调试信息)
  • -r:显示重定位信息(很重要)
  • -l:显示行号

示例(含源码):

objdump -Sdr my_module.ko

三、针对内核模块的关键点

1. 模块是“未链接完成”的 ELF

内核模块包含重定位项,函数地址在 insmod 时才确定。

查看重定位:

readelf -r my_module.ko
objdump -r my_module.ko

例如:

R_X86_64_PC32 printk

说明调用了 printk,但地址未定。


2. 查看导出的符号

nm my_module.ko

常见符号类型:

  • T:文本(函数)
  • U:未定义(外部符号,如内核函数)
  • D/B:数据段

过滤函数:

nm my_module.ko | grep ' T '

3. 反汇编指定函数

先找地址:

nm my_module.ko | grep my_func

再反汇编:

objdump -d --start-address=0xADDR my_module.ko

四、进阶方式(更“真实”的反汇编)

1. 已加载模块的反汇编(最准确)

模块加载后地址已固定。

ls /sys/module/my_module/sections/
cat /sys/module/my_module/sections/.text

gdb + /proc/kcore

gdb vmlinux /proc/kcore
(gdb) add-symbol-file my_module.ko 0xTEXT_ADDR
(gdb) disassemble my_func

⚠️ 需要:

  • 内核开启 CONFIG_DEBUG_INFO
  • root 权限

2. 使用 ftrace / kprobe 辅助

定位函数入口后再反汇编更精准。


五、常见用途示例

  • 分析 rootkit / 恶意模块
  • 理解内核 API 调用方式
  • 调试 Oops 地址
  • 学习内核模块编译结果

六、注意事项

  • 反汇编 ≠ 源码,需熟悉:
    • x86 / ARM 汇编
    • 调用约定(如 x86_64 的 rdi, rsi, rdx
  • 模块可能:
    • 被 strip
    • 使用内联汇编
    • 启用了编译器优化

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

  • 模块架构(x86 / ARM)
  • 是否已加载
  • 目的是调试还是安全分析

我可以给你更具体的命令或示例

0