下面以 CentOS 7 / 8 为例,系统性地说明 如何反汇编 Linux 内核模块(.ko 文件)。适用于安全分析、驱动调试、逆向学习等场景。
内核模块通常是 .ko 文件:
modinfo your_module.ko
或者查看已加载模块:
lsmod
对应文件通常在:
/lib/modules/$(uname -r)/kernel/
安装:
yum install -y binutils
反汇编整个模块:
objdump -d your_module.ko > module.asm
常用选项:
objdump -d -M intel your_module.ko > module.asm
-d:反汇编可执行段-M intel:使用 Intel 语法(默认是 AT&T)-S:源码+汇编(需要带调试信息)readelf -h your_module.ko
readelf -S your_module.ko
查看:
nm your_module.ko
或:
nm -l your_module.ko
帮助你定位函数名(如 init_module、cleanup_module)。
objdump -d your_module.ko | grep -A 30 "<init_module>"
objdump -d your_module.ko | grep -A 30 "<cleanup_module>"
或:
objdump -d your_module.ko | grep -E "module_init|module_exit"
| 段名 | 作用 |
|---|---|
.text |
主代码 |
.init.text |
初始化代码 |
.exit.text |
卸载代码 |
.rodata |
只读数据 |
.modinfo |
模块信息 |
列出段:
objdump -h your_module.ko
如果模块编译时带 -g:
objdump -S -d your_module.ko > module_with_src.asm
能看到 C 源码 + 汇编混合。
gdb your_module.ko
(gdb) disassemble init_module
gdb vmlinux /proc/kcore
⚠️ 不推荐初学者直接操作 running kernel。
cat /proc/modules
或:
lsmod
cat /sys/module/模块名/sections/.text
结合 /proc/kallsyms 分析运行地址。
file your_module.ko
如果显示 stripped,反汇编结果只有地址:
✅ 解决方案:
/proc/kallsymsaddr2line(如有调试信息)安装 debuginfo:
yum install -y kernel-debuginfo
模块符号通常在:
/usr/lib/debug/lib/modules/$(uname -r)/kernel/
| 工具 | 用途 |
|---|---|
objdump |
反汇编 |
readelf |
ELF 结构 |
nm |
符号 |
gdb |
高级分析 |
r2 / Ghidra / IDA |
高级逆向 |
objdump -d -M intel hello.ko > hello.asm
less hello.asm
搜索:
/init_module
/module_init
即可定位核心逻辑。
如果你愿意,我可以:
直接把模块名或架构(x86_64 / ARM)发我即可。