gnu工具

非常专业的问题,确实,仅靠 GNU 工具链(如 stringsnmobjdumpreadelf无法覆盖 .ko 文件所有层面的信息。如果你要深入查看一个 .ko 模块的“完整详细信息”,尤其是用于内核调试、逆向、运行时分析等场景,以下是全面的工具链和层级分析视角:


🧠 一份系统性方案:查看 .ko 模块全信息(从静态到动态)

级别工具集能力说明示例命令或说明
🔹基本信息 file, modinfo 类型、vermagic、依赖模块、作者等 modinfo foo.ko
🔹字符串 strings, grep 查看源码中硬编码字符串、日志等 strings foo.ko | grep -i debug
🔹符号表 nm, readelf, objdump 导出符号、全局变量、函数地址 nm foo.ko, readelf -s foo.ko
🔹反汇编 objdump, llvm-objdump 汇编级分析 .text.init 等段 objdump -D foo.ko
🔹调试信息 dwarfdump, eu-readelf, pahole 若含 DWARF,查看结构体、行号映射 dwarfdump foo.kopahole foo.ko
🔹结构体字段 pahole 显示模块中结构体的完整字段 pahole -C my_struct foo.ko
🔹动态行为 dmesg, insmod, kmod, /proc/modules 查看加载后行为、初始化失败等 dmesg, lsmod, cat /proc/modules
🔹调试接口 gdb, kprobe, ftrace, perf, bpftrace 实时监控模块内部函数、变量变化 perf probe, bpftrace -e 'kprobe:function { trace(...) }'
🔹运行符号表 /proc/kallsyms, /sys/module/ 加载后可查看运行时符号、状态 cat /proc/kallsyms | grep myfunc
🔹模块参数 /sys/module/<mod>/parameters/ 查看模块参数、状态 cat /sys/module/foo/parameters/*
🔹依赖关系 modinfo, depmod, lsmod 查看依赖模块及加载顺序 modinfo foo.ko, lsmod
🔹ELF 详细分析 elfutils(eu-*)工具集 高级 ELF 结构分析 eu-readelf, eu-objdump
🔹逆向分析 Ghidra, IDA Pro, Binary Ninja 图形化反汇编与控制流分析 Ghidra 打开 .ko 分析结构体与函数调用
🔹内核源码关联 CONFIG_DEBUG_INFO, make modules 编译 .ko 时开启调试符号 CONFIG_DEBUG_INFO=y

🧩 样例:查看结构体、字段、行号

如果你的 .ko 模块是调试编译带 DWARF 的,你可以这样查看结构体字段:

pahole foo.ko | grep my_struct

或者查看某函数的调试位置(行号、变量):

dwarfdump foo.ko | grep -A10 "DW_TAG_subprogram"

🛠 推荐工具安装指令(Debian/Ubuntu)

sudo apt install binutils elfutils dwarves pahole bpftrace linux-tools-$(uname -r) gdb

🚦 如果你觉得 GNU 工具不够全,推荐重点扩展这些:

类型替代/补强工具特别能力
ELF 分析 elfutils (eu-objdump, eu-readelf) 支持 DWARF 更好
调试信息 dwarfdump, pahole 查看结构体/函数行号
动态探测 perf, kprobe, ftrace, bpftrace 实时追踪模块函数
控制流分析 Ghidra, IDA, radare2 逆向/图形化分析
tracepoint trace-cmd, kernelshark 图形化分析内核行为
自动分析脚本 自写 shell/python 脚本 一键串联以上工具

✅ 示例:一键分析脚本框架(bash)

#!/bin/bash
ko=$1
echo "====== [file] ======"
file "$ko"
echo "====== [modinfo] ======"
modinfo "$ko"
echo "====== [nm] ======"
nm -n "$ko" | head -20
echo "====== [strings] ======"
strings "$ko" | grep -i -E 'debug|log|version|usage' | head -20
echo "====== [readelf] ======"
readelf -h "$ko"

步骤工具作用
1️⃣ readlink /proc/$pid/exe 定位真实 ELF
2️⃣ file + ldd 判断语言与链接方式
3️⃣ readelf -h -S -r -s 看符号/节表状态
4️⃣ objdump -D -M intel 反汇编 _start 流程
5️⃣ readelf -x .init_array 查 constructor 注册
6️⃣ gdb -p <pid> 动态查看堆栈与线程
7️⃣ cat /proc/$pid/maps 确认代码段与库映射
8️⃣ perf top -p $pid 确认循环热点(event loop)

 

组别工具 / 可执行说明(用途)常用命令 / 典型子命令 / 备注
基础文件与文本处理(coreutils) coreutils(包) UNIX 基本命令集合(文件/文本/目录/权限等) ls, cp, mv, rm, ln, chmod, chown, cat, tac, tac, head, tail, cut, paste, sort, uniq, tr, wc, comm, split, cksum, md5sum, sha256sum, dirname, basename, date, sleep, seq, echo, printf
二进制分析(binutils) objdump 反汇编、段/节查看 objdump -d, objdump -D, objdump -t, objdump -R
  nm 符号表(.symtab / .dynsym)查看 nm -n, nm -D
  readelf ELF 头、节、段、符号、动态段查看(比 objdump 更专注 ELF) readelf -h -S -l -s -r -x .init_array
  strings 打印可打印字符串 strings /path/to/bin
  addr2line / eu-addr2line 地址->源文件:行(用在有调试符号时) addr2line -e binary 0xADDR
  ar, ranlib, strip, size 静态库/符号/剥离/大小 ar rcs lib.a, strip binary, size binary
C/C++ 编译工具链(GCC 系列) gcc / g++ / cc C/C++ 编译器前端 gcc -g -O2, g++ -g
  ld (GNU ld) 链接器(也可能用 gold/lld 链接脚本与入口控制
  as (GNU assembler) 汇编器 as file.s
运行时 / libc / 动态链接 ldd 显示动态库依赖 ldd /proc/<pid>/exe
  ldconfig / /usr/lib/debug (debug info) 调试符号安装/查找 readelf -n 查 Build-ID
调试器与动态调试 gdb 用户态调试 / 动态 attach / backtrace gdb -p PID, bt, thread apply all bt
  gdbserver 远端调试服务 gdbserver :1234 /path/bin
构建系统 / 自动化 make (GNU make) 构建规则执行 make, make -j
  autoconf / automake / libtool Autotools 系列,生成 configure/Makefile.in ./configure, autoreconf
  cmake(非 GNU,但常见) 现代构建系统(列出以便区分) cmake . && make
文本匹配 / 过滤 grep (GNU grep) 正则搜索 grep -R, grep -P
  sed (GNU sed) 流编辑 sed -n '1,100p'
  awk / gawk 文本处理/脚本 awk '{print $1}'
文件归档 / 压缩 tar (GNU tar) 打包与解包 tar -cvf, tar -xzf
  gzip / gunzip 压缩 gzip file
  bzip2 / xz 其它压缩格式 xz -d file.xz
比较 / 打补丁 diff / diffutils 比较文件 diff -u a b
  patch 应用补丁 patch -p1 < fix.patch
查找 / 文件定位 find / locate (findutils) 文件查找 find / -name binary
  which, type (shell builtins/paths) 命令路径 which gcc
过程/任务工具(procps/psmisc) ps / top / kill / pgrep 进程查看与管理 ps aux, pgrep -f name, kill -9 PID
系统级工具(util-linux) mount, umount, nsenter, chroot 挂载/命名空间/环境管理 nsenter -t PID -a bash
性能与追踪(非纯 GNU,但常用) perf (Linux perf) 性能采样 / 火焰图 perf top -p PID, perf record -p PID
  strace / ltrace 系统调用 / 库调用跟踪 strace -f -p PID
  systemtap / bcc / bpftrace 内核 & eBPF 跟踪(高级) bpftrace -e 'tracepoint:...'
其它有用 GNU/类 GNU 工具 xxd / hexdump 十六进制查看 xxd file
  tpl / gettext(国际化) 本地化工具 msgfmt
  m4 宏处理(autotools 依赖) m4
调试符号 / 源映射 eu-readelf / eu-addr2line(elfutils) 与 readelf/addr2line 类似(非 GNU binutils) eu-readelf -n
开发辅助 git(非 GNU) 版本控制(列出以便工具链完整) git log, git bisect

posted on 2025-07-07 20:50  吃草的青蛙  阅读(28)  评论(0)    收藏  举报

导航