如何将 vmlinuz 解压为 vmlinux?

如何将 vmlinuz 解压为 vmlinux?

我已经尝试过解压缩、gzip 和谷歌搜索结果中出现的所有其他解决方案,但这些对我来说都没有用。

要获取图像,请搜索 GZ 签名 - 1f 8b 08 00

> od -A d -t x1 vmlinuz | grep '1f 8b 08 00'
0024576 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45

因此图像从 开始24576+8 => 24584。然后只需从该点复制图像并解压缩 -

> dd if=vmlinuz bs=1 skip=24584 | zcat > vmlinux
1450414+0 records in
1450414+0 records out
1450414 bytes (1.5 MB) copied, 6.78127 s, 214 kB/s

从在线论坛逐字逐句地获得了以下说明:http://www.codeguru.com/forum/showthread.php?t=415186

这个过程对我来说不起作用,最终给出错误,指出未找到文件 0024576 和所有后续数字。

我如何从 vmlinuz 中提取 vmlinux?

谢谢。

已编辑:这是一个逆向工程问题。我无法访问发行版来安装任何 RPM 或重新编译。我只从 vmlinuz 开始。

答案1

答案2

也许你误解了该帖子作者的意思。

  1. vmlinuz文件除了包含 gzip 压缩的内容外,还包含其他内容,因此您需要找出 gzip 压缩内容的起始位置。为此,请使用:

    od -A d -t x1 vmlinuz | grep '1f 8b 08 00'
    

    这段代码的作用是向你展示 gzip 头在文件中的位置。输出如下:

    0024576 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45
    

    这意味着0024576在文件中的 (至少对于帖子的作者而言,您的位置可能完全不同)处vmlinuz,您将找到二进制值“ 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45”。您要查找的1f 8b 08 00可以从字符 9 开始找到,或者在0024576 + 8(从 0 开始计数)处找到= 24584

  2. 现在您知道了 gzip 压缩内容的起始位置(位置24584),您可以使用它dd来提取该 gzip 压缩内容并解压缩它。为此,请使用:

    dd if=vmlinuz bs=1 skip=24584 | zcat > vmlinux
    

    第一个命令将查找该位置并将所有内容复制到 stdout。zcat然后将解压缩从 stdin 获取的所有内容并将未压缩的字符串输出到 stdout。然后,将的输出>重定向zcat到名为 的新文件vmlinux

答案3

实际上,在生成vmlinuz文件之前,大多数符号都被删除了。因此您无法vmlinux从重建真正的文件vmlinuz,该文件对于调试来说将没有那么有用。

答案4

现代内核并不总是(事实上,通常不是)使用 gzip 压缩。它们可能使用 bzip2 或 LZMA。快速的网络搜索并没有帮助我找到这些压缩方法的魔法字符串——你最好检查几个内核映像以找到包含解压缩代码的不变头。

相关内容