Ich versuche gerade das ursprüngliche RAM-Dateisystem zu extrahieren, das in einem Kernel-Image eingebettet ist, zu modifizieren und das Kernel-Image damit neu zu packen. Sie können GitHub suchen und mehrere Projekte finden, die das tun here. Mein Problem mit diesen Skripten ist, dass sie sehr spezifisch sind oder zu harten Code-Werten führen, die ich nicht mit dem Kernel-Image verwenden kann, mit dem ich arbeite, oder sie sind nur schwer zu rekonstruieren. Das Kernel-Image, mit dem ich arbeite, verwendet XZ, um den Kernel zu komprimieren, und GZip komprimiert das CPIO-Archiv des ursprünglichen RAM-Dateisystems. Das Ende eines GZip-Streams ist leicht zu finden, indem nach einer bestimmten Zeichenfolge gesucht wird, und diese GitHub-Projekte müssen das genaue Ende dieser Streams kennen.Lokalisieren Sie das Ende eines XZ-Streams
Ich kann den komprimierten Teil des Kernels, wie diese extrahieren:
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
Ich kann dann von Image
wie dies die anfängliche RAM-Dateisystem CPIO Archiv extrahieren:
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
, it Now Beim Lesen dieser GitHub-Skripte scheint es so zu sein, dass man die Endadresse der komprimierten Streams kennen muss. Wie finde ich das Ende eines XZ-Streams im Shell-Skript?