Come decomprimo vmlinuz in vmlinux?


20

Ho già provato decomprimere, gzip e tutte le altre soluzioni che arrivano come risultati di Google e questi non hanno funzionato per me.

Per ottenere solo la ricerca di immagini per la firma GZ - 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

quindi l'immagine inizia alle 24576+8 => 24584. Quindi copia l'immagine dal punto e decomprimila -

> 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

Ottieni queste istruzioni alla lettera da un forum online: http://www.codeguru.com/forum/showthread.php?t=415186

Questo processo non funziona per me e finisce per dare errori che indicano che il file non è stato trovato 0024576 e tutti i numeri successivi.

Come posso procedere estraendo vmlinux da vmlinuz?

Grazie.

EDITED: Questa è una domanda di reverse engineering. Non ho accesso alla distro per installare RPM o ricompilare. Comincio con nient'altro che vmlinuz.


2
Perchè vuoi fare questo?
Flimzy,

Questo è in realtà per un amico che ha dovuto farci qualcosa. La domanda sembrava interessante e l'ho perseguita per il mio interesse accademico. Un'alternativa a questa è costruire il kernel: - /

Bene, per interesse accademico, non so se sia facilmente possibile. Credo che un kernel vmlinuz abbia un preambolo eseguibile - è essenzialmente un archivio autoestraente. Ecco perché l'uso del gunzip dritto non ha funzionato per te. Il metodo citato tenta di saltare quel preambolo. Perché non funziona, non lo so per certo. Forse qualcun altro con interessi accademici simili può darti una risposta utile. :)
Flimzy,

Risposte:


30

Forse hai frainteso il significato dell'autore di quel post.

  1. Il vmlinuzfile contiene altre cose oltre al contenuto gzip, quindi è necessario scoprire dove inizia il contenuto gzip. Per fare ciò, utilizzare:

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

    Quello che fa è mostrarti dove in quel file puoi trovare l'intestazione gzip. L'output è simile a:

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

    Ciò significa che nel file 0024576(almeno per l'autore del post, il tuo potrebbe essere completamente diverso) nel vmlinuzfile troverai i valori binari " 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45". Stai cercando 1f 8b 08 00, che puoi trovare dal carattere 9 in poi, oppure, su 0024576 + 8(inizia a contare da 0) = 24584.

  2. Ora che sai dove inizia il contenuto gzip (nella posizione 24584) puoi usare ddper estrarre quel contenuto gzip e decomprimerlo. Per fare ciò, utilizzare:

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

    Il primo comando cercherà in quella posizione e copierà tutto su stdout. zcatquindi decomprimerà tutto ciò che ottiene da stdin e invierà la stringa non compressa a stdout. Quindi >reindirizzerà zcatl'output su un nuovo file denominato vmlinux.


Grazie! Adesso ha senso. Tuttavia, '1f 8b 08 00' non ha restituito nulla per il mio kernel dopo alcuni secondi di esecuzione. Apparentemente il codice è cambiato. Qualche suggerimento su come ottenere il nuovo set di numeri magici?

@Lord Loh .: Due possibilità: 1) I numeri magici attraversano i confini della linea odnell'output. Usa bgrep per cercare 1f8b0800. 2) Il kernel è compresso usando un algoritmo diverso. Prova fd377a585a00per xz o 425a6839per bzip2 .
user1686

@ grawity - Grazie per la risposta. Ci ho provato. né 1f8b0800, fd377a585a00 né 425a6839 hanno restituito risultati. Quindi ho iniziato a tagliare la stringa magica byte per byte fino a quando non ho ottenuto alcuni risultati, ed erano centinaia di partite :-( Quindi sono ancora senza successo.
Lord Loh.

LZMA è "5d 00 00 80" secondo minimodding.com/… . Non ha ancora funzionato per me.
Sam Brightman,

27

1
È disponibile in Ubuntu 14.04? L'ho visto nel repository git, in quale pacchetto Ubuntu posso trovarlo? - Grazie :-)
Lord Loh.

@LordLoh apt-file search extract-vmlinuxoffre diversi pacchetti di intestazione del kernel Linux e locate extract-vmlinuxporta a qualche hit sulla mia macchina Ubuntu 18.04 locale: /usr/src/linux-headers-4.15.0-33/scripts/extract-vmlinuxanche se nulla PATHsembra.
Ciro Santilli 15 改造 中心 法轮功 六四 事件

Per ARM non funziona con "extract-vmlinux: Impossibile trovare vmlinux": unix.stackexchange.com/questions/352215/…
Ciro Santilli 19 改造 中心 法轮功 六四 事件

7

In realtà, prima di generare il vmlinuzfile, la maggior parte dei simboli viene eliminata. Quindi non è possibile ricostruire un vero vmlinuxda vmlinuz, il file non sarà così utile per il debug.


2

Ho riscontrato un semplice problema: cercavo la versione corretta di vmlinux per crash. Invece di provare a decomprimere vmlinuz in vmlinux.

La soluzione migliore è: installare RPM kernel-debuginfo:, che RPM contiene il file vmlinux corretto.

Prestare attenzione al nome del numero di giri, ci sono più nomi simili (confusi). Deve essere:kernel-debuginfo-$(version).rpm


1

I kernel moderni non sono sempre (in realtà, in genere, non) compressi con gzip. Possono usare bzip2 o LZMA. Una rapida ricerca sul web non mi ha aiutato a trovare le stringhe magiche per quei metodi di compressione - potresti essere meglio controllare diverse immagini del kernel per trovare l'intestazione invariante che include il codice di decompressione.


1

Le linee di decompressione sopra hanno funzionato per me e, naturalmente, il kernel è stato rimosso. Pertanto nessuna buona informazione lì.

Se devi apportare modifiche al tuo vecchio kernel, come metterlo nel debug, usa uname -rper ottenere la revisione del tuo kernel e ottenere il suo sorgente:

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

La fonte sarà nella struttura /usr/src/linux... cddei sorgenti e:

make oldconfig
make

Questo tenterà di trovare il file contenente la configurazione per il kernel attualmente in esecuzione - di solito

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

e usarlo per questa build ricreando così il kernel in esecuzione.

Costruiscilo nel modo che preferisci; avere accesso al kernel non strippato secondo necessità.

Le conchiglie sopra probabilmente non troveranno il numero magico di gzip a causa della spaziatura. Sì, sono ancora compressi allo stesso modo, anche se sto scrivendo un anno dopo la discussione originale. Invia l'output a lesse cerca 1f 8bo anche 1f. Controllare il resto dei byte manualmente per determinare una corrispondenza e verificare di disporre della prima istanza. Usa l'offset trovato ricordando che è decimale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.