====== 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:
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 {{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:\\
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:((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.))\\
5D 00 00 40 - 00 - Dimensione del file decompresso su 7 byte - DATI COMPRESSI
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.\\
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.