Jump to content
Калькуляторы

Помощь в подсчёте CRC Ломаем древнее железо

Есть горка свичек типа Intel 530i. Это точный аналог D-Link DES-3624i

 

Интел забросил рынок свичек и свжие прошивки от Интел выходить перестали. Но D-Link ещё жил какое-то время.

 

И вот, томным зимним вечером приспичило мне превратить интел в д-линк.

 

Самый правильный путь - fullflash от Д-Линка. Оно там в кроватке, снимается легко. НепошлО по причини отсутствия донора.

Вторая попытка: прошить прошивку от д-линка. Там оно шьётся через Boot PROM онли. Не пошлО по причине ругани Boot PROM'а на некорректную прошивку.

 

Дальше полез ковырять.

 

1. Прошивка что Boot PROM'а, что самой ОС не есть образ флешки. Это есть последовательность блоков из 16 байт заголовков и кусков самой прошивки.

 

Заголовок:

0,1 - 16 бит номер блока. Нумеруются с 1 последовательно, сколько их там будет.

2,3 - 16 бит размер куска кода прошивки в блоке. Все блоки по 512 байт кроме последнего, который меньше. Поэтому тут везде 496 кроме последнего блока.

4,5,6,7 - постоянно меняются. Подозреваю, что там CRC.

8,9 - меняется от F0 FF до F3 FF. Что это - загадка.

10,11 - Всегда 00 00

12,13 - Для Д-Линка там 36 24, для интела 53 0A. Что как бэ намекает.

14,15 - всегда 00 00

 

Далее, тупая замена 36 24 на 53 0А не проканала с воплями о CRC.

Тупое выкидывание заголовков не помогло. Получается нечто, сильно похожее на дамп флешки, шью программатором, но с этим свитч не стартует. Возможно, прошивальшик как то считает общую CRC и пишет её куда нибудь тихонечко.

Дамп одного блока

[sol@sol blocks]$ xxd 1block.bin 
00000000: 0100 f001 8fd5 0000 f0ff 0000 2436 0000  ............$6..
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000080: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000090: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000100: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000110: 4bf0 2102 0000 0000 0000 0000 0000 0000  K.!.............
00000120: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000130: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000140: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000150: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000160: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000170: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000180: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000190: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

 

Вон даже по адресу 0x110 (во флешку ляжет по адресу 0x100) виден вектор сброса местного PowerPC проца.

Share this post


Link to post
Share on other sites

Заголовок:

2,3 - 16 бит размер куска кода прошивки в блоке. Все блоки по 512 байт кроме последнего, который меньше. Поэтому тут везде 496 кроме последнего блока.

4,5,6,7 - постоянно меняются. Подозреваю, что там CRC.

4 байта, CRC 16? для блока указанного размера?

Share this post


Link to post
Share on other sites

Я не говорил, что там именно CRC-16. Меняются 32 бита. CRC-32 скорее. И, учитывая, что замена проклятых 24 36 на 0А 53 вызывает CRC Error - в ней учавствует и заголовок також.

 

Вот второй блок того же файла

