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.
quelle
Antworten:
Vielleicht haben Sie falsch verstanden, was der Autor dieses Beitrags meinte.
Die
vmlinuz
Datei enthält neben dem komprimierten Inhalt noch andere Elemente. Sie müssen also herausfinden, wo der komprimierte Inhalt beginnt. Verwenden Sie dazu:Dies zeigt Ihnen, wo sich in dieser Datei der gzip-Header befindet. Die Ausgabe sieht folgendermaßen aus:
Dies bedeutet, dass Sie
0024576
in dervmlinuz
Datei 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 nach1f 8b 08 00
, die ab Zeichen 9 oder bei0024576 + 8
(beginnend mit 0) zu finden sind= 24584
.Jetzt, da Sie wissen, wo der komprimierte Inhalt beginnt (an der Position
24584
), können Siedd
diesen komprimierten Inhalt extrahieren und dekomprimieren. Verwenden Sie dazu:Der erste Befehl sucht diese Position und kopiert alles nach stdout.
zcat
Dann 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 .zcat
vmlinux
quelle
od
der Ausgabe. Verwenden Sie bgrep , um nach zu suchen1f8b0800
. 2) Der Kernel wird mit einem anderen Algorithmus komprimiert. Versuchen Sie esfd377a585a00
mit xz oder425a6839
mit bzip2 .Die Kernel - Quellen enthalten jetzt ein Skript dafür
extract-vmlinux
. Sie müssen nicht Ihre eigenen rollen.Siehe diese SO Antwort .
quelle
apt-file search extract-vmlinux
gibt mehrere Linux-Kernel-Header-Pakete heraus undlocate extract-vmlinux
führt zu einigen Treffern auf meinem lokalen Ubuntu 18.04-Rechner:/usr/src/linux-headers-4.15.0-33/scripts/extract-vmlinux
obwohl nichtsPATH
drin zu sein scheint.Tatsächlich werden vor dem Generieren der
vmlinuz
Datei die meisten Symbole entfernt. Damit Sie kein truevmlinux
von neuvmlinuz
erstellen können, ist die Datei für das Debuggen nicht so nützlich.quelle
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
quelle
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.
quelle
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 -r
mit die Revision Ihres Kernels und dessen Quelle ab:Die Quelle befindet sich im
/usr/src/linux...
cd
Quellenbaum und:Dadurch wird versucht, die Datei zu finden, die die Konfiguration für den aktuell ausgeführten Kernel enthält - normalerweise
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
less
und suchen Sie nach1f 8b
oder sogar1f
. Ü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.quelle