如何将 vmlinuz 解压缩到 vmlinux?

Lor*_*oh. 22 linux compression gzip linux-kernel 7-zip

我已经尝试过解压缩、gzip 和所有其他作为 google 结果出现的解决方案,但这些对我不起作用。

要仅获取 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
Run Code Online (Sandbox Code Playgroud)

所以图像开始于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
Run Code Online (Sandbox Code Playgroud)

从在线论坛逐字获得这些说明:http : //www.codeguru.com/forum/showthread.php? t=415186

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

如何继续从 vmlinuz 中提取 vmlinux?

谢谢你。

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

小智 33

也许你误解了那篇文章的作者的意思。

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

    od -A d -t x1 vmlinuz | grep '1f 8b 08 00'
    
    Run Code Online (Sandbox Code Playgroud)

    这样做是为了向您展示在该文件中可以找到 gzip 标头的位置。输出看起来像:

    0024576 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45
    
    Run Code Online (Sandbox Code Playgroud)

    这意味着在文件中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(start count from 0) = 24584

  2. 现在您知道 gzip 压缩的内容从哪里开始(在 position 24584),您可以使用它dd来提取 gzip 压缩的内容并将其解压缩。为此,请使用:

    dd if=vmlinuz bs=1 skip=24584 | zcat > vmlinux
    
    Run Code Online (Sandbox Code Playgroud)

    第一个命令将寻找该位置并将所有内容复制到标准输出。zcat然后将解压缩它从标准输入获取的所有内容并将未压缩的字符串输出到标准输出。然后>将把zcat输出重定向到一个名为vmlinux.


nin*_*alj 7

实际上,在生成vmlinuz文件之前,大多数符号都被剥离了。所以你不能vmlinux从重建一个真正vmlinuz的文件,该文件对调试没有用。