Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
— |
decomprimere_il_kernel [2008/04/14 13:21] (versione attuale) |
||
---|---|---|---|
Linea 1: | Linea 1: | ||
+ | ====== 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 [[backup_e_restore#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: | ||
+ | <code> | ||
+ | dd if=kernel.bin of=kernel.compresso bs=12 skip=1 | ||
+ | </code> | ||
+ | |||
+ | A questo punto abbiamo ottenuto un file kernel.compresso che in via teorica dovrebbe poter essere decompresso con l'utility {{bin:lzma}} ({{bin:lzma.exe}} se vi trovate in ambiente Windows). Purtroppo il formato dell'header non viene accettato correttamente dalle utility di decompressione {{bin:lzma}} e {{bin:lzma.exe}} (LZMA SDK 4.27). Vediamone il perchè:\\ | ||
+ | Il nostro file (kernel.compresso) è composto da:\\ | ||
+ | <code> | ||
+ | 5D 00 00 40 - DATI COMPRESSI | ||
+ | </code> | ||
+ | invece le utility ricavate a partire dai sorgenti LZMA SDK 4.27 pretendono che il file sia così formato:((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.))\\ | ||
+ | <code> | ||
+ | 5D 00 00 40 - 00 - Dimensione del file decompresso su 7 byte - DATI COMPRESSI | ||
+ | </code> | ||
+ | |||
+ | In definitiva, per decomprimere con {{bin:lzma}} o {{bin: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.\\ | ||
+ | <code> | ||
+ | 5D 00 00 40 - 00 FF FF FF - 00 00 00 00 - DATI COMPRESSI | ||
+ | </code> | ||
+ | A questo punto non ci resta che eseguire: | ||
+ | <code> | ||
+ | ./lzma d kernel.compresso kernel.decompresso | ||
+ | </code> | ||
+ | se siete sotto linux | ||
+ | <code> | ||
+ | lzma.exe d kernel.compresso kernel.decompresso | ||
+ | </code> | ||
+ | se siete sotto windows. | ||
+ | |||
+ | |||