Linux 找到XZ流的结尾

Linux 找到XZ流的结尾,linux,linux-kernel,xz,Linux,Linux Kernel,Xz,我目前正试图提取嵌入内核映像中的初始RAM文件系统,对其进行修改,并用它重新打包内核映像。您可以搜索GitHub并找到几个这样做的项目。我对这些脚本的问题是,它们非常具体,或者变成了硬代码值,我无法使用我正在使用的内核映像,或者它们很难进行反向工程。我正在使用的内核映像使用XZ压缩内核,使用GZip压缩初始RAM文件系统CPIO归档。通过查找特定字符串可以很容易地找到GZip流的结尾,而那些GitHub项目似乎需要知道这些流的确切结尾 我能够像这样提取内核的压缩部分: offset=$(cat

我目前正试图提取嵌入内核映像中的初始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
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
然后,我可以从
Image
中提取初始RAM文件系统CPIO归档,如下所示:

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
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流的结尾?

XZ文件或流的大小在XZ头的
未添加大小
字段中进行编码。
Unpadded size
字段表示块的大小不包括
块填充
字段

i、 e.未添加的大小=的大小(块头+压缩数据+CRC字段)


获取尺寸的一种快速方法是使用其本身,如下所示:

xz --robot --list <xz-file-or-stream> | cut -f 4 | sed -n 2p
xz--robot--list | cut-f4 | sed-n2p
参考文献:美国


注意:未添加的大小使用xz文件格式规范第1.2节“多字节整数”中描述的编码进行存储。 该值决不能为零;对于当前的块结构,
Unpadded Size
字段的实际最小值为5。

实施说明:由于块填充字段的大小不包括在未添加的大小中,因此计算流的总大小或进行随机访问读取需要通过将未添加的大小四舍五入到四的下一个倍数来计算块的实际大小。