首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌入initramfs的提取

嵌入initramfs的提取
EN

Unix & Linux用户
提问于 2014-09-24 10:08:05
回答 3查看 11.7K关注 0票数 13

我有一个内核,其中嵌入了一个initramfs。我想把它拔掉。

我在做x86 boot sector时得到了输出file bzImage

我有这个内核映像的System.map文件。

有没有任何方法从这个内核中提取嵌入的initramfs映像,不管是否有System.map文件的帮助?

系统地图文件中有趣的字符串是:(以防万一会有所帮助)

代码语言:javascript
复制
57312:c17fd8cc T __initramfs_start
57316:c19d7b90 T __initramfs_size
EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2016-06-01 00:37:45

在gentoo wiki:https://wiki.gentoo.org/wiki/Custom_Initramfs#Salvaging中有关于这方面的一些信息。

它推荐了binwalk的使用,它工作得非常好。

我将给出一个简单的例子:

首先使用binwalk解压缩bzImage文件:

代码语言:javascript
复制
> binwalk --extract bzImage
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             Microsoft executable, portable (PE)
18356         0x47B4          xz compressed data
9772088       0x951C38        xz compressed data

我最后得到了三个文件:47B447B4.xz951C38.xz

代码语言:javascript
复制
> file 47B4
47B4: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=aa47c6853b19e9242401db60d6ce12fe84814020, stripped

现在,让我们在47B4上再次运行binwalk:

代码语言:javascript
复制
> binwalk --extract 47B4
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             ELF, 64-bit LSB executable, AMD x86-64, version 1 (SYSV)
9818304       0x95D0C0        Linux kernel version "4.4.6-gentoo (root@host) (gcc version 4.9.3 (Gentoo Hardened 4.9.3 p1.5, pie-0.6.4) ) #1 SMP Tue Apr 12 14:55:10 CEST 2016"
9977288       0x983DC8        gzip compressed data, maximum compression, from Unix, NULL date (1970-01-01 00:00:00)
<snip>

这又带来了一长串找到的路径和几个可能有趣的文件。让我们看看。

代码语言:javascript
复制
> file _47B4.extracted/*
<snip>
_47B4.extracted/E9B348:     ASCII cpio archive (SVR4 with no CRC)

文件E9B348是一个(已经解压缩的) cpio存档,正是我们正在寻找的!对啰!

要解压缩未压缩的cpio存档(您的initramfs!)在当前目录中只运行

代码语言:javascript
复制
> cpio -i < E9B348

那几乎太容易了。binwalk绝对是你要找的工具。作为参考,我在这里使用了v2.1.1。

票数 19
EN

Unix & Linux用户

发布于 2015-04-25 06:00:56

据我所知,initramfs cpio存档只是链接到内核。

因此,这应该是可行的:

  1. 使用dd提取c17fd8ccc19d7b90之间的范围
  2. 使用CPIO解包器解压缩结果数据ny。
票数 2
EN

Unix & Linux用户

发布于 2021-01-09 21:52:56

使用"dd来提取c17fd8cc和c19d7b90之间的范围“是行不通的,因为它们是内核虚拟地址,您的映像位于物理空间中。您需要将它们转换为图像偏移量,这样才能工作。通常,减去虚拟偏移量(在本例中,类似于0xC0000000)并可能添加PHYS_OFFSET (通常为0x8000),但这取决于内核。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/157211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档