user Asked: 2019-05-23 09:18:49 +0800 CST2019-05-23 09:18:49 +0800 CST 2019-05-23 09:18:49 +0800 CST 从正在运行的系统中提取内核 772 是否可以通过读取系统内存从正在运行的系统中获取内核映像(bzImage、vmlinuz 等)? linux linux-kernel 1 个回答 Voted Best Answer Philip Couling 2019-05-25T06:59:36+08:002019-05-25T06:59:36+08:00 不,这是不可能的。 基本问题是,尽管内核映像直接加载到内存中,但该映像在内核启动的那一刻就发生了变化。虽然内核并不是真正的程序,但关于程序编译/加载到内存的方式的许多规则仍然适用。 以下面的 C 代码为例: char x=5 int some_function() { x=100; } 第一行x=5告诉编译器将数字 5 放在内存中某个字节的某个字节中以供以后使用。当程序运行时,这个字节将与其他所有内容一起直接加载到内存中。 后一行x=100告诉编译器编写机器代码,执行时将覆盖原始值。因此,如果您从内存中提取正在运行的程序并对其进行反编译,您可能会看到类似这样的内容 char x=100 int some_function() { x=100; } 实际上,正在运行的程序已经重写了自己。 与此类似,用户级程序以ELF 格式存储。当你运行一个用户态程序时,程序加载器必须从许多部分组装程序映像。现在内核的规则有点不同,但是有一个并行的方法,modprobe可以将其他文件加载到正在运行的内核的内存空间中。 因此,虽然您可能会找到一种方法来转储内核的整个内存,但结果实际上看起来与原始内核映像不太一样,而且肯定不足以从它启动。 在这里,恐怕您最好的选择是去系统管理员那里向他们索取副本,或者索要访问权限。
不,这是不可能的。
基本问题是,尽管内核映像直接加载到内存中,但该映像在内核启动的那一刻就发生了变化。虽然内核并不是真正的程序,但关于程序编译/加载到内存的方式的许多规则仍然适用。
以下面的 C 代码为例:
第一行
x=5
告诉编译器将数字 5 放在内存中某个字节的某个字节中以供以后使用。当程序运行时,这个字节将与其他所有内容一起直接加载到内存中。后一行
x=100
告诉编译器编写机器代码,执行时将覆盖原始值。因此,如果您从内存中提取正在运行的程序并对其进行反编译,您可能会看到类似这样的内容实际上,正在运行的程序已经重写了自己。
与此类似,用户级程序以ELF 格式存储。当你运行一个用户态程序时,程序加载器必须从许多部分组装程序映像。现在内核的规则有点不同,但是有一个并行的方法,
modprobe
可以将其他文件加载到正在运行的内核的内存空间中。因此,虽然您可能会找到一种方法来转储内核的整个内存,但结果实际上看起来与原始内核映像不太一样,而且肯定不足以从它启动。
在这里,恐怕您最好的选择是去系统管理员那里向他们索取副本,或者索要访问权限。