在 Linux 下对驱动程序(通常是 .ko 内核模块)进行反汇编,常见的做法取决于你拿到的文件形式(.ko 文件、原始 .o 文件,还是已加载到内核中的模块)。下面按常见场景给你一套实用方法。
常用工具:
objdump(binutils)filereadelfgdb(可选)nm(查看符号)addr2line(定位代码行)安装(Debian/Ubuntu):
sudo apt install binutils gdb
.ko 驱动模块(最常见)file mydriver.ko
readelf -h mydriver.ko
objdump -d mydriver.ko > mydriver.asm
-d:反汇编可执行段objdump -M intel -d mydriver.ko > mydriver.asm
先查符号:
nm mydriver.ko | grep my_function
再反汇编:
objdump -M intel -d --start-address=0xADDRESS mydriver.ko
readelf -S mydriver.ko
objdump -h mydriver.ko
重点关注:
.text(代码).init.text(模块初始化).exit.text.rodata/sys + /proc/kcorels /sys/module/mydriver/sections/
cat /sys/module/mydriver/sections/.text
然后用 gdb 加载:
gdb /usr/lib/debug/vmlinux
(gdb) add-symbol-file mydriver.ko 0xTEXT_ADDR
(gdb) disassemble my_function
crash 工具(内核调试)crash vmlinux /proc/kcore
crash> mod -s mydriver
crash> dis my_function
如果 .ko 带 -g 编译:
objdump -S -M intel mydriver.ko
或:
gdb mydriver.ko
(gdb) disassemble /m my_function
指定架构:
objdump -d -m arm mydriver.ko
符号可能被 strip
file mydriver.ko
若为 stripped,用:
objdump -d mydriver.ko
内联与优化
-O2 编译后,函数可能内联法律与合规
file mydriver.ko
readelf -h mydriver.ko
nm mydriver.ko
objdump -M intel -d mydriver.ko > asm.txt
# 定位 init / probe 函数
如果你愿意,可以告诉我:
我可以给你更针对性的反汇编示例。