反汇编 Linux 内核代码通常指把编译后的内核镜像(如 vmlinux、bzImage、模块 .ko)还原成汇编代码,用于调试、漏洞分析、性能优化或学习内核机制。下面按常见场景 + 工具 + 示例系统说明。
make 时自动生成.ko常用反汇编工具:
objdump(最常用)gdbllvm-objdumpreadelfnmaddr2linefile vmlinux
输出类似:
vmlinux: ELF 64-bit LSB executable, x86-64
objdump -d vmlinux > vmlinux.asm
需要编译时开启调试信息:
CONFIG_DEBUG_INFO=y
objdump -S vmlinux > vmlinux_src.asm
nm vmlinux | grep sys_open
objdump -d vmlinux --start-address=0xffffffff81234560 \
--stop-address=0xffffffff81234700
或者:
objdump -d vmlinux | awk '/<sys_open>:/,/^$/'
objdump -d my_module.ko
objdump -S my_module.ko
bzImage 不能直接反汇编,需要提取 vmlinux。
scripts/extract-vmlinux bzImage > vmlinux_extracted
然后:
objdump -d vmlinux_extracted
binwalk -e bzImage
gdb vmlinux
disassemble sys_open
disassemble 0xffffffff81234560, 0xffffffff81234700
disassemble /m sys_open
readelf -S vmlinux
nm vmlinux | less
addr2line -e vmlinux 0xffffffff81234560
objdump -S vmlinux | less
/search sys_call_table
发行版内核可能 strip
linux-image-*-dbgsym内核地址是虚拟地址
0xffffffff8xxxxxxx不要直接反汇编 bzImage
# 查看函数
nm vmlinux | grep func_name
# 反汇编函数
objdump -d vmlinux | awk '/<func_name>:/,/^$/'
# 带源码
objdump -S vmlinux > kernel.asm
# GDB
gdb vmlinux
(gdb) disassemble func_name
如果你愿意,可以告诉我:
我可以给你更精确的命令和操作流程。