2017-07-07 6 views
1

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?

Antwort

1

Die Größe einer XZ-Datei oder eines Streams ist innerhalb des Felds Unpadded Size innerhalb des XZ-Headers codiert.
Das Feld Unpadded size gibt die Größe des Blocks ohne das FeldBlock Padding an.

dh Ungepolsterte Größe = size-of (Block-Header + Komprimierte Daten + CRC-Felder)


Eine schnelle Methode, um die Größe zu erhalten, wird die xz tool mit sich wie folgt zusammen:

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

Referenz: Die xz file-format.


Hinweis: Ungepolsterte Größe wird mit der Codierung in Abschnitt 1.2 Multibyte Integers der XZ-Datei-Format-Spezifikation beschrieben gespeichert. Der Wert darf niemals Null sein; Bei der aktuellen Struktur von Blöcken ist der tatsächliche Mindestwert für das Feld Unpadded Size fünf.

Umsetzung beachten: Da die Größe des Feldes Block-Padding ist nicht in Ungepolsterte Größe enthalten, die Gesamtgröße eines Stream-Berechnung oder Schreib-Lese-Lese tun erfordert die tatsächliche Größe der Blöcke Berechnung von ungepolsterte Größen bis zum nächsten Vielfachen von vier runden.

Verwandte Themen