Wie dekomprimiere ich vmlinuz nach vmlinux?

20

Ich habe bereits versucht, zu dekomprimieren, gzip und alle anderen Lösungen, die als Google-Ergebnisse angezeigt werden, und diese haben bei mir nicht funktioniert.

Um nur die Bildersuche nach der GZ-Signatur zu bekommen - 1f 8b 08 00.

> od -A d -t x1 vmlinuz | grep '1f 8b 08 00'
0024576 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45

so beginnt das bild bei 24576+8 => 24584. Dann kopieren Sie einfach das Bild vom Punkt und dekomprimieren es -

> dd if=vmlinuz bs=1 skip=24584 | zcat > vmlinux
1450414+0 records in
1450414+0 records out
1450414 bytes (1.5 MB) copied, 6.78127 s, 214 kB/s

Habe diese Anweisungen wörtlich von einem Online-Forum erhalten: http://www.codeguru.com/forum/showthread.php?t=415186

Dieser Prozess funktioniert bei mir nicht und führt zu Fehlern, die besagen, dass die Datei 0024576 und alle nachfolgenden Nummern nicht gefunden wurden.

Wie gehe ich vor, um vmlinux aus vmlinuz zu extrahieren?

Vielen Dank.

EDITED: Dies ist eine Reverse Engineering-Frage. Ich habe keinen Zugriff auf die Distribution, um RPM zu installieren oder neu zu kompilieren. Ich beginne mit nichts als vmlinuz.

Lord Loh.
quelle
2
Warum willst du das machen?
Flimzy
Dies ist eigentlich für einen Freund, der etwas damit anfangen musste. Die Frage schien interessant und ich verfolgte sie für mein akademisches Interesse. Eine Alternative dazu ist, den Kernel zu bauen: - /
Nun, aus akademischen Gründen weiß ich nicht, ob es einfach möglich ist. Ich glaube, ein vmlinuz-Kernel hat eine ausführbare Präambel - es ist im Wesentlichen ein selbstextrahierendes Archiv. Aus diesem Grund hat die Verwendung von Straight Gunzip bei Ihnen nicht funktioniert. Die zitierte Methode versucht, diese Präambel zu überspringen. Warum es nicht funktioniert, weiß ich nicht genau. Vielleicht kann Ihnen jemand anderes mit ähnlichen akademischen Interessen eine nützliche Antwort geben. :)
Flimzy

Antworten:

30

Vielleicht haben Sie falsch verstanden, was der Autor dieses Beitrags meinte.

  1. Die vmlinuzDatei enthält neben dem komprimierten Inhalt noch andere Elemente. Sie müssen also herausfinden, wo der komprimierte Inhalt beginnt. Verwenden Sie dazu:

    od -A d -t x1 vmlinuz | grep '1f 8b 08 00'
    

    Dies zeigt Ihnen, wo sich in dieser Datei der gzip-Header befindet. Die Ausgabe sieht folgendermaßen aus:

    0024576 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45
    

    Dies bedeutet, dass Sie 0024576in der vmlinuzDatei die Binärwerte " 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45" finden (zumindest für den Autor des Posts, der möglicherweise ganz anders ist) . Sie suchen nach 1f 8b 08 00, die ab Zeichen 9 oder bei 0024576 + 8(beginnend mit 0) zu finden sind = 24584.

  2. Jetzt, da Sie wissen, wo der komprimierte Inhalt beginnt (an der Position 24584), können Sie dddiesen komprimierten Inhalt extrahieren und dekomprimieren. Verwenden Sie dazu:

    dd if=vmlinuz bs=1 skip=24584 | zcat > vmlinux
    

    Der erste Befehl sucht diese Position und kopiert alles nach stdout. zcatDann wird alles dekomprimiert, was von stdin kommt, und der unkomprimierte String wird an stdout ausgegeben. Die Ausgabe wird dann in eine neue Datei mit dem Namen >umgeleitet .zcatvmlinux

loswerden
quelle
Vielen Dank! Das macht jetzt Sinn. '1f 8b 08 00' hat jedoch nach ein paar Sekunden Ausführung nichts für meinen Kernel zurückgegeben. Anscheinend hat sich der Code geändert. Irgendwelche Vorschläge, wie man die neuen magischen Zahlen erhält?
@Lord Loh .: Zwei Möglichkeiten: 1) Die magischen Zahlen überschreiten die Liniengrenzen in odder Ausgabe. Verwenden Sie bgrep , um nach zu suchen 1f8b0800. 2) Der Kernel wird mit einem anderen Algorithmus komprimiert. Versuchen Sie es fd377a585a00mit xz oder 425a6839mit bzip2 .
Grawity
@grawity - Danke für die Antwort. Ich habe es versucht. Weder 1f8b0800, fd377a585a00 noch 425a6839 gaben Ergebnisse zurück. Also fing ich an, die magische Kette Byte für Byte zu zerhacken, bis ich einige Ergebnisse bekam, und es waren Hunderte von Übereinstimmungen :-( Also bin ich immer noch ohne Erfolg.
Lord Loh.
LZMA ist laut minimodding.com/… "5d 00 00 80" . Hat bei mir immer noch nicht funktioniert.
Sam Brightman
27

Die Kernel - Quellen enthalten jetzt ein Skript dafürextract-vmlinux . Sie müssen nicht Ihre eigenen rollen.

Siehe diese SO Antwort .

Craig Ringer
quelle
1
Ist dies in Ubuntu 14.04 verfügbar? Ich habe es im Git Repo gesehen. In welchem ​​Ubuntu-Paket kann ich es finden? - Danke :-)
Lord Loh.
@LordLoh apt-file search extract-vmlinuxgibt mehrere Linux-Kernel-Header-Pakete heraus und locate extract-vmlinuxführt zu einigen Treffern auf meinem lokalen Ubuntu 18.04-Rechner: /usr/src/linux-headers-4.15.0-33/scripts/extract-vmlinuxobwohl nichts PATHdrin zu sein scheint.
Ciro Santilli
Für ARM schlägt es mit "extract-vmlinux: Kann vmlinux nicht finden" fehl: unix.stackexchange.com/questions/352215/…
Ciro Santilli
7

Tatsächlich werden vor dem Generieren der vmlinuzDatei die meisten Symbole entfernt. Damit Sie kein true vmlinuxvon neu vmlinuzerstellen können, ist die Datei für das Debuggen nicht so nützlich.

Ninjalj
quelle
2

Ich bin auf ein einfaches Problem gestoßen - auf der Suche nach der richtigen Version von vmlinux für den Absturz. Anstatt zu versuchen, vmlinuz nach vmlinux zu dekomprimieren.

Die bessere Lösung ist: Installieren Sie das RPM : kernel-debuginfo, das die richtige vmlinux-Datei enthält.

Achten Sie auf den RPM-Namen, es gibt mehrere ähnliche (verwirrende) Namen. Muss sein:kernel-debuginfo-$(version).rpm

Henry
quelle
1

Moderne Kernel sind nicht immer (eigentlich nicht generell) gzip-komprimiert. Sie können bzip2 oder LZMA verwenden. Eine schnelle Websuche hat mir nicht dabei geholfen, die magischen Zeichenfolgen für diese Komprimierungsmethoden zu finden. Möglicherweise sollten Sie mehrere Kernel-Images überprüfen, um den unveränderlichen Header zu finden, der den Dekomprimierungscode enthält.

CarlF
quelle
1

Die obigen Dekomprimierungslinien haben bei mir funktioniert und natürlich wurde der Kernel entfernt. Daher keine guten Informationen da.

Wenn Sie Änderungen an Ihrem alten Kernel vornehmen müssen, z. B. das Debuggen, rufen Sie uname -rmit die Revision Ihres Kernels und dessen Quelle ab:

sudo apt-get source linux-image-\`uname -r\`

Die Quelle befindet sich im /usr/src/linux... cdQuellenbaum und:

make oldconfig
make

Dadurch wird versucht, die Datei zu finden, die die Konfiguration für den aktuell ausgeführten Kernel enthält - normalerweise

/boot/config-\`uname -r\` 

und benutze es für diesen Build, um den laufenden Kernel wiederherzustellen.

Bauen Sie das so, wie Sie es wollen. Sie haben nach Bedarf Zugriff auf den freigegebenen Kernel.

Die oben genannten Muscheln werden die magische GZIP-Nummer aufgrund von Abständen wahrscheinlich nicht finden. Ja, sie werden immer noch auf die gleiche Weise komprimiert, obwohl ich ein Jahr nach der ursprünglichen Diskussion schreibe. Senden Sie die Ausgabe an lessund suchen Sie nach 1f 8boder sogar 1f. Überprüfen Sie den Rest der Bytes manuell, um eine Übereinstimmung zu ermitteln, und stellen Sie sicher, dass Sie die erste Instanz haben. Verwenden Sie den gefundenen Offset als Dezimalzahl.

kdm
quelle