Как стать автором
Обновить

Комментарии 31

Повезло, что не пришлось шаманить с параметрами LZMA при упаковке SquashFS - порой бывают всякие приколы с этим - например, приходится подбирать параметры -lc, -lp, -pb и прочие подобные им.

Недавно ковырял одну штуку - там тоже использовалось сжатие XZ в образе, но как я ни извращался с параметрами xz - загрузчик никак не хотел распаковывать образ в процессе загрузки, при этом (ЧСХ) если дёрнуть функцию распаковки из своей программы, подммапив бинарь загрузчика в неё - на компе распаковка того же образа проходила без ошибок. Благо, в загрузчике была поддержка не только XZ, но и LZMA - и вот образ собранный с LZMA взлетел с первой попытки.

недавно встретил похожее. В моём случае дело было в том, что lzma из xz создаёт файл в потоковом режиме и выставляет размер в FFFFFFFF в заголовке и в конце ставит специальный признак конца. А на стороне распаковщика работа с потоковым режимом была явна запрещена. В xz создать архив нужного формата невозможно вообще, так что пришлось добавить пост-обработку.

Изюминку в происходящее добавило то, что распаковщиком архива был bootstrap из u-boot, который, мягко выражаясь, беден на отладочную печать

Тут меня скорее удивила не сама проблема с XZ (к ней я был более-менее готов), а то, что один и тот же код, выполняющийся в контексте загрузчика выдаёт ошибку при распаковке образа, а выполняющийся в контексте приложения userspace - успешно распаковывает тот же поток (при этом функция распаковки принимает указатель и длину сжатых данных и указатель на буфер и длину распакованных данных).

Но идея с размером FFFFFFFF интересна, проверю - возможно, проблема и у меня в этом (паковал через xz < data > data.xz).

уверены, что код один и тот же? У меня распаковщик использовал реализацию от 7z. Причём довольно старую. Причём у меня сложилось впечатление, что оригинальная реализация и есть от 7z, а xz это новейшая переделка.

уверены, что код один и тот же?

Уверен, я использовал для тестирования распаковки под Linux бинарь загрузчика и вызывал функцию распаковки прямо из него (благо, там не было всяких printf и прочего взаимодействия с ОС - чистая математика и работа с памятью).

Расскажите пожалуйста, как вы эмулировали бинарник загрузчика? С помощью qemu?

Загрузчик был для x86-64, поэтому я его не эмулировал а запускал на хосте (кстати да, это идея - возможно под qemu где я запускал полный образ не хватает каких-то инструкций, а код загрузчика проверяет их наличие и ведёт себя по разному - надо будет проверить).

А запускал я его код следующим образом:

  1. Извлекаем секцию кода и секцию данных из бинарника в отдельные файлы.

  2. Конвертируем бинарные секции в ELF с помощью objcopy -I binary -O elf64-x86-64 -B i386 code.bin code.o и objcopy -I binary -O elf64-x86-64 -B i386 data.bin data.o

  3. Пишем Linker Script в котором указываем адреса загрузки секций и адреса интересующих нас функций (можно использовать только чистые функции - даже банальный printf() в коде бинарника может всё сломать и засегфолтить)

  4. Пишем программу на C, в которой определяем прототипы функций из бинарника (как extern) и вызываем интересующие функции.

  5. Собираем всё это добро используя Linker Script.

Примерно так это выглядит: https://github.com/S-trace/link_binary_code_to_elf

В принципе можно обойтись банальным mmapом секций бинарника по нужным адресам (с PROT_READ|PROT_EXEC для секции кода) и кастом size_t адреса функции к указателю на функцию и затем вызовом этой функции по полученному указателю, но это уж очень уродливо в коде смотрится.

Eсли загрузчик для "чужой" (не совпадающей с архитектурой хоста) архитектуры - можно в qemu сэмулировать соответствующую машину с Linux и проделать всё это в qemu.

А потом каждый новый апдейт и патч тоже ручками ковырять ?

Бессмысленный труд, с заранее известным печальным результатом.

Вместо этого можно было просто взять аппарат, для которого есть полная поддержка в OpenWRT, прошить и далее спокойно конфигурировать на нём софт как удобно.

