Как расшифровать прошивку bin
Как расшифровать прошивку автомобиля в неизвестном формате
Toyota распространяет свои прошивки в недокументированном формате. Мой заказчик, у которого автомобиль этой марки, показал мне файл прошивки, который начинается так:
CALIBRATIONêXi º
attach.att
ÓÏ[Format]
Version=4
[Vehicle]
Number=0
DateOfIssue=2019-08-26
VehicleType=GUN1**
EngineType=1GD-FTV,2GD-FTV
VehicleName=IMV
ModelYear=15-
ContactType=CAN
KindOfECU=0
NumberOfCalibration=1
[CPU01]
CPUImageName=3F0S7300.xxz
FlashCodeName=
NewCID=3F0S7300
LocationID=0002000100070720
CPUType=87
NumberOfTargets=3
01_TargetCalibration=3F0S7200
01_TargetData=3531464734383B3A
02_TargetCalibration=3F0S7100
02_TargetData=3747354537494A39
03_TargetCalibration=3F0S7000
03_TargetData=3732463737463B4A
3F0S7300forIMV.txt ¸Ni¶m5A56001000820EE13FE2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133E2030133E2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133E2030133E2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133E20911381959FAB0EE9000
81C9E03ADE35CEEEEFC5CF8DE9AC0910
38C2E031DE35CEEEEFC8CF87E95C0920
.
Дальше идут строки по 32 шестнадцатеричные цифры.
Хозяину и прочим умельцам хотелось бы перед установкой прошивки иметь возможность проверить, что там внутри: засунуть ее в дизассемблер и посмотреть, что она делает.
Конкретно для этой прошивки у него имелся дамп содержимого:
Как видно, нет ничего даже близко похожего на строчки шестнадцатеричных цифр в файле прошивки. Встает вопрос: в каком формате распространяется прошивка, и как ее расшифровать? Эту задачу хозяин автомобиля поручил мне.
Повторяющиеся фрагменты
Посмотрим внимательно на те шестнадцатеричные строчки:
5A56001000820EE13FE2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133E2030133E2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133E2030133E2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133E20911381959FAB0EE9000
81C9E03ADE35CEEEEFC5CF8DE9AC0910
38C2E031DE35CEEEEFC8CF87E95C0920
.
Соответствия между блоками
Получим список всех пар (блок файла, блок дампа), и поищем в нем закономерности:
Вот как выглядят первые пары в отсортированном списке:
Действительно, видны закономерности:
Для проверки — «отрежем» старшие 4 бита в каждом полублоке, и посмотрим, какие пары получатся:
После перестановки подблоков по 4 бита в ключе сортировки, соответствия между парами подблоков становятся еще более явными:
Соответствия между подблоками
В вышеприведенном списке видны такие соответствия:
Когда таблицы соответствия готовы, код расшифровки получается совсем простой:
Заголовок прошивки
Хозяин автомобиля, передавший мне файлы для анализа, подтвердил, что в прошивках встречаются и сжатые LZF данные. К счастью, реализация LZF открыта и довольно проста, так что вместе с моим анализом ему удалось удовлетворить свое любопытство по поводу содержимого прошивок. Теперь он может вносить изменения в код — например, автозапуск двигателя при падении температуры ниже заданного уровня, чтобы использовать автомобиль в условиях суровой русской зимы.
Тайна прошивок
Авторы: к.ф.-м.н. Чернов А.В. (monsieur_cher) и к.ф.-м.н. Трошина К.Н.
Как с помощью самых общих предположений, основанных на знании современных процессорных архитектур, можно восстановить структуру программы из бинарного образа неизвестной архитектуры, и дальше восстановить алгоритмы и многое другое?
В этой статье мы расскажем об одной интересной задаче, которая была поставлена перед нами несколько лет назад. Заказчик попросил разобраться с бинарной прошивкой устройства, которое выполняло управление неким физическим процессом. Ему требовался алгоритм управления в виде компилируемой С-программы, а также формулы с объяснением, как они устроены и почему именно так. По словам Заказчика, это было необходимо для обеспечения совместимости со «старым» оборудованием в новой системе. То, как мы в итоге разбирались с физикой, в рамках данного цикла статей мы опустим, а вот процесс восстановления алгоритма рассмотрим подробно.
Практически повсеместное использование в массовых устройствах программируемых микроконтроллеров (концепции интернета вещей IOT или умного дома SmartHome) требует обратить внимание на бинарный анализ встраиваемого кода, или, другими словами, бинарный анализ прошивок устройств.
Бинарный анализ прошивок устройств может иметь следующие цели:
Анализ формата бинарного файла
Если в мире «настоящих» операционных систем форматы исполняемых файлов стандартизированы, то в мире встраиваемых программ каждый вендор может использовать свое проприетарное решение. Следовательно, анализ бинарного файла прошивки приходится начинать с анализа формата бинарного файла.
В начале работы ситуация для нас выглядела следующим образом: мы получили некоторый файл с прошивкой без какой-либо сопроводительной документации. Не было информации ни о формате файла прошивки, ни об архитектуре микроконтроллера.
Файл с прошивкой оказался текстовым файлом. Он содержал строки примерно следующего вида:
Внимательно посмотрев на набор этих строк, мы сообразили, что это – вполне стандартный для микроконтроллеров формат Intel HEX. Файл состоит из записей, в каждой из которой указывается ее тип, адрес размещения в памяти, данные и контрольная сумма. Само по себе использование формата Intel Hex предполагает, что файл, скорее всего, не зашифрован и представляет собой образ программы, размещаемой в памяти.
Хотя формат Intel Hex поддерживает вплоть до 32-битной адресации памяти, в нашем файле присутствовали записи только с 16-битными адресами в памяти. Поэтому по текстовому файлу легко создать бинарный файл образа памяти, в котором записи из исходного тестового файла уже будут размещены по заданным адресам. Такой бинарный файл удобнее инспектировать с помощью утилит анализа бинарного файла, да и писать свои утилиты для него проще, чем для Intel HEX. Бинарный файл образа памяти подтвердил, что файл не зашифрован, так как разнообразные осмысленные строки были обнаружены разбросанными в разных местах кода.
Однако это не дало ответ на вопрос, для какой архитектуры этот файл.
Мы получили файл с образом памяти какого-то 16-битного или 8-битного микроконтроллера. И что это за микроконтроллер – непонятно. Мы взяли IDA Pro и попробовали дизассемблировать файл всеми возможными вариантами поддерживаемых процессоров. И ничего. Ни один процессор из поддерживаемых IDA Pro не подошел: листинг либо не сгенерировался, либо содержал явную бессмыслицу. Возможно, это была программа для одного из поддерживаемых IDA Pro процессоров, но мы что-то делали не так. Например, нужна была просто дополнительная обработка файла образа. В любом случае, здесь можно было приостановить работы и запросить дополнительную информацию о бинарном файле.
Все процессоры примерно одинаковы
Но нам стало интересно, а что мы можем понять по бинарной программе, даже если процессор, для которой она скомпилирована – неизвестен. Ответ «ничего» — неинтересен, даже если мы сможем понять чуть-чуть, это лучше, чем ничего. Очевидно, что текстовые строки могут дать информацию о программе, но мы целим в большее – понять что-то из структуры программы.
Различных процессорных архитектур – большое количество. Эволюция вычислительной техники порождала даже самые необычные архитектуры типа троичных компьютеров. Однако микропроцессоры и микроконтроллеры, существующие в настоящее время, по крайней мере массовые, удивительно похожи друг на друга.
Ниже мы перечислим базовые принципы, общие для современных микропроцессоров.
Последовательное исполнение инструкций. Процессор исполняет инструкции, расположенные последовательно в памяти. Существуют специальные инструкции условного и безусловного перехода и вызова и возврата из подпрограммы, которые позволяют прервать последовательную выборку инструкций из памяти и перейти к выполнению другой инструкции. Однако остальные инструкции предполагают последовательное выполнение, и поэтому не содержат адреса следующей инструкции.
Бинарное кодирование. Помимо того, что процессор обрабатывает данные в бинарном виде, инструкции процессора, составляющие исполняемую программу, закодированы в бинарном формате, то есть поля, в которых хранятся параметры инструкции, например, смещения или номера регистров, занимают целое число бит. Можно теоретически представить, что, несмотря на двоичное кодирование данных и программы, они будут обрабатываться в процессоре в какой-то другой системе счисления, но нам такая экзотика неизвестна.
Следующие принципы, вообще говоря, не являются базовыми архитектурными принципами, но практически повсеместно выполняются, в особенности для машинного кода, не написанного вручную на языке ассемблера, а сгенерированного компилятором языка высокого уровня.
Процедурное программирование. Программа разбивается на структурные единицы, которые могут называться по-разному: процедуры, функции, подпрограммы и т. п. Подпрограммы могут вызывать другие подпрограммы, передавая им параметры и получая обратно результат выполнения. Важно, что у подпрограммы одна точка входа, то есть все подпрограммы, вызывающие данную, переходят на один и тот же адрес точки входа.
Как правило, подпрограммы имеют одну точку выхода, возвращающую управление в точку вызова, но это менее существенно, чем требование одной точки входа для каждой подпрограммы. Такой код обычно получается в результате компиляции программы. Оптимизатор периода компоновки (link-time optimizer) может частично разрушить эту структуру для уменьшения размера программы, а размер программы – критичен для встраиваемых систем. Тем более эту структуру может разрушить обфускатор кода.
Вложенность вызовов подпрограмм может организовываться с помощью стека, который еще можно использовать для передачи аргументов в подпрограмму и хранения локальных переменных, но на текущем уровне проработки архитектуры эта информация преждевременна.
Как можно применить эти принципы к первичному анализу бинарного кода?
Сделаем базовое предположение, что в системе команд процессора есть инструкция RET (возврат из подпрограммы). Эта инструкция имеет какое-то фиксированное бинарное представление, которое мы и будем искать. Если RET не единственный, как в x86, где у RET есть аргумент – размер области параметров подпрограммы, или если RET является побочным эффектом более сложной операции, как в ARMv7, где значение PC можно извлекать из стека одновременно со значениями других регистров(ldmfd sp!, < fp, pc >), тогда, скорее всего, наш эвристический поиск не даст результатов.
Еще нам нужно сразу же сделать разумные предположения о принципе кодирования инструкций исследуемого процессора. В существующих процессорах используется несколько принципов кодирования инструкций:
которая складывает значения регистров eax и ebx и помещает результат в eax, кодируется двумя байтами:
На ARMv7 инструкция
которая складывает значения регистров r0 и r1 и помещает результат в r0, кодируется 32-битным значением e0800001.
В достаточно большой программе подобные инструкции будут повторяться не один раз. Если интересующая нас последовательность байт (например, 01 d8) встречается по произвольному невыровненному адресу, можно сделать предположение, что у процессора инструкции кодируются потоком байт переменного размера. Если же значение, например, e0800001 встречается только по адресам, кратным 4, можно сделать предположение о фиксированном размере инструкций процессора. Конечно же, здесь возможна ошибка, что мы приняли байты данных за инструкцию, или так случайно получилось, что некоторая инструкция всегда оказалась выровнена. Однако, влияние такого «шума» на программу достаточного размера будет невелико.
Когда мы посмотрели на анализируемую прошивку под таким углом, стало понятно, что скорее всего у рассматриваемого процессора инструкции кодируются 16-битными значениями.
Итак, исходя из предположения, что кодирование инструкции RET – это некоторое фиксированное 16-битное значение, попробуем найти его. Найдем в образе программы наиболее часто встречающиеся 16-битные значения. В нашем случае получилась следующее:
Инструкцию RET будем искать среди этих наиболее часто встречающихся в коде 16-битных значений. Сразу же мы будем искать инструкцию CALL – парную к инструкции RET. Инструкция CALL имеет по крайней мере один параметр – адрес перехода, поэтому фиксированными значениями не обойтись.
Сделаем предположение, что во многих случаях немедленное после конца одной подпрограммы, то есть после инструкции RET, начинается другая подпрограмма, и эта подпрограмма вызывается инструкцией CALL из другой точки программы. Большое количество переходов на адрес, непосредственно следующий за RET, будет одним из признаков, отличающих инструкцию CALL. Конечно же, это правило не универсальное, так как на некоторых платформах, в частности, ARMv7, непосредственно после завершения из подпрограммы обычно располагается пул констант. В этом случае мы можем рассматривать некоторый разумный диапазон адресов непосредственно после RET в качестве точек перехода инструкции RET.
В случае инструкции CALL для перехода к подпрограмме вариантов ее кодирования может быть достаточно много. Во-первых, процессор может использовать разный порядок байт в слове: little-endian, как на большинстве современных процессоров, когда многобайтное целое число записывается в памяти, начиная с младшего байта, и big-endian, когда многобайтное целое число записывается в памяти, начиная со старшего байта. Практически все современные процессоры работают в режиме little-endian, но отбрасывать другие возможные порядки байт в слове не стоит.
Во-вторых, инструкция CALL может использовать либо абсолютную адресацию точки перехода, либо адресацию относительно текущего адреса. В случае абсолютной адресации закодированная инструкция содержит адрес, на который требуется перейти в каких-то битах закодированной инструкции. Чтобы обеспечить вызов подпрограммы из любой точки 16-битного адресного пространства в любую другую точку по абсолютному адресу 16-битного слова закодированной инструкции не хватит, так как кроме адреса перехода нужно еще где-то хранить биты кода операции. Поэтому имеет смысл рассматривать два 16-битных слова подряд и пробовать разные варианты разбиения адреса перехода между этими словами.
Альтернатива абсолютному кодированию адреса подпрограммы – относительное кодирование. В закодированную инструкцию мы записываем разность адреса подпрограммы и текущей точки. Относительное кодирование обычно предпочтительнее абсолютного, потому что, во-первых, программа с относительными переходами позиционно-независима, то есть может размещаться в памяти с любого адреса без каких-либо изменений в бинарном коде. Во-вторых, для кодирования смещения можно резервировать меньше бит, чем размерность адресного пространства, исходя из того, что во многих случаях вызываемая подпрограмма находиться не так далеко от вызывающей. Однако, если смещение для вызова выходит за диапазон представимых значений, придется вставлять специальные инструкции-«трамплины».
Относительное кодирование адреса подпрограммы может выполняться с некоторыми вариациями: во-первых, адрес текущей точки программы может браться либо как адрес текущей инструкции, либо как адрес следующей инструкции, как в процессорах x86, либо адрес еще какой-то инструкции около текущей точки. Например, в процессорах ARM за точку отсчета берется адрес текущей инструкции +8 (то есть не адрес следующей после CALL инструкции, а адрес следующей за следующей инструкции). Кроме того, поскольку в нашем случае программа записывается в виде потока 16-битных слов, логично ожидать, что и смещение будет выражено в словах. То есть, чтобы получить адрес вызываемой подпрограммы, смещение потребуется умножить на 2.
С учетом всего вышеописанного получаем следующее пространство перебора для поиска пары CALL/RET в бинарном коде.
Сначала в качестве кандидатов для инструкции RET берем 16-битные слова из списка наиболее часто встречающихся значений в коде. Дальше для поиска инструкции CALL перебираем:
Для каждого из вариантов в описанном выше пространстве перебора вычисляем статистики:
И находим только один возможный вариант!
Итак, 16-битное слово 8c0d подходит в качестве кандидатуры для инструкции RET. Всего в прошивке 430 позиций программных адресов непосредственно после этой инструкции. Рассматривались 32-битные значения (два 16-битных слова подряд), при значении маски адреса, равном ff 00 ff 00 обнаружена инструкция с кодом 00 0b 00 3d. Таких инструкций всего 1275, из них 843 (то есть 66%) передают управление в точку, непосредственно следующую за кандидатом в RET. Таким образом, выявлены две инструкции:
Дальше мы расскажем, как восстанавливались условные и безусловные переходы и некоторые арифметические и логические операции.
Файл формата BIN: чем открыть, описание, особенности
Для чего предназначен универсальный формат BIN с двоичными данными, и чем его открыть на компьютере
Основная задача BIN формата — сохранять двоичные данные цифровых образов CD и DVD на ПК. Чаще всего файл является цифровой эмуляцией физического носителя со свойствами, идентичными формату ISO, но может быть предназначен и для других целей. Благодаря этой статье вы поймете, чем открыть файл BIN на компьютере и зачем он нужен.
Содержание
Как открыть BIN
Расширение BIN представляет собой метаданные, описывающие содержимое диска, находящегося в дисководе (порядок расположения информации, тип образа, занимаемый объем памяти и т.д.). Такой формат можно назвать универсальным, т.к. файлы бинарного типа используются всеми операционными системами, включая Android и iOS.
Одним из недостатков BIN-файлов является путаница в назначении и множестве методов просмотра документа в зависимости от сферы использования. Столкнуться с данным форматом можно при работе с образами CD- и DVD-дисков, архивами на macOS, образами игр для эмуляторов, а также при прошивке маршрутизатора. Чтобы представлять, с каким BIN-файлом имеете дело, стоит взглянуть на размер и сопроводительные файлы в папке.
Помимо описанных назначений BIN встречается в смартфонах Nokia и Blackberry (RIM).
CD и DVD-образы
Формат BIN — файл образа, т.е. полная цифровая копия физического диска (эмуляция). Также под расширением скрывается инфо-файл о дорожках воспроизведения (количество фильмов и эпизодов сериала, видеоклипы и иная цифровая информация, считываемая мультимедийным плеером при воспроизведении). Следственно, для открытия файлов используется соответствующее ПО.
Программы для монтирования CD/DVD образа можно скачать на нашем сайте:
Для открытия двоичных видеофайлов, скачайте видеоплееры:
Архивы MacBinary
На Macintosh распространены архивы MacBinary, в которых BIN-файл хранит в себе следующий набор нулей и единиц:
В качество ПО рекомендуем использовать The Unarchiver или стандартный архиватор — Apple Archive Utility.
Также BIN-формат применялся для отправки файлов по интернету из-под macOS, однако сегодня вытеснен архивами нового типа с разрешением DMG.
Открыть BIN в редакторе
BIN-файлы хранят информацию в двоичном виде. Такие документы создаются программами и приложениями для хранения и структуризации данных в режиме «только для чтения». Переписать содержимое документа классическим текстовым редактором не получится.
Образы для эмуляторов
Если выросли в 90-е годы, то наверняка застали игровую приставку Sega Genesis, которую в СНГ назвали Mega Drive. Причем тут BIN? Образы видеоигр для картриджей Сеги кодируются бинарно, поэтому понадобятся программы-эмуляторы.
Эмуляторы Sega для работы с BIN:
В случае с Nintendo DS картина схожая. BIN-файлы нужны для хранения исполняемых данных, которые при желании корректируются для запуска проекта на эмуляторе. Библиотеки BIN хранятся в одной папке с файлами типа NDS.
Эмуляторы Nentendo DS для работы с BIN:
Для консоли Sony Playstation первого поколения разработаны эмуляторы, среди которых стоит выделить PCSX, использующий BIN-формат для сохранения BIOS оригинальной приставки. Такой подход необходим, чтобы пользователь ПК чувствовал полное погружение в игру с аутентичными ощущениями (плавность картинки, динамика, тайминги).
Эмуляторы PlayStation для работы с BIN:
Прошивка маршрутизатора
Производители сетевого оборудования (Belkin, Linksys) регулярно обновляют выпускаемые маршрутизаторы программно, меняя низкоуровневые данные, управляющие модемом. BIN-файлы, содержащие свежее обновление для сетевого оборудования, инсталлируются благодаря интерфейсу самого роутера. Например, чтобы прошить оборудование от Linksys, в интерфейсе разработана вкладка «Администрирование». Попасть в настройки можно, введя в поисковой строке любого браузера «192.168.1.1».
Частые проблемы BIN-файлов
Главный недостаток формата — «любовь» со стороны злоумышленников и хакеров, которые модифицируют BIN-файлы, делая из них вирусы. В результате видны следующие ошибки на ПК:
8_Пособие для прошивальщиков
Всем добрый день.
На рабочем месте сегодня был целый день в гордом одиночестве, поэтому разрешил себе немного пошалить)
Взял с дома ноут и все необходимое для баловства.
И так тема:»Изменение температуры включения вентилятора охлаждения», вопрос на которую ни где не нашел толкового ответа.
С наступлением тепла, многих водителей напрягает температура включения вентилятора.
В основном все справляются с этой проблемой установкой бк с регулировкой температуры включения этого самого «Карлосона».
Некоторые за определенное количество денежных средств едут к диагностам и чиптюнерам.
Эта запись для тех кто не хочет платить за то, что можно сделать самому.
Все что нам нужно:
ChipLoader — флешер, что бы считать и залить прошивку в блок,
СhipTuningPro (далее STP) — редактор прошивок,
Enigma — конвертер, делает из криптованной прошивки декриптованную.
Ромокабель или K-line адаптер для диагностики,
Паяльник,
Резисторы, в зависимости от блока,
А самое главное желание)
И так приступим.
В зависимости от того какую прошивку хотите отредактировать, зависит последовательность действий.
На моём примере будем использовать прошивку от Ledokol v 7.4 для Bosch 7.9.7
1) Скачиваем прошивку, и устанавливаем программу STP.
Подробную инструкцию по установке, можно найти в архиве с программой.
Все установили, запускаем «Хвостик»
Появляется хрюндель, как только загорится зелый глаз, можно запускать STP.
Открываем нашу прошивку (Можно просто перетащить файл мышкой в программу),
Видим окно, программа просит выбрать версию прошивки, для загрузки карт калибровки.
Для моего блока это будет B105DP09, то есть 1.6, 16 v.
Ждем пока загрузятся карты и перед нами открытая прошивка. Кому интересно, можно по изучать разные пункты данной программы.
Кто желает изменить обороты хх, перетягиваем точки графика в зависимости от температуры двигателя.
Если кто то хочет изменить момент отсечки:
Заводская отсечка вроде бы 5500, так как прошивка коммерческая, до меня её уже подняли до 7000
До меня стояло 99, я изменил на 96, так же не забываем изменить пункт ниже, температура выключения вентилятора.
Разница включения — выключения 2-3 градуса, в заводской прошивке разница где то 1.5 — 2 градуса.
Как все сделали сохраняем файл, обзываем кому как нравится.
2) Устанавливаем Enigma. (Если прошивать Chip Loader, не обязательно выполнять)
Находим файл нашей прошивки, открываем свойства
Видим что размер 226 кб, а нам надо 512 кб, то есть надо распаковать прошивку.
Запускаем Enigma, жмем распаковать прошивку, выбираем наш файл.
После распаковки файл автоматически заменится
Все готово для заливки прошивки в блок.
Как залить прошивку в блок на ресурсах интернета полно разжеваных статей, но раз начал будем жевать до конца.
3) Устанавливаем Chip Loader, и подключаем мозги к ПК.
В моём случае необходимо допаять 2 резистора номиналом от 4 до 8 кОМ,
Сделано.
Далее используем Ромокабель и подключаем к контактам ЭБУ:
51, 53, 43 контакт ЭБУ — (-12В)
13, контакт ЭБУ — Включение зажигания (+12В, выключатель)
12, 44, 63 контакт ЭБУ — (+12 В),
Подключаем к ПК, открываем Chip Loader, выбираем наш блок и жмакаем установить связь.
Если программа не видит адаптер, нужно изменить порт в настройках.
Но увы через Ромокабель мой капризный блок не в какую не хотел выходить на связь.
И пришлось использовать простой К-лайн
Схема подключения такая же, только необходимо добавить дополнительное питание.
Я использую блок от усилителя антенны) Дешево и сердито)
Жмем установить связь и вуаля)
Теперь касается тех, кто не хочет загружать авторскую прошивку, если всё устраивает и в этой, необходи считать Flash и сохранить её из буфера обмена.
Берем сохраненный файл и переходим к пункту 1 моего рассказа.
Ждем минут 5-10, зависит от компа.
Так же по изученным мной статьям, после прошивки советуют сделать сброс ЭБУ с инициализацией.
Я пользуюсь программой OpenDiag для этого.
В принципе все, донес информацию как смог)))