sol Posted December 14, 2015 Есть горка свичек типа 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 проца. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
stas_k Posted December 14, 2015 Заголовок: 2,3 - 16 бит размер куска кода прошивки в блоке. Все блоки по 512 байт кроме последнего, который меньше. Поэтому тут везде 496 кроме последнего блока. 4,5,6,7 - постоянно меняются. Подозреваю, что там CRC. 4 байта, CRC 16? для блока указанного размера? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sol Posted December 14, 2015 Я не говорил, что там именно 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 ................ Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
NiTr0 Posted December 14, 2015 а что в конце файла? + может стоит скормить бут той же IDA, и пореверсить от вывода сообщения об ошибочной КС взад? обзорные спеки на проц должны быть же. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sol Posted December 14, 2015 А в конце файла в точности такой же блок, но покороче. Бут у меня есть из флешки прочитанный. Проц - PowerPC биг энджин. IDA уже катаю. Но там дохера. 250к примерно. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Ivan_83 Posted December 14, 2015 Их там целая куча этих CRC32, мне вот только 2 нужны были, они типа основные: http://netlab.linkpc.net/download/software/SDK/core/include/crc32.h Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sol Posted December 15, 2015 Мда... Теперь я понимаю, почему закрыты SDK на свитч-чипы... Я бегло проскакал даже не по самой ОС, а только по загрузчику-инициализатору железа. ТАМ СТОЛЬКО ГОВНИЩА!!! Джентльмены, это какой-то позор... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
[anp/hsw] Posted December 15, 2015 Дампите фуллфлеш, и в bootprom замените id 36 24 с 53 0А, или вообще вырубите его проверку. Там-то как раз нет CRC, и все будет шоколадно. Но это на случай, если на найдете алгоритм подсчета CRC (crc16 еще можно перебрать, а вот crc32 уже нереально, если инициализировать его нестандартным значением). Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
NiTr0 Posted December 15, 2015 Теперь я понимаю, почему закрыты SDK на свитч-чипы... Я бегло проскакал даже не по самой ОС, а только по загрузчику-инициализатору железа. ТАМ СТОЛЬКО ГОВНИЩА!!! Угу, эмбеддед - он такой... Код, писанный субподрядчиками-индусами и китайцами за плошку риса. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sol Posted December 15, 2015 Эташедевр ящитаю! 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 Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
NiTr0 Posted December 15, 2015 говнокомпилятор? или говнокод все же? оно не на асме же писалось... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sol Posted December 15, 2015 А х. его з. Имя "функции" при дизассемблировании я дал... А так там половина похожего. Инициализируется дебаг-порт, инициализируется RTC, БАХ! Копипаст кода инициализации дебаг-порта, который мы парой микросекунд раньше инициализировали, но тот регистр, который значение толкает - не R3 а R4... Остальной код команда в команду... У РРС ассемблер, к стати изо всех рисков самый приличный. Удобно писАть. Не то, что ARM. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alex_001 Posted December 16, 2015 А х. его з. Имя "функции" при дизассемблировании я дал... А так там половина похожего. Инициализируется дебаг-порт, инициализируется RTC, БАХ! Копипаст кода инициализации дебаг-порта, который мы парой микросекунд раньше инициализировали, но тот регистр, который значение толкает - не R3 а R4... Остальной код команда в команду... У РРС ассемблер, к стати изо всех рисков самый приличный. Удобно писАть. Не то, что ARM. Оно могло компилятором заинлайнится - так что не показатель. А вот "самый приличный ассемблер" .. Мне показалось наоборот после mips && arm'a. Одни только 3х операндные инструкции весьма выделяющаяся штука.. P.S. Так и не понял , задизасмили алгоритм расчета контрольной суммы то? Если нет - можно выложить бутлоадер , может попробуем общими усилиями , я правда ковырял PPC код весьма давно. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sol Posted December 17, 2015 Оно могло компилятором заинлайнится - так что не показатель. Оно без видимых причин повторяется два раза. Ну не надо два раза это дело делать. И, да, что процедура из последнего примера делает? А вот "самый приличный ассемблер" .. Мне показалось наоборот после mips && arm'a. Одни только 3х операндные инструкции весьма выделяющаяся штука.. Дело вкуса, но в трёхоперандных инструкциях весь цимус и сокрыт. Можно одной командой такихъ делъ наворотить! )) Это вызывает непонимание тех, у кого первый ассемблер был, скажем так, от Интел. Не суть х86 или 8080. Всё примерно одинаково. Мне, можно сказать, повезло. Мой первый ассемблер был DEC на школьной ДВК-2 и, в принципе от неё не отличающийся БК-0010 и УК НЦ. Ортогональная система команд! Опкоды запомнить - раз плюнуть. У нас в школе два класса было. Один на ДВК + БК, второй чисто на УК НЦ. А с информатиком я дружил. Как и с паяльником. Не добрался до алгоритма. Я не дома, буду завтра, в пятницу. И выложу. Там много дизассемблировать. Размер кода около 250к. Я пока доковырял до Memory mapping. Дело в том, что а коде есть некоторое кол-во переходов по абсолютным адресам, а маппинг и адреса ПЗУ меняется после определения кол-ва памяти и программирования Chip Select Machines. Зато нарыл мануал по этому SoC. Дальше дело пойдёт проще. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sol Posted December 18, 2015 Итак, я добрался... 29LV040_cor.bin - это образ флешки без 64к блока конфигурации. Рабочий, заливаешь - работает с чистым конфигом. От Интел 3624prom.210 - это сам файл прошивки с теми самыми 512 байт блоками. От Д-Линк. firmware.tar.gz Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
vlad11 Posted December 19, 2015 Программист-археолог? :) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
[anp/hsw] Posted December 19, 2015 3624prom.210 Покопался: судя по блокам 0x22-0x24 и соседним, подсчет crc происходит от всего блока целиком с предварительной заменой поля CRC заранее известным числом, но это не 00 и не FF, либо таблица полинома CRC32 выбрана нестандартная (в эту пользу говорит недостаточная энтропия CRC между этими соседними блоками). Попробую побрутфорсить, но результат не гарантирую, проще, наверное, будет в бутлоадере посмотреть :) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
[anp/hsw] Posted December 19, 2015 Также возможен вариант, что это CRC заголовка, опять же, с заменой CRC заранее известным числом перед подсчетом. Но брутфорс показал, что это как минимум нестандартная CRC32, если это вообще crc32, т.к. в дампе флеша известные таблицы я не обнаружил (хотя они могут считаться на лету при работе, но так никто не делает даже в embedded, ибо медленно). Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alex_001 Posted December 19, 2015 Образ грузить в 1F0000 (определяем по смещениям для строк). Bin при этом более менее дизасмится (где там ram тоже можно понять но пока не интересно было). Надо будет теперь порезать прошивку длинка на блоки , отрезать лишнее и собрать в bin образ. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alex_001 Posted December 19, 2015 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 или прямо в память образа исполняемого? Может глянет топикстартер что он там при прошивке говорит? Если в память - задача упрощается :) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alex_001 Posted December 20, 2015 (edited) А вот и похоже и оно. Наш 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 December 20, 2015 by alex_001 Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
[anp/hsw] Posted December 20, 2015 Судя по всему, возможным вариантом является еще и 0x530b, возможно бутлоадер писался не только для этого свича. В принципе можно заменить beq loc_21ED74 на b loc_21ED74 и лоадер пример любую прошивку без вопросов. проверка CRC должна быть где-то рядом и выглядеть как lhz r12, 0x4(r29) хотя опять же, это может быть не CRC32, а пара CRC16, одна только заголовка, другая - блока целиком. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sol Posted December 20, 2015 Судя по всему, возможным вариантом является еще и 0x530b, возможно бутлоадер писался не только для этого свича. Является. Это вариант для файла ОС. Файлик лоадера 0x530A а файлик ОС 0x530B Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
[anp/hsw] Posted December 20, 2015 Ну тогда меняете эти значения на пару от свича dlink, и проблема решена. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alex_001 Posted December 20, 2015 ' timestamp='1450601218' post='1218444']Ну тогда меняете эти значения на пару от свича dlink, и проблема решена. Так это надо менять в загрузчике. А нам нужна прошива с crc правильной. Алгоритм рассчета в блоке кот. я приводил , просто чуть ниже (простыню кода не хотел кидать , если надо - скину сюда). Набор из сдвигов or'ов add' и.т.д . Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...