linux 内核图像字符串提取

linux kernel image strings extraction

我正在尝试从二进制 linux 内核映像中提取字符串 (这种特定现象发生在我尝试过的所有类型的图像中:bzImage、vmlinuz、vmlinux、....而不是特定的图像)

简单地 运行 'strings ' 打印许多带有前缀字符的字符串,例如: “4netlink:在进程“%s”中解析属性后剩余 %d 字节。”

但是,查看内核源代码,当前字符串不应包含“4”前缀。 在使用某些 HEX 编辑器打开文件时,我发现该字符串实际上还包括: '\x00\x01' 然后才 '\x34' ("4") 我的猜测是这是指向特殊部分的某种指针,或者类似的东西, 因为许多其他字符串包括“3”和其他数字(甚至字符)。

如果能提供有关此事的任何信息,我们将不胜感激 谢谢!

OP 看到的前缀是 KERN_ 前缀。这些是要添加到主要 printk 格式说明符之前的特殊字符串文字,使用 C 的相邻字符串文字串联。例如:

    printk(KERN_ERR "Something has gone wrong!\n");

从内核版本 3.6 开始,这些 KERN_ 前缀宏在“include/linux/kern_levels.h”中定义,并以 ASCII SOH 字符 "[=14=]1" 开头,后跟作为 ASCII 的日志级别数字级别,或其他一些特殊含义的 ASCII 字符。 KERN_DEFAULT 的字符串在内核版本 5.1 中从 "[=16=]1" "d" 更改为 ""(空字符串)。 KERN_CONT 的字符串在内核版本 4.9 中从 ""(空字符串)更改为 "[=20=]1" "c"

从内核版本 2.6.37 到 3.5.x,KERN_ 前缀宏在“include/linux/printk.h”中定义,并使用不同的格式,在角度之间指定级别括号,例如 KERN_WARNING 被定义为 "<4>"KERN_DEFAULT 被定义为 "<d>"KERN_CONT 被定义为 "<c>".

除了printk之外,还有其他用于生成内核日志的宏,其中一些宏隐式指定了 KERN_ 部分。 OP 的例子来自 "lib/nlattr.c":

        pr_warn_ratelimited("netlink: %d bytes leftover after parsing attributes in process `%s'.\n",
                    rem, current->comm);

这里,pr_warn_ratelimited宏在“include/linux/printk.h”中定义为:

#define pr_warn_ratelimited(fmt, ...)                   \
    printk_ratelimited(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)

那里发生了很多事情,但是 pr_fmt(fmt) 是一个或多个字符串文字,包括 fmt 宏参数,因此传递给 printk_ratelimited 的字符串是由一些连接的字符串构造的以 KERN_WARNING.

的扩展开头的文字