如何将vmlinuz解压缩为vmlinux?


20

我已经尝试过解压缩,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开始。


2
为什么要这样做?
Flimzy 2011年

这实际上是给一个不得不做些事情的朋友的。这个问题似乎很有趣,我出于学术兴趣追求了这个问题。替代方法是构建内核:-/

好吧,出于学术兴趣,我不知道这是否容易实现。我相信vmlinuz内核具有可执行的序言-本质上是自解压存档。这就是为什么使用直线型Gunzip无法为您服务的原因。引用的方法尝试跳过该序言。为什么不起作用,我不确定。也许其他具有相似学术兴趣的人可以为您提供有用的答案。:)
Flimzy 2011年

Answers:


30

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

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

    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. 现在您知道了压缩内容的起始位置(在位置24584),您可以dd提取该压缩内容并对其进行解压缩。为此,请使用:

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

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


谢谢!现在这很有意义。但是,执行几秒钟后,“ 1f 8b 08 00”也没有为我的内核返回任何内容。显然,代码已更改。关于如何获得新的幻数集的任何建议?

@Loh Loh .:两种可能性:1)魔数越过od输出中的线边界。使用bgrep搜索1f8b0800。2)使用其他算法压缩内核。尝试fd377a585a00XZ425a6839bzip2的
grawity 2011年

@ grawity-谢谢您的答复。我试过了 1f8b0800,fd377a585a00和425a6839均未返回任何结果。于是,我开始按字节砍伐magic字符串字节,直到我得到了一些成绩,而且他们上百场比赛的:-(所以我仍然没有成功。
主蕙。

根据minimodding.com/…,LZMA为“ 5d 00 00 80” 。仍然没有为我工作。
山姆·布莱曼2012年

27

1
这在Ubuntu 14.04中可用吗?我在git repo中看到了它,可以在哪个ubuntu包中找到它?-谢谢:-)
卢勋爵。

@LordLoh apt-file search extract-vmlinux提供了几个linux内核头文件包,并locate extract-vmlinux在我的本地Ubuntu 18.04计算机上产生了一些问题:/usr/src/linux-headers-4.15.0-33/scripts/extract-vmlinux尽管PATH看起来没有任何帮助。
Ciro Santilli新疆改造中心法轮功六四事件

对于ARM它失败“提取物的vmlinux:找不到的vmlinux”:unix.stackexchange.com/questions/352215/...
西罗桑蒂利新疆改造中心法轮功六四事件

7

实际上,在生成vmlinuz文件之前,会删除大多数符号。因此,您无法vmlinux从重建true vmlinuz,该文件将对调试没有用。


2

我遇到一个简单的问题-寻找崩溃的正确版本的vmlinux。而不是尝试将vmlinuz解压缩为vmlinux。

更好的解决方案是:安装RPM kernel-debuginfo:,该RPM包含正确的vmlinux文件。

注意rpm名称,有多个相似(令人困惑)的名称。得是:kernel-debuginfo-$(version).rpm


1

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


1

上面的减压线对我有用,当然,内核被剥离了。因此,那里没有好的信息。

如果您需要对旧内核进行更改(例如将其放入调试中),请使用uname -r来获取内核的修订版并获取其源代码:

sudo apt-get source linux-image-\`uname -r\`

源将位于/usr/src/linux... cd源树中,并且:

make oldconfig
make

这将尝试查找包含当前正在运行的内核的配置文件-通常

/boot/config-\`uname -r\` 

并将其用于此构建,从而重新创建正在运行的内核。

按照您想要的方式进行构建;可以根据需要访问未剥离的内核。

由于间距,上面的壳可能找不到gzip魔术数字。是的,尽管我是在最初讨论之后写的,但它们仍以相同的方式压缩。将输出发送到less1f 8b甚至搜索1f。手动检查其余字节,以确定是否匹配,并验证您是否拥有第一个实例。使用记住的偏移量(十进制)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.