Для начала берешь дамп прошивки, загружаешь в 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.