私は現在、カーネルイメージに埋め込まれている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ストリームの終わりを見つけるにはどうすればよいですか?