====== 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.