2017-07-07 64 views
1

我目前正試圖提取嵌入在內核映像中的初始RAM文件系統,對其進行修改並用它重新打包內核映像。您可以搜索GitHub並找到幾個執行此操作的項目here。我對這些腳本的問題是它們非常具體,或者是硬編碼值,我無法使用我正在使用的內核映像,或者它們很難進行反向工程。我正在使用的內核映像使用XZ壓縮內核,並使用GZip壓縮初始RAM文件系統CPIO存檔。 GZip流的結束通過查找特定的字符串很容易找到,這些GitHub項目似乎需要知道這些流的確切結束。找到XZ流的結尾

我能夠提取的內核像這樣的壓縮部分:

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

回答

1

xz文件或流的大小編碼在xz標頭內的Unpadded Size字段內。
Unpadded size字段指示塊的大小,不包括Block Padding字段。

未填充尺寸 =大小的(塊首+壓縮數據+ CRC字段)


一個快速的方法得到尺寸如下使用xz tool本身:

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

參考:xz file-format


注:未填充尺寸是使用在節在xz文件格式規範的1.2多字節整數描述的編碼存儲起來。 該值必須不能爲零;根據當前的塊結構,Unpadded Size字段的實際最小值爲5。

實現注意事項:因爲該塊填充字段的大小不包括在未填補的大小,計算流的總規模或做隨機訪問讀取需要計算由塊的實際大小四捨五入Unpadded大小可達四倍的下一個倍數。