Фев 15

Изучение прошивки на примере SCX-3200 7 версии

По многочисленным просьбам читателей пишу серию статей о формате прошивок принтеров.

Начнем, пожалуй, с самого простого, практически с начала одноаппаратных прошивок. SCX-3200. Начиная с 8 версии, производитель начал применять шифрование, здесь же простое сжатие gzip.
Итак, нам понадобится:

1. HEX-редактор, любой, удобный вам. Мне нравится Hex Editor NEO.
2. Среда программирования, с языком которой вы знакомы. Для примера будем использовать PHP DevelStudio (http://develstudio.ru/), т.к. здесь проще всего организовать упаковку/распаковку gzip.
3. IDA Pro Advanced 5.5 with Hex-Rays для дизассемблирования.

Загрузим файл в хекс-редактор:

image001

и перейдем по адресу (CTRL+G) 0x40078 (здесь и далее все адреса в шестнадцатеричном представлении)

image002

Видим сигнатуру $ZIP . Здесь и находится ядро прошивки в упакованном виде.
Следующие 4 байта 0x40080000 – адрес распаковки ядра, далее 0x001afff4 – размер упакованной части.

image003

Лирическое отступление: 2 основные части прошивки – загрузчик и ядро. Загрузчик проверяет контрольную сумму прошивки, распаковывает и запускает ядро. Здесь же находится принудительный режим и дебаг. Ядро – основная рабочая программа принтера, реализующая функции печати, взаимодействие с компьютером, сетевые протоколы и все остальные рабочие процессы аппарата.

Теперь наступило время запустить Devel Studio.
Добавим на форму кнопку и создадим для нее событие «Клик»

image004

Двойным щелчком на надписи «Клик» откроем редактор кода.

image005

С этого момента начинается программирование.
Пишем следующий код:

$fn = 'D:\test\Z501BFEZ900168X_FIX_NU_3200_v07.hd';// имя файла и путь к нему
$file = file_get_contents($fn); // считывание содержимого файла в переменную
$zip = substr($file, 0x40078+0xC, 0x1afff4); // считывание упакованного ядра без заголовка $ZIP(0xC - 12 байт)
$unzip = gzuncompress($zip); // распаковка архива
file_put_contents('D:\kernel.hd',$unzip); // сохранение распакованного ядра в файл
echo "OK!";

Компилируем и запускаем (F9), нажимаем нашу единственную кнопку. Если пути к файлам прописаны правильно, и ошибок не возникает – видим сообщение «ОК». Появившийся файл ‘D:\kernel.hd‘ и есть наше распакованное ядро.

В нем поиском можно найти серийный номер.

image006

Улыбаемся, и представляем, как эти знания еще пару лет назад могли вас значительно обогатить.

Теперь загрузим ядро в ИДУ и немножко дизассемблируем.
Выбираем процессор ARMB (big endian):

image007

Выставляем адреса, как на картинке:

image008

Далее в меню Options -> General -> Analysis ->Kernel options 1 ставим галку Make final analysis pass -> OK -> Reanalyze program
Несколько минут курим. Пока идет процесс анализа кода, скажу вам, что верить Иде на 100% нельзя, иногда она ошибочно принимает данные за код и наоборот. И довольно часто домысливает лишние конструкции, что усложняет понимание кода. Лучше запускать исследуемые функции в эмуляторе и смотреть, что происходит с регистрами и памятью. Но, все-таки, общую картину понять можно значительно быстрее с помощью Иды.

Итак, анализ закончен, серийник находится по адресу 0x400C76B0 (для перехода нажать клавишу G)

image009

Серийный номер считывается из прошивки во время выполнения 0x400C768C и передается через R0 в функцию sub_400DBF70, которая проверяет его, и в случае соответствия пишет в R0 = 0.

ROM:400C769C CMP R0, #0
Здесь сравнение R0 с нулем, собственно, то место, где изменением пары байт можно сделать многоаппаратную прошивку.

На этом пока все, ждите продолжения. Если вы не понимаете всего вышесказанного, то лезть в эту тему смысла нет – дальше ещё сложнее.

Дек 16

SCX-3200 понижение версии через дебаг

debug3200
pROBE+> rl
Enter Start Address[0x40100000] : 0x (здесь нажать ENTER)
Ready to download from Parallel/Usb/Serial (0x40100000)
————————-
Sams ung OTG, 2006
Link ID   : [00000000]
————————-
Drv «design ware core» USB download<HS><HS><EPB_RX 0x00000100>
Special Image is downloading(font, etc)…
-> Address is 0x40100000
 закинуть по usb дамп (прошива без первых 120 байт)
[[4194304 Bytes received]] — Complete DownloadingDo you want to debug on? Press y or Y key within 3 second !!
Compress Type        : 0xE59FF054
Binary Start Address : 0xE59FF054
Binary Size          : 0xE59F0054
Binary Source Address: 0x40100024
[ERR]Invalid Image Format. Check image!!pROBE+> fp.spi.ep 40100000 0 400000 (копирование из оперативы на флешку)
source addr = 0x40100000, dest addr = 0x00000000, length = 0x00400000

[SFLASH_InitFLASH][NG]
—————————————-
SCLK Low = 0x00000003
SCLK High = 0x00000003
PreScale = 0x00000000
Divide = 8
Serial Clock =  15625000.000000 HZ, 15.625000 MHZ
0x00004000 words — 0x00010000 bytes programmed(2 percent : 0x003F0000)
0x00004000 words — 0x00010000 bytes programmed(4 percent : 0x003E0000)
0x00004000 words — 0x00010000 bytes programmed(5 percent : 0x003D0000)
0x00004000 words — 0x00010000 bytes programmed(7 percent : 0x003C0000)
0x00004000 words — 0x00010000 bytes programmed(8 percent : 0x003B0000)
0x00004000 words — 0x00010000 bytes programmed(10 percent : 0x003A0000)
0x00004000 words — 0x00010000 bytes programmed(11 percent : 0x00390000)
0x00004000 words — 0x00010000 bytes programmed(13 percent : 0x00380000)
0x00004000 words — 0x00010000 bytes programmed(15 percent : 0x00370000)
0x00004000 words — 0x00010000 bytes programmed(16 percent : 0x00360000)
0x00004000 words — 0x00010000 bytes programmed(18 percent : 0x00350000)
0x00004000 words — 0x00010000 bytes programmed(19 percent : 0x00340000)
0x00004000 words — 0x00010000 bytes programmed(21 percent : 0x00330000)
0x00004000 words — 0x00010000 bytes programmed(22 percent : 0x00320000)
0x00004000 words — 0x00010000 bytes programmed(24 percent : 0x00310000)
0x00004000 words — 0x00010000 bytes programmed(25 percent : 0x00300000)
0x00004000 words — 0x00010000 bytes programmed(27 percent : 0x002F0000)
0x00004000 words — 0x00010000 bytes programmed(29 percent : 0x002E0000)
0x00004000 words — 0x00010000 bytes programmed(30 percent : 0x002D0000)
0x00004000 words — 0x00010000 bytes programmed(32 percent : 0x002C0000)
0x00004000 words — 0x00010000 bytes programmed(33 percent : 0x002B0000)
0x00004000 words — 0x00010000 bytes programmed(35 percent : 0x002A0000)
0x00004000 words — 0x00010000 bytes programmed(36 percent : 0x00290000)
0x00004000 words — 0x00010000 bytes programmed(38 percent : 0x00280000)
0x00004000 words — 0x00010000 bytes programmed(40 percent : 0x00270000)
0x00004000 words — 0x00010000 bytes programmed(41 percent : 0x00260000)
0x00004000 words — 0x00010000 bytes programmed(43 percent : 0x00250000)
0x00004000 words — 0x00010000 bytes programmed(44 percent : 0x00240000)
0x00004000 words — 0x00010000 bytes programmed(46 percent : 0x00230000)
0x00004000 words — 0x00010000 bytes programmed(47 percent : 0x00220000)
0x00004000 words — 0x00010000 bytes programmed(49 percent : 0x00210000)
0x00004000 words — 0x00010000 bytes programmed(50 percent : 0x00200000)
0x00004000 words — 0x00010000 bytes programmed(52 percent : 0x001F0000)
0x00004000 words — 0x00010000 bytes programmed(54 percent : 0x001E0000)
0x00004000 words — 0x00010000 bytes programmed(55 percent : 0x001D0000)
0x00004000 words — 0x00010000 bytes programmed(57 percent : 0x001C0000)
0x00004000 words — 0x00010000 bytes programmed(58 percent : 0x001B0000)
0x00004000 words — 0x00010000 bytes programmed(60 percent : 0x001A0000)
0x00004000 words — 0x00010000 bytes programmed(61 percent : 0x00190000)
0x00004000 words — 0x00010000 bytes programmed(63 percent : 0x00180000)
0x00004000 words — 0x00010000 bytes programmed(65 percent : 0x00170000)
0x00004000 words — 0x00010000 bytes programmed(66 percent : 0x00160000)
0x00004000 words — 0x00010000 bytes programmed(68 percent : 0x00150000)
0x00004000 words — 0x00010000 bytes programmed(69 percent : 0x00140000)
0x00004000 words — 0x00010000 bytes programmed(71 percent : 0x00130000)
0x00004000 words — 0x00010000 bytes programmed(72 percent : 0x00120000)
0x00004000 words — 0x00010000 bytes programmed(74 percent : 0x00110000)
0x00004000 words — 0x00010000 bytes programmed(75 percent : 0x00100000)
0x00004000 words — 0x00010000 bytes programmed(77 percent : 0x000F0000)
0x00004000 words — 0x00010000 bytes programmed(79 percent : 0x000E0000)
0x00004000 words — 0x00010000 bytes programmed(80 percent : 0x000D0000)
0x00004000 words — 0x00010000 bytes programmed(82 percent : 0x000C0000)
0x00004000 words — 0x00010000 bytes programmed(83 percent : 0x000B0000)
0x00004000 words — 0x00010000 bytes programmed(85 percent : 0x000A0000)
0x00004000 words — 0x00010000 bytes programmed(86 percent : 0x00090000)
0x00004000 words — 0x00010000 bytes programmed(88 percent : 0x00080000)
0x00004000 words — 0x00010000 bytes programmed(90 percent : 0x00070000)
0x00004000 words — 0x00010000 bytes programmed(91 percent : 0x00060000)
0x00004000 words — 0x00010000 bytes programmed(93 percent : 0x00050000)
0x00004000 words — 0x00010000 bytes programmed(94 percent : 0x00040000)
0x00004000 words — 0x00010000 bytes programmed(96 percent : 0x00030000)
0x00004000 words — 0x00010000 bytes programmed(97 percent : 0x00020000)
0x00004000 words — 0x00010000 bytes programmed(99 percent : 0x00010000)
0x00004000 words — 0x00010000 bytes programmed(100 percent : 0x00000000)
—————————————-
ulRefTimer(0xFFFFFFFF), ulCurrentTimer(0xFE81FE92)
25635.959808 ms
25.635960 s

pROBE+> reboot (перезагрузка)

pROBE+>

Boot&Mon. CheckSum OK!

[SFLASH_InitFLASH][NG]
[ WATCH DOG RESET  Booting… ]

Press any key to execute Monitor Program within 1 sec…
Kernel Data Read Start From Serial Flash
New kernel was found…

CHKSUM
{
check sum start address : 41000000, count : 001B0000
check sum : 0000A5A5
} /* Checksum End

Checksum OK!!
Kernel Data Read End
Find Compressed Kernel
Kernel UnZip Done!!
jump to 0x40080000
ramsize= 406BFFFF, gsbsize = 40501204, FreeMemPtr = 40500548, FreeMemStart = 40500548
<<< Reelase Mode >>>
<<<LogMsg_PrintOff>>>
Model Code : SCX3200
Main Kernel F/W Version : V3.00.01.08
Main Kernel F/W Date : OCT-18-2010

У меня получилось откатится с V3.00.01.13 на V3.00.01.08.

Окт 01

Генератор прошивок Fix Maker v3.2

Предлагаю вашему вниманию генератор одноаппаратных фикс-прошивок для принтеров Samsung.

http://fix-maker.ru/

По просьбе автора программы ссылка удалена.