反汇编 Linux 内核模块(.ko 文件)通常用于调试、安全分析或学习内核机制。下面从工具准备、基本方法、常见技巧三个方面说明。
常用工具:
objdump(GNU binutils,必备)file(查看模块信息)readelf(查看 ELF 结构)gdb(配合 vmlinux 可做符号级分析)nm / addr2line(符号与地址转换)一般系统已自带:
which objdump readelf nm
file my_module.ko
readelf -h my_module.ko
objdump -d my_module.ko > my_module.asm
常用选项:
-d:反汇编可执行段-S:源码+汇编(若有调试信息)-r:显示重定位信息(很重要)-l:显示行号示例(含源码):
objdump -Sdr my_module.ko
内核模块包含重定位项,函数地址在 insmod 时才确定。
查看重定位:
readelf -r my_module.ko
objdump -r my_module.ko
例如:
R_X86_64_PC32 printk
说明调用了 printk,但地址未定。
nm my_module.ko
常见符号类型:
T:文本(函数)U:未定义(外部符号,如内核函数)D/B:数据段过滤函数:
nm my_module.ko | grep ' T '
先找地址:
nm my_module.ko | grep my_func
再反汇编:
objdump -d --start-address=0xADDR my_module.ko
模块加载后地址已固定。
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_INFOftrace / kprobe 辅助定位函数入口后再反汇编更精准。
rdi, rsi, rdx)如果你愿意,可以告诉我:
我可以给你更具体的命令或示例。