gpt4 book ai didi

linux - 找到 XZ 流的结尾

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:05 26 4
gpt4 key购买 nike

我目前正在尝试提取嵌入在内核镜像中的初始 RAM 文件系统,对其进行修改,然后用它重新打包内核镜像。您可以搜索 GitHub 并找到几个执行此操作的项目 here .我对这些脚本的问题是,它们非常具体,或者变成了我无法与我正在使用的内核镜像一起使用的硬编码值,或者它们很难进行逆向工程。我正在使用的内核镜像使用 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

然后我可以像这样从 Image 中提取初始 RAM 文件系统 CPIO 存档:

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 header 的 Unpadded Size 字段中进行编码。
Unpadded size 字段指示 block 的大小不包括 Block Padding 字段。

i.e. Unpadded Size = size-of( Block Header + Compressed Data + CRC fields)


获取大小的一种快速方法是使用 xz tool本身如下:

xz --robot --list <xz-file-or-stream> | cut -f 4 | sed -n 2p

引用:xz file-format .


<子>注意:未填充的大小使用 xz 文件格式规范的第 1.2 节多字节整数中描述的编码存储。该值绝不能为零;在 Blocks 的当前结构中,Unpadded Size 字段的实际最小值为 5。

<子>实现注意事项:因为Unpadded Size中不包含Block Padding字段的大小,所以计算Stream的总大小或者做随机读取需要通过取整Unpadded Sizes来计算Block的实际大小直到下一个四的倍数。

关于linux - 找到 XZ 流的结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44977167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com