Ну патчи не так часто выходят, а "ковыряние" можно и автоматизировать. А так да, аппарат с поддержкой OpenWRT уже взял. Пост немного о другом)

на 8197 openwrt тоже стартует.

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

Да, стартует. Насколько я знаю, там проблема в отсутствии драйверов для вайфая.

Мне кажется что на моменте с cvimgстоило все же разобраться чуть тщательнее и описать алгоритм генерации контрольной суммы.

А то по тексту используются нормальные штатные инструменты а под самый конец какая-то мутная утилита черный ящик.

В любом случае было интересно.

Согласен. В скором времени дополню пост.

Статья неплохая, но с долей везения:

  • telnet есть, пароль рутовый вам выдали (ковырял mi router, там телнет залочен и доступен только на девелоперской прошивке, которая тоже по запросу выдается)

  • cvimg - вот его бы расковырять и понять, как генерятся циферки. Возвращаясь к похожему ковырянию mi router, там прошивка шифровалась с использованием ассиметричного шифрования, и пока у тебя нет ключа, хоть ты тресни, а роутер не примет прошивку (ну либо надо было по хитрому патчить софтину, либо хардварно вливать прошивку)

Да, D-Link не стали особо париться) Ещё повезло что нашлись исходники. А cvimg я расковыряю и скорее всего дополню пост.

либо хардварно вливать прошивку

Если маршрутизатор современный, то там часто бывают аппаратные проверки подписи. Таким образом, хардварная прошивка не поможет.

Полагаю, в домашних роутерах такое встречается редко ввиду удорожания всей схемы. Но было бы интересно узнать, как обходятся подобные ограничения.

Примерно так же "ломал" прошивку ASUS NAS-M25, вмешивался в squashfs оставлял симлинк на флешку, а с нее уже запускалось то что мне нужно.

Asus не распространял исходный код прошивки, но были скопиленные утилиты для сборки прошивки из разных частей (не пришлось высчитывать CRC)

Ради блокировки рекламы которая блочится аддонами на уровне браузера, такой перформанс бубнов и танцев? Стоит ли овчинка выделки?

Стоит. Так как такой роутер может выпиливать рекламу и на смартфоне и на телевизоре и ещё где.

Полноценно не сможет. Если реклама грузится с того же домена, что и контент, то, заблокировав обращения к домену, вы лишаетесь и контента.

На мегапопулярном YouTube тоже не сможет, там поддомены, с которых тянется реклама, генерируются с невероятной скоростью.

Поэтому, я отказался в своё время от AGH, раз равно не получится уйти от блокировщика в браузере.
Вот это потрясающий пример реверс-инжинеринга. Громадное спасибо за статью. Вряд ли кто-то будет ковырять этот роутер, но сам подход по перепаковке образов очень полезен. Для себя подчерпнул много нового.

Сам в своё время ковырял так прошивки.

А отчего никто не публикует посты «как поднять что угодно на роутерах за пятьсот рублей»? На относительно суровых железках и так понятно, что можно что-то сделать.

Те, кто могут поднять что угодно, обычно имеют средства для покупки роутера не за 500 рублей.

на котором работает сабж на данный момент не имеет полной поддержки OpenWRT, исходных кодов прошивки от D-Link'а нет

Вот тут не очень понял. Судя по выводу на маршрутизаторе стоит u-boot и linux. Оба под лицензией GPL. D-Link обязан предоставить вам исходный код по запросу. Если есть контакт с поддержкой, попробуйте спросить про исходники. Может дадут.

Практика показывает, что могут что-то недодать, какие-то моменты, скрипты или сборку не той версии.

Там не u-boot, а bootloader собственной разработки (возможно форк чего-нибудь, его исходники есть в упомянутых в статье SDK). А по поводу исходников прошивки, я им писал ещё в начале прошлого года, до сих пор жду ответ))

Спасибо автору за статью. В свое время для хобби хотел разлочить роутер от провайдера, очень помогла бы. Но да ладно. Все равно спасибо ! Познавательно !

А проверка crc требование контроллера?

Не совсем понял что вы имеете в виду. Если вы о том, проверяется ли контрольная сумма при запуске, то да, я пытался залить модифицированную прошивку на флеш и загрузчик выдал ошибку.

Круто. мне бы так. завидую.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации