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
.
的扩展开头的文字
我正在尝试从二进制 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_"[=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_KERN_WARNING
被定义为 "<4>"
,KERN_DEFAULT
被定义为 "<d>"
,KERN_CONT
被定义为 "<c>"
.
除了printk
之外,还有其他用于生成内核日志的宏,其中一些宏隐式指定了 KERN_
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
.