是否可以通过读取系统内存来从正在运行的系统获取内核映像(bzImage、vmlinuz 等)?
答案1
不,这是不可能的。
基本问题是,尽管内核映像直接加载到内存中,但该映像在内核启动时会发生更改。虽然内核并不是真正的程序,但有关程序编译/加载到内存的方式的许多规则仍然适用。
以下面的C代码为例:
char x=5
int some_function() {
x=100;
}
第一行x=5
告诉编译器将数字 5 放入内存中某个字节中以供稍后使用。当程序运行时,该字节将与其他所有内容一起直接加载到内存中。
后面一行x=100
告诉编译器编写机器代码,执行时将覆盖原始值。因此,如果您从内存中提取正在运行的程序并反编译它,您可能会看到类似这样的内容
char x=100
int some_function() {
x=100;
}
实际上,正在运行的程序已经重写了自身。
与此类似,用户态程序存储在ELF格式。当您运行用户层程序时,程序加载器必须从许多部分组装程序映像。现在内核的规则有点不同,但有相似之处modprobe
它将其他文件加载到正在运行的内核的内存空间中。
因此,虽然您可能会找到一种方法来转储内核的整个内存,但结果实际上看起来不太像原始的内核映像,并且肯定不足以从中启动。
在这里我担心你的最好的选项是去找系统管理员并要求他们提供副本,或请求访问权限。