Linux内核图像字符串提取



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

简单地运行'strings '打印出许多带前缀字符的字符串,例如:4">Netlink:解析进程' %s'."属性后剩余%d字节

但是,查看内核源代码,当前字符串不应该包含"4"前缀。在使用一些十六进制编辑器打开文件时,我看到字符串实际上还包括:'x00x01',然后是'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字符"01"开头,后跟日志级别作为数字级别的ASCII数字,或其他一些ASCII字符用于特殊含义。KERN_DEFAULT的字符串在内核版本5.1中由"01" "d"变为""(空字符串)。KERN_CONT的字符串在内核版本4.9中由""(空字符串)变为"01" "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/nlatr .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展开的字量开始的串接字符串字量构造的。

最新更新