Для начала берешь дамп прошивки, загружаешь в Ida, процессор ARM Big-Endian, Options -> General -> Analysis -> Kernel Options 1 -> Make final analisys pass -> OK -> Reanalyze Programm. То, что серое - запакованное и зашифрованное ядро прошивки, остальное - загрузчик. Ядро, начинается с сигнатуры $NKF (в не зашифрованных прошивках - $ZIP), адрес загрузки ядра указан в заголовке $NKF, (0x40017000 для 1860, например). Дальше куришь мануал по ассемблеру ARM, смотришь как расшифровывается ядро (должна получиться сигнатура $ZIP), потом распаковываешь гзипом.
Вот пример расшифровки и распаковки ядра ML1860, написано на PHP, т.к. там gzip без лишних проблем работает:
<?
$nach_cod = 86132; // начало ядра
$razm_zip = 373338; // размер упакованного ядра (может быть другим)
//считываем файл в переменную
$abb = file_get_contents('FIX_ML-1860.hd');
// первая таблица 64 байта
$tab64 = substr($abb,81196,64);
// вторая таблица 256 байт
$tab256 = substr($abb,80940,256);
// вырезаем NKF
$nkf_cod = substr($abb,$nach_cod,$razm_zip);
// Заполняем таблицей 64 строку размером упакованного ядра
$t64_xor = str_pad ($tab64, $razm_zip, $tab64);
// Расшифровываем с помощью XOR
$xor = $nkf_cod ^ $t64_xor;
$uncode = "";
//Расшифровываем с помощью таблицы подстановки 256
for($i=0;$i<$razm_zip;$i++)
{
$j=ord($xor{$i});
$c=$tab256{$j};
$uncode.=$c;
}
// заголовок 12 байт
$head = substr($uncode,0,12);
// сжатый гзипом блок
$compress = substr($uncode,12);
// распаковываем ядро с пом gzip
$decompress = gzuncompress($compress);
// сохраняем распакованное ядро в файл
file_put_contents('Kernel_ML-1860',$decompress);
?>
Данный алгоритм подсмотрен в одном из генераторов, написанном на PHP Devel Studio.