我有一个内核,其中嵌入了一个 initramfs。我想把它提取出来。
x86 boot sector
当我这样做时,我得到了输出file bzImage
我有这个内核映像的 System.map 文件。
有没有办法从该内核中提取嵌入式 initramfs 映像,无论是否有帮助系统图文件 ?
发现有趣的字符串系统图文件是:(以防万一有帮助)
57312:c17fd8cc T __initramfs_start
57316:c19d7b90 T __initramfs_size
答案1
gentoo wiki 中有一些关于此的信息:https://wiki.gentoo.org/wiki/Custom_Initramfs#Salvaging
它推荐使用binwalk
效果非常好的。
我将通过一个示例进行快速演练:
首先用binwalk解压bzImage文件:
> binwalk --extract bzImage
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Microsoft executable, portable (PE)
18356 0x47B4 xz compressed data
9772088 0x951C38 xz compressed data
我最终得到了三个文件47B4
:47B4.xz
和951C38.xz
> file 47B4
47B4: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=aa47c6853b19e9242401db60d6ce12fe84814020, stripped
现在让我们再次运行 binwalk 47B4
:
> 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>
返回的结果是一长串已找到的路径和几个可能有趣的文件。我们来看一下。
> file _47B4.extracted/*
<snip>
_47B4.extracted/E9B348: ASCII cpio archive (SVR4 with no CRC)
文件E9B348
是(已解压的)cpio 存档,正是我们正在寻找的!答对了!
要将未压缩的 cpio 存档(您的 initramfs!)解压到当前目录中,只需运行
> cpio -i < E9B348
这太容易了。binwalk
绝对是您正在寻找的工具。作为参考,我在这里使用 v2.1.1。
答案2
据我所知,initramfs cpio 存档只是链接到内核中。
因此,这应该有效:
- 用于提取和
dd
之间的范围c17fd8cc
c19d7b90
- 使用 CPIO 解包器解包结果数据 ny。
答案3
使用“dd 提取 c17fd8cc 和 c19d7b90 之间的范围”是行不通的,因为这些是内核虚拟地址,而您的映像位于物理空间中。您需要将它们转换为图像偏移才能使其工作。一般来说,减去虚拟偏移量(在本例中,看起来像 0xC0000000)并可能添加 PHYS_OFFSET(通常为 0x8000),但这取决于您的内核。