我想修改嵌入在内核 bzImage 中的 initramfs 中的一些 init 脚本。我知道我可以通过不更改任何文件的大小来修改它们(例如,通过注释掉行,并在必要时删除字母或添加注释以平衡事情。)
理想情况下,我想从 zImage 中删除 xz 文件。解压它。修改cpio,然后重新压缩,然后DD回zImage。我希望通过不更改任何文件的大小,这会起作用。虽然我很欣赏它可能并不那么容易。因此,我们将不胜感激。
另外,我在内核映像上运行了 binwalk,它看起来像这样:
十进制十六进制描述 -------------------------------------------------- ------------------------------ 0 0x0 Microsoft 可执行文件,可移植 (PE) 16817 0x41B1 xz 压缩数据 7297600 0x6F5A40 xz 压缩数据 7299230 0x6F609E Unix 路径:/x86/boot/compressed/kaslr_64.c!? 7483729 0x723151 DER格式的证书(x509 v3),头部长度:4,序列长度:762
现在。我还在文件上运行 Binwalk -e,它能够成功提取 xz 档案,并将其中至少一个 (0x41B1) 解压缩到一个 .cpio 文件中,我已经验证该文件包含 initramfs。但是我遇到的几个问题对我来说没有意义:
binwalk 提取的“xz”文件大小为 7468247。然而,如果你减去上面两个 xz 文件之间的偏移量,你会得到 7280783。为什么会有不同?
当我尝试对 binwalk 提取的 .xz 文件运行 xz -d 时,我收到一条消息“压缩数据已损坏”。如果我对 binwalk 提取的 XZ 文件进行十六进制转储,它似乎没有与顶部的 XZ 文件关联的魔术字节。那么 binwalk 在正确提取 XZ 文件方面有何不同?binwalk 提取的究竟是什么,因为它似乎不是有效的 XZ 文件(至少根据 XZ 实用程序)?
当我在 Binwalk 提取的 CPIO 文件上运行 xz_wrap 脚本(包含在 linux 内核中)(或我尝试过的任何其他 XZ 选项)时——无论我做什么——我都无法获得 xz 文件生成与 binwalk 从 zImage 提取的原始 .xz 文件完全相同的文件。任何人都可以解释这个或我可以做些什么来生成完全相同的 XZ 存档?
我确信内核正在使用“CONFIG_HAVE_KERNEL_XZ=y”,因为我已经能够提取那么多。虽然我会注意到在 Binwalk 中启用了一些调试后,我可以看到它正在使用它的 lzma 解压缩器来解压缩从内核映像中提取的 XZ 文件。
这里有什么建议吗?我当然不是要重新发明轮子。因此,如果其他人想出了将 initramfs 重新打包到 x86 内核中的方法,我会很感兴趣。我也愿意在这里接受任何其他建议。