[sol@sol blocks]$ xxd 2block.bin
00000000: 0200 f001 f146 f001 f0ff 0000 2436 0000  .....F......$6..
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 3821 fff8 9181 0000 9561 fffc 9541 fffc  8!.......a...A..
00000030: 9521 fffc 7d9a 02a6 9581 fffc 3960 0002  .!..}.......9`..
00000040: 4820 01e6 0000 0000 0000 0000 0000 0000  H ..............
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000080: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000090: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000100: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000110: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000120: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000130: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000140: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000150: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000160: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000170: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000180: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000190: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

Share this post


Link to post
Share on other sites

а что в конце файла?

 

+ может стоит скормить бут той же IDA, и пореверсить от вывода сообщения об ошибочной КС взад? обзорные спеки на проц должны быть же.

Share this post


Link to post
Share on other sites

А в конце файла в точности такой же блок, но покороче.

 

Бут у меня есть из флешки прочитанный. Проц - PowerPC биг энджин. IDA уже катаю. Но там дохера. 250к примерно.

Share this post


Link to post
Share on other sites

Их там целая куча этих CRC32, мне вот только 2 нужны были, они типа основные: http://netlab.linkpc.net/download/software/SDK/core/include/crc32.h

Share this post


Link to post
Share on other sites

Мда...

Теперь я понимаю, почему закрыты SDK на свитч-чипы... Я бегло проскакал даже не по самой ОС, а только по загрузчику-инициализатору железа. ТАМ СТОЛЬКО ГОВНИЩА!!!

 

Джентльмены, это какой-то позор...

Share this post


Link to post
Share on other sites

Дампите фуллфлеш, и в bootprom замените id 36 24 с 53 0А, или вообще вырубите его проверку.

Там-то как раз нет CRC, и все будет шоколадно.

 

Но это на случай, если на найдете алгоритм подсчета CRC (crc16 еще можно перебрать, а вот crc32 уже нереально, если инициализировать его нестандартным значением).

Share this post


Link to post
Share on other sites

Теперь я понимаю, почему закрыты SDK на свитч-чипы... Я бегло проскакал даже не по самой ОС, а только по загрузчику-инициализатору железа. ТАМ СТОЛЬКО ГОВНИЩА!!!

Угу, эмбеддед - он такой... Код, писанный субподрядчиками-индусами и китайцами за плошку риса.

Share this post


Link to post
Share on other sites

Эташедевр ящитаю!

 

ROM:00002FB0     			stw 	%r0, 0x10+arg_4(%sp)
ROM:00002FB4     			bl  	Load_R3_FF80
ROM:00002FB8     			clrrwi  %r31, %r3, 16

ROM:00003974 Load_R3_FF80:               			# CODE XREF: sub_2C10+10p
ROM:00003974                             			# sub_2E18+18p ...
ROM:00003974     			lis 	%r3, 0xFF80
ROM:00003978     			blr
ROM:00003978 # End of function Load_R3_FF80

Share this post


Link to post
Share on other sites

А х. его з. Имя "функции" при дизассемблировании я дал... А так там половина похожего. Инициализируется дебаг-порт, инициализируется RTC, БАХ! Копипаст кода инициализации дебаг-порта, который мы парой микросекунд раньше инициализировали, но тот регистр, который значение толкает - не R3 а R4... Остальной код команда в команду...

 

У РРС ассемблер, к стати изо всех рисков самый приличный. Удобно писАть. Не то, что ARM.

Share this post


Link to post
Share on other sites

А х. его з. Имя "функции" при дизассемблировании я дал... А так там половина похожего. Инициализируется дебаг-порт, инициализируется RTC, БАХ! Копипаст кода инициализации дебаг-порта, который мы парой микросекунд раньше инициализировали, но тот регистр, который значение толкает - не R3 а R4... Остальной код команда в команду...

 

У РРС ассемблер, к стати изо всех рисков самый приличный. Удобно писАть. Не то, что ARM.

 

Оно могло компилятором заинлайнится - так что не показатель.

 

А вот "самый приличный ассемблер" .. Мне показалось наоборот после mips && arm'a. Одни только 3х операндные инструкции весьма выделяющаяся штука..

 

P.S. Так и не понял , задизасмили алгоритм расчета контрольной суммы то? Если нет - можно выложить бутлоадер , может попробуем общими усилиями , я правда ковырял PPC код весьма давно.

Share this post


Link to post
Share on other sites

Оно могло компилятором заинлайнится - так что не показатель.
Оно без видимых причин повторяется два раза. Ну не надо два раза это дело делать. И, да, что процедура из последнего примера делает?

 

А вот "самый приличный ассемблер" .. Мне показалось наоборот после mips && arm'a. Одни только 3х операндные инструкции весьма выделяющаяся штука..
Дело вкуса, но в трёхоперандных инструкциях весь цимус и сокрыт. Можно одной командой такихъ делъ наворотить! )) Это вызывает непонимание тех, у кого первый ассемблер был, скажем так, от Интел. Не суть х86 или 8080. Всё примерно одинаково. Мне, можно сказать, повезло. Мой первый ассемблер был DEC на школьной ДВК-2 и, в принципе от неё не отличающийся БК-0010 и УК НЦ. Ортогональная система команд! Опкоды запомнить - раз плюнуть.

 

У нас в школе два класса было. Один на ДВК + БК, второй чисто на УК НЦ. А с информатиком я дружил. Как и с паяльником.

 

 

 

Не добрался до алгоритма. Я не дома, буду завтра, в пятницу. И выложу.

 

Там много дизассемблировать. Размер кода около 250к. Я пока доковырял до Memory mapping. Дело в том, что а коде есть некоторое кол-во переходов по абсолютным адресам, а маппинг и адреса ПЗУ меняется после определения кол-ва памяти и программирования Chip Select Machines.

 

 

Зато нарыл мануал по этому SoC. Дальше дело пойдёт проще.

Share this post


Link to post
Share on other sites

Итак, я добрался...

 

29LV040_cor.bin - это образ флешки без 64к блока конфигурации. Рабочий, заливаешь - работает с чистым конфигом. От Интел

3624prom.210 - это сам файл прошивки с теми самыми 512 байт блоками. От Д-Линк.

firmware.tar.gz

Share this post


Link to post
Share on other sites

3624prom.210

Покопался:

судя по блокам 0x22-0x24 и соседним, подсчет crc происходит от всего блока целиком с предварительной заменой поля CRC заранее известным числом, но это не 00 и не FF, либо таблица полинома CRC32 выбрана нестандартная (в эту пользу говорит недостаточная энтропия CRC между этими соседними блоками).

Попробую побрутфорсить, но результат не гарантирую, проще, наверное, будет в бутлоадере посмотреть :)

Share this post


Link to post
Share on other sites

Также возможен вариант, что это CRC заголовка, опять же, с заменой CRC заранее известным числом перед подсчетом.

Но брутфорс показал, что это как минимум нестандартная CRC32, если это вообще crc32, т.к. в дампе флеша известные таблицы я не обнаружил (хотя они могут считаться на лету при работе, но так никто не делает даже в embedded, ибо медленно).

Share this post


Link to post
Share on other sites

Образ грузить в 1F0000 (определяем по смещениям для строк). Bin при этом более менее дизасмится (где там ram тоже можно понять но пока не интересно было).

Надо будет теперь порезать прошивку длинка на блоки , отрезать лишнее и собрать в bin образ.

Share this post


Link to post
Share on other sites

ROM:0021D24C                 addi      r5, r5, aRunTimeImageFi@l # "* Run time image file download error (r"...
ROM:0021D250                 bl        sub_20E170
ROM:0021D254                 b         loc_21D358    # jumptable 0021D15C default case
ROM:0021D258 # ---------------------------------------------------------------------------
ROM:0021D258
ROM:0021D258 loc_21D258:                             # CODE XREF: ROM:0021D15Cj
ROM:0021D258                                         # DATA XREF: ROM:jpt_21D15Co
ROM:0021D258                 bl        sub_214C74    # jumptable 0021D15C case 21
ROM:0021D25C                 addi      r4, r3, 0
ROM:0021D260                 lis       r3, aResultFailToCo@ha # "Result: Fail to contact TFTP server atR"...
ROM:0021D264                 addi      r3, r3, aResultFailToCo@l # "Result: Fail to contact TFTP server atR"...

 

Это интересно загрузка fw или прямо в память образа исполняемого? Может глянет топикстартер что он там при прошивке говорит?

Если в память - задача упрощается :)

Share this post


Link to post
Share on other sites

А вот и похоже и оно. Наш magic (правда есть еще 0b) , потом размер блока в 512 , ну и далее по тексту :)

 

ROM:0021ED40 loc_21ED40:                             # CODE XREF: sub_21ED0C+28j
ROM:0021ED40                 bl        sub_2206C4
ROM:0021ED44                 cmpwi     r3, 2
ROM:0021ED48                 bne       loc_21ED60
ROM:0021ED4C                 lhz       r12, 0xC(r29)
ROM:0021ED50                 cmpwi     r12, 0x530A
ROM:0021ED54                 beq       loc_21ED74
ROM:0021ED58                 li        r3, 0
ROM:0021ED5C                 b         loc_21EE94
ROM:0021ED60 # ---------------------------------------------------------------------------
ROM:0021ED60
ROM:0021ED60 loc_21ED60:                             # CODE XREF: sub_21ED0C+3Cj
ROM:0021ED60                 lhz       r12, 0xC(r29)
ROM:0021ED64                 cmpwi     r12, 0x530B
ROM:0021ED68                 beq       loc_21ED74
ROM:0021ED6C                 li        r3, 0
ROM:0021ED70                 b         loc_21EE94
ROM:0021ED74 # ---------------------------------------------------------------------------
ROM:0021ED74
ROM:0021ED74 loc_21ED74:                             # CODE XREF: sub_21ED0C+48j
ROM:0021ED74                                         # sub_21ED0C+5Cj
ROM:0021ED74                 lhz       r12, 2(r29)
ROM:0021ED78                 cmpwi     r12, 0x200
ROM:0021ED7C                 ble       loc_21ED88
ROM:0021ED80                 li        r3, 0
ROM:0021ED84                 b         loc_21EE94

 

Правда там в рассчете контр. суммы есть константа которая похоже не попала нормально в область памяти

ROM:0021EDBC                 lis       r31, unk_238778@ha

Тут либо отдизасмить аккуратнее (что лень :) ) либо забрутить по содержимому прошивки на каком нибудь блоке (чтоб не подбирать 2^32).

Edited by alex_001

Share this post


Link to post
Share on other sites

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

 

В принципе можно заменить

beq       loc_21ED74

на

b       loc_21ED74

и лоадер пример любую прошивку без вопросов.

 

проверка CRC должна быть где-то рядом и выглядеть как

lhz       r12, 0x4(r29)

хотя опять же, это может быть не CRC32, а пара CRC16, одна только заголовка, другая - блока целиком.

Share this post


Link to post
Share on other sites

Судя по всему, возможным вариантом является еще и 0x530b, возможно бутлоадер писался не только для этого свича.
Является. Это вариант для файла ОС. Файлик лоадера 0x530A а файлик ОС 0x530B

Share this post


Link to post
Share on other sites

' timestamp='1450601218' post='1218444']

Ну тогда меняете эти значения на пару от свича dlink, и проблема решена.

Так это надо менять в загрузчике. А нам нужна прошива с crc правильной. Алгоритм рассчета в блоке кот. я приводил , просто чуть ниже (простыню кода не хотел кидать , если надо - скину сюда). Набор из сдвигов or'ов add' и.т.д .

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.