2017-07-07 12 views
1

私は現在、カーネルイメージに埋め込まれているinital 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スクリプトを読むと、圧縮されたストリームの最終アドレスを知っている必要があるようです。シェルスクリプトでXZストリームの終わりを見つけるにはどうすればよいですか?

答えて

1

xzファイルまたはストリームのサイズは、xzヘッダー内のUnpadded Sizeフィールドにエンコードされています。
フィールドは、のBlock Paddingフィールドを除いて、ブロックのサイズを示します。

すなわちパディングされていないサイズ =(ブロックヘッダ+圧縮データ+ CRCフィールド)サイズの


サイズを得るための1つの迅速な方法次のように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 Sizeを四捨五入して、次の4の倍数にします。

関連する問題