温馨提示×

如何反汇编Linux内核函数

小樊
69
2026-10-15 04:44:12
栏目: 智能运维

反汇编 Linux 内核函数通常用于调试、安全分析、性能优化或学习内核机制。下面从准备工作 → 常见方法 → 实用示例系统说明。


一、准备工作

1. 获取带符号的内核

反汇编函数最方便的是使用带调试信息的内核:

  • 发行版:

    # Ubuntu / Debian
    apt install linux-image-$(uname -r)-dbgsym
    apt install linux-tools-common
    
    # RHEL / CentOS
    debuginfo-install kernel
    
  • 自己编译内核(推荐):

    make menuconfig
    # 打开:
    # Kernel hacking → Compile-time checks and compiler options → Debug info
    make -j$(nproc)
    

2. 确定函数地址

grep do_sys_open /proc/kallsyms

示例输出:

ffffffff8123a4c0 T do_sys_open

二、常用反汇编方法

方法 1:使用 objdump(最常用)

适用于 vmlinux(未压缩内核):

objdump -d vmlinux --start-address=0xffffffff8123a4c0 --stop-address=0xffffffff8123a600

反汇编指定函数名:

objdump -d vmlinux | grep -A 50 '<do_sys_open>:'

带源码混合:

objdump -S vmlinux --start-address=0xffffffff8123a4c0 \
        --stop-address=0xffffffff8123a700

方法 2:使用 gdb(交互式)

gdb vmlinux
(gdb) disassemble do_sys_open

带源码:

(gdb) disassemble /m do_sys_open

查看某地址:

(gdb) x/20i 0xffffffff8123a4c0

方法 3:使用 perf(运行时反汇编)

perf top -k vmlinux
# 或
perf record -a -g
perf report -k vmlinux

在报告中可查看函数汇编。


方法 4:使用 bpftrace / ftrace(运行时)

查看函数入口汇编:

cat /sys/kernel/debug/tracing/instances/...

或使用:

bpftrace -e 'kprobe:do_sys_open { @[kstack] = count(); }'

方法 5:对正在运行的内核(/dev/mem 或 /proc/kcore)

gdb vmlinux /proc/kcore
(gdb) disassemble do_sys_open

⚠️ 需要:

  • CONFIG_STRICT_DEVMEM=n
  • root 权限

三、实用示例

示例:反汇编 schedule()

objdump -d vmlinux | awk '/<schedule>:/{flag=1} flag{print} /ret/{if(flag)exit}'

或:

gdb vmlinux
(gdb) disassemble schedule

四、常见问题

Q1:只有 bzImage 怎么办?

需要先解压:

scripts/extract-vmlinux bzImage > vmlinux

Q2:没有调试符号?

  • 只能看到地址和汇编
  • 函数名可能丢失(显示为地址)

Q3:内核模块怎么反汇编?

objdump -d mymodule.ko

五、推荐组合(最佳实践)

✅ 学习内核实现
gdb vmlinux + disassemble /m

✅ 分析性能问题
perf + vmlinux

✅ 安全/漏洞分析
objdump -d -M intel vmlinux


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

  • 你用的是哪个内核版本 / 发行版
  • 想反汇编哪个具体函数
  • 是静态分析还是运行时分析

我可以直接给你针对性命令。

0 踩