
Прошивки в формате .bin применяются в маршрутизаторах, камерах, микроконтроллерах и других устройствах, где производителю важно уместить код и служебные области в одном бинарном образе. Чтобы изучить логику работы устройства, найти конфигурации или подготовить модификацию, требуется разбор структуры файла и его содержимого.
Для корректного анализа важно учитывать, что в одном образе могут находиться несколько типов данных: загрузчик, таблицы смещений, сжатые разделы, проверочные суммы и фрагменты, собранные под разные архитектуры. Без предварительной проверки структуры легко пропустить важные области или получить искажённый результат при распаковке.
Практическая работа с прошивками требует набора инструментов: распаковщиков, утилит для распознавания форматов, дизассемблеров и средств для поиска строк и служебных записей. Их комбинирование позволяет обнаружить встроенные файловые системы, получить доступ к системным скриптам и исследовать машинный код, отвечающий за логику устройства.
Материал ниже показывает, как последовательно подготовить образ, выбрать набор утилит, распаковать разделы, раскрыть машинный код и собрать данные для дальнейшего изучения или тестирования.
Определение структуры bin-файла перед анализом

Первый шаг – зафиксировать исходные параметры файла: точный размер, контрольные суммы, предполагаемую архитектуру и возможные сигнатуры разделов. Для этого удобно применять binwalk —signature, xxd или hexdump, чтобы увидеть расположение заголовков, таблиц и сжатых блоков.
При наличии встроенной файловой системы стоит проверить, используются ли SquashFS, JFFS2, UBIFS или собственный формат производителя. Их сигнатуры обычно читаемы в начале соответствующих разделов. Фиксация этих данных упрощает дальнейшую распаковку и исключает повреждение структуры файла.
Извлечение содержимого прошивки с помощью специализированных утилит

Для доступа к сегментам прошивки применяются инструменты, способные корректно распаковать сжатые блоки, отделить загрузчик и извлечь встроенные файловые системы. Наиболее практичный подход – комбинировать несколько утилит, чтобы учесть различия форматов у разных производителей.
- binwalk —extract – автоматическое извлечение известных типов данных, включая SquashFS, LZMA, gzip, uImage и разделы с собственными сигнатурами.
- dd – ручное выделение фрагментов по определённым смещениям, если автоматический разбор дал неполный результат.
- unsquashfs и jefferson – получение содержимого SquashFS и JFFS2 в случае, когда binwalk распознал сигнатуры, но не извлёк файлы полностью.
- firmware-mod-kit – набор скриптов для разборки и сборки прошивок, полезный при нестандартной упаковке образа или наличии дополнительных защитных слоёв.
После извлечения важно проверить корректность полученных каталогов: наличие файловой структуры, исполняемых бинарных модулей, конфигураций и служебных таблиц. Несоответствие размеров или отсутствие ожидаемых директорий указывает на повреждённый сегмент или ошибку распаковки.
Распознавание формата разделов и выявление встроенных файловых систем
Определение формата разделов помогает понять, какие компоненты включены в прошивку: загрузчик, ядро, файловая система, служебные блоки. Для первичной проверки применяются сигнатуры, которые заметны при просмотре образа в шестнадцатеричном виде или в отчётах binwalk.
Ниже приведены наиболее частые типы разделов и характерные признаки, по которым их можно опознать вручную или с помощью автоматических инструментов:
| Тип раздела | Сигнатура | Комментарий |
|---|---|---|
| uImage | 0x27051956 | Содержит заголовок ядра; длина и тип указываются внутри структуры. |
| SquashFS | «hsqs» | Часто применяется в маршрутизаторах, поддерживает сжатие LZMA или XZ. |
| JFFS2 | 0x1985 | Используется во флеш-памяти; требует раздельного извлечения блоков. |
| UBIFS | «UBI#» | Формат для NAND-памяти; включает собственные таблицы смещений. |
| Proprietary FS | Произвольные сигнатуры | Часто встречается у малых производителей; требует ручного анализа. |
Если автоматический разбор дал неоднозначный результат, важно сверить смещения сигнатур и длину блоков. Несоответствие может означать, что файловая система встроена внутри контейнера или использует дополнительный слой сжатия. В таких случаях полезно повторно проверить образ через binwalk —raw, чтобы увидеть вложенные структуры.
Назначение корректных параметров для распаковки бинарного образа

Перед распаковкой необходимо определить точное смещение каждого раздела. Для этого сравнивают данные из binwalk с ручным шестнадцатеричным просмотром: совпадение начальных байтов и длины блока гарантирует правильный выбор параметров для последующих операций.
При использовании dd важно указывать параметры skip и count в секторах или байтах, опираясь на реальные смещения. Ошибка даже в несколько байтов приведёт к повреждению выделенного сегмента, особенно если внутри находится файловая система или контейнер сжатия.
Если образ содержит сжатые разделы, потребуется указать корректный формат при их ручном извлечении. Например, для LZMA стоит убедиться, что поток начинается с сигнатуры 5D 00 00, а для gzip – с 1F 8B. Несоответствие сигнатуры говорит о дополнительном заголовке, который необходимо предварительно удалить.
При работе с контейнерами вроде uImage нужно учитывать параметры, зашитые в его заголовке: длину полезных данных, тип сжатия и контрольные суммы. Неверное использование этих значений приведёт к некорректной сборке или распаковке ядра при последующем анализе.
Использование дизассемблеров для просмотра машинного кода прошивки
Для анализа исполняемой части прошивки важно точно определить архитектуру процессора: MIPS, ARM, ARM64, x86 или редкие варианты наподобие ARC. Проверка заголовков uImage, ELF-файлов или результатов binwalk помогает избежать неправильной интерпретации инструкций.
На практике применяются инструменты Ghidra, IDA Free и radare2. Они позволяют загрузить сегменты вручную, указав базовый адрес, чтобы дизассемблер корректно построил переходы и таблицы. Если прошивка содержит несколько исполняемых областей, их загружают раздельно и синхронизируют по смещениям.
При отсутствии отладочных символов помогает просмотр строк, таблиц вызовов и характерных шаблонов библиотечных функций. Например, обнаружение последовательности инструкций инициализации сетевых интерфейсов подсказывает, где находится код конфигурации ядра или драйвера.
Если исполняемый модуль сжат или упакован, предварительно распаковывают поток и проверяют его структуру через file и шестнадцатеричный просмотр. Только после этого сегмент загружают в дизассемблер, чтобы исключить ложные инструкции и некорректные переходы.
Анализ строк, конфигураций и служебных таблиц внутри прошивки

После извлечения и распаковки прошивки важно исследовать текстовые и бинарные данные для выявления конфигураций, параметров и внутренних связей. Для этого применяются утилиты strings, hexdump и специализированные скрипты поиска шаблонов.
- Поиск конфигурационных файлов: проверка директорий, распакованных из SquashFS или JFFS2, позволяет найти файлы *.conf, *.ini и *.xml, содержащие IP-адреса, сетевые параметры и параметры служб.
- Анализ таблиц смещений: использование hexdump -C и скриптов для поиска указателей и адресов функций помогает определить структуру ядра и расположение драйверов.
- Выделение строк из исполняемых сегментов: команды strings -n 4 или rabin2 -zz позволяют найти системные сообщения, шаблоны ошибок и пути к ресурсам.
Особое внимание уделяется идентификации контрольных сумм и хешей, которые могут проверяться загрузчиком. Их корректная фиксация упрощает последующую модификацию прошивки или тестирование изменений.
Сбор и систематизация полученных данных после декомпиляции

После завершения извлечения и анализа всех сегментов прошивки важно упорядочить данные для дальнейшего изучения или модификации. Рекомендуется создать отдельные каталоги для каждого типа информации: ядро, файловые системы, конфигурации, строки и служебные таблицы.
Для упрощения работы применяются файлы-индексы или таблицы, где фиксируются:
- Название сегмента и его смещение в исходном образе.
- Тип данных: исполняемый код, конфигурация, сжатый раздел.
- Контрольные суммы и длина блока для проверки целостности.
- Ссылки на файлы и скрипты, извлечённые из разделов.
Использование структурированных отчётов или Excel/CSV-файлов позволяет отслеживать изменения при повторной распаковке или модификации. Это снижает риск потери данных и помогает анализировать взаимосвязи между сегментами прошивки.
Вопрос-ответ:
Какие инструменты нужны для декомпиляции bin-прошивки?
Для анализа bin-прошивки используют binwalk для распознавания и извлечения разделов, dd для выделения сегментов вручную, unsquashfs и jefferson для работы с файловыми системами SquashFS и JFFS2, а также дизассемблеры Ghidra, IDA или radare2 для просмотра машинного кода.
Как определить архитектуру процессора перед анализом кода?
Архитектуру можно узнать из заголовков uImage, ELF-файлов или по результатам binwalk. Для MIPS, ARM, ARM64 или x86 важна точная настройка дизассемблера, чтобы инструкции и переходы отображались корректно. Ошибочная архитектура приведёт к неправильной интерпретации кода.
Как правильно извлечь разделы сжатой файловой системы?
После распознавания сигнатур с помощью binwalk указывают смещения и тип сжатия. Для SquashFS применяют unsquashfs, для JFFS2 — jefferson. Если поток содержит дополнительные заголовки, их нужно удалить, проверив первые байты через hexdump или xxd.
Как находить конфигурации и служебные таблицы внутри прошивки?
Для поиска используют strings с минимальной длиной 4 символа, hexdump и скрипты для анализа таблиц смещений. Обнаруженные файлы конфигурации часто имеют расширения .conf, .ini или .xml, а служебные таблицы помогают понять структуру ядра и расположение драйверов.
Какие методы систематизации данных после декомпиляции помогают избежать ошибок?
Создают отдельные каталоги для каждого типа данных: ядро, файловые системы, конфигурации, строки и таблицы. В таблицах фиксируют смещения сегментов, контрольные суммы, длину и тип данных. Это позволяет отслеживать изменения, проверять целостность и ускоряет повторный анализ или модификацию прошивки.
Как безопасно проверить целостность извлечённых разделов bin-прошивки перед анализом?
После распаковки важно убедиться, что извлечённые сегменты не повреждены. Для этого вычисляют контрольные суммы каждого блока и сравнивают с оригиналом. При использовании dd или binwalk —extract проверяют длину выделенных сегментов и соответствие сигнатур. Несоответствие размеров или контрольных сумм указывает на ошибку при выделении, что может привести к неправильной интерпретации файловой системы или машинного кода. Дополнительно полезно открывать сжатые разделы через unsquashfs или jefferson и проверять, что все файлы извлечены корректно и структура каталогов соответствует ожидаемой.
