我目前正在尝试提取嵌入在内核映像中的初始 RAM 文件系统,对其进行修改,然后用它重新打包内核映像。您可以搜索 GitHub 并在此处找到几个执行此操作的项目。我对这些脚本的问题是它们非常具体,或者变成了我无法与我正在使用的内核映像一起使用的硬代码值,或者它们很难进行逆向工程。我正在使用的内核映像使用 XZ 压缩内核和 GZip 压缩初始 RAM 文件系统 CPIO 存档。通过查找特定字符串很容易找到 GZip 流的结尾,而那些 GitHub 项目似乎需要知道这些流的确切结尾。
我能够像这样提取内核的压缩部分:
offset=$(cat zImage | grep -aob $'\xFD\x37\x7A\x58\x5A\x00' | cut -d ":" -f 1 | sed -n 2p)
dd bs=1 skip=$offset if=zImage | xzcat > Image
然后我可以像这样提取初始 RAM 文件系统 CPIO 存档Image
:
offset=$(cat "${1}" | grep -aob $'\x1F\x8B\x08' | cut -d ":" -f 1 | sed -n 2p)
dd bs=1 skip=$offset if=Image | zcat > initramfs.cpio
现在,通过阅读那些 GitHub 脚本,似乎必须知道压缩流的结束地址。如何在 shell 脚本中找到 XZ 流的结尾?