Decomprimere l'immagine del kernel linux

L'immagine del kernel linux presente nel firmware, e memorizzata sulla flash, è compressa tramite l'algoritmo LZMA.
E' possibile estrarre tale immagine applicando la seguente procedura:
Innanzitutto procuratevi l'immagine del kernel compresso (Se non sapete come fare consultate la pagina relativa al reverse_engineering_del_dump).
Tale immagine che per comodità a partire da questo punto chiamerò kernel.bin è così strutturata:

4 byte Indirizzo iniziale di memoria in cui il CFE deve caricare il kernel
4 byte ???? - Sembra essere un indirizzo di memoria anche questo
4 byte Dimensione del file - 12 (Dimensione dell'header) = Dimensione dei dati compressi lzma

Per poter decomprimere il kernel si rende quindi necessario rimuovere l'intestazione che lo precede:

dd if=kernel.bin of=kernel.compresso bs=12 skip=1

A questo punto abbiamo ottenuto un file kernel.compresso che in via teorica dovrebbe poter essere decompresso con l'utility lzma (lzma.exe se vi trovate in ambiente Windows). Purtroppo il formato dell'header non viene accettato correttamente dalle utility di decompressione lzma e lzma.exe (LZMA SDK 4.27). Vediamone il perchè:
Il nostro file (kernel.compresso) è composto da:

5D 00 00 40 - DATI COMPRESSI

invece le utility ricavate a partire dai sorgenti LZMA SDK 4.27 pretendono che il file sia così formato:1)

5D 00 00 40 - 00 - Dimensione del file decompresso su 7 byte - DATI COMPRESSI

In definitiva, per decomprimere con lzma o lzma.exe bisognerà modificare l'header pre-esistente di kernel.compresso. Inoltre va sottolineato che non conoscendo la dimensione finale del file decompresso possiamo limitarci a indicare una dimensione sufficentemente grande (es: 0xFFFFFF). Verrà segnalato un errore in fase di decompressione, ma verrà comunque estratto tutto il file.

5D 00 00 40 - 00 FF FF FF - 00 00 00 00 - DATI COMPRESSI

A questo punto non ci resta che eseguire:

./lzma d kernel.compresso kernel.decompresso

se siete sotto linux

lzma.exe d kernel.compresso kernel.decompresso

se siete sotto windows.

1) Per dovere di cronaca devo anche specificare che la dimensione è indicata a partire dal LSB e quindi un kernel di 1679495 byte (0x19A087) avrebbe un'intestazione corretta così formata: 5D 00 00 40 - 00 87 A0 19 - 00 00 00 00 - DATI COMPRESSI.
 
decomprimere_il_kernel.txt · Ultima modifica: 2008/04/14 13:21 (modifica esterna)
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki