Вы здесь

Дизассемблирование и компиляция прошивок ЭБУ Январь 5/7

Данный пост призван помочь настроить рабочую среду для выполнения операций по изменению прошивок ЭБУ. Задачу изменения некоторого участка кода в прошивке можно разделить на три типа:

  1. Изменение значений некоторых данных без изменения из количества, то есть без изменения размера прошивки, например, когда одни калибровки меняются на другие.
  2. Небольшие изменения кода, когда ненужные операции просто заменяются на пустые (nop) по количеству, необходимому для сохранения размера прошивки.
  3. Существенные изменения кода, когда без дизассемблирования и последующей сборки прошивки уже не обойтись.

Первые две задачи обычно легко решаются с помощью шестнадцатеричного редактора, в котором одни данные, по заранее известным адресам, заменяются на другие. В случае изменения кода следует помнить о сохранении смещений после редактирования, то есть размер первоначального кода должен соответствовать размеру измененного. Для достижения данного результата необходимо пустые места дополнять операциями nop, которые сами по себе ничего не выполняют, но место в прошивке занимают. Размеры команд можно посмотреть в датащитах на процессор.
Рассмотрим последний - самый сложный вариант изменения исходного текста прошивки. Процесс дизассемблирования описывать не буду, так как это отдельная большая тема, небольшие заметки можно посмотреть здесь i205dm53 reverse engineering. Введение. Будем отталкиваться от того, что дизассемблированный листинг прошивки у нас получен в IDA, теперь необходимо получить соответствующий asm файл. Для начала настроим необходимый нам диалект языка ассемблера, наиболее подходящий к нашему компилятору (о нем чуть позже). В IDA идем Options\General\Analysis в поле Target assembler выбираем 8051 Cross-Assembler by MetaLink Corporation Далее создаем asm файл используя следующий пункт меню: Здесь следует отметить, что все функции в IDA должны быть развернуты, то есть не должно быть следующих областей, так как при экспорте данные функции не попадут в листинг (для разворачивания достаточно встать на функции и нажать "+" на цифровой клавиатуре): Все, дизассемблированный листинг получили. Половина дела сделана. Далее выбираем любой текстовый редактор, в котором мы будем правит код - это может быть любой редактор, я использую SciTE. Для того чтобы полученный листинг без ошибок скомпилировался необходимо добавить самой первой строкой следующую директиву компилятора: $NOMOD51. Далее изменяем код и компилируем полученный листинг. В качестве компилятора я использую бесплатный ASEM-51. Для компиляции в командном интерпретаторе cmd, набираем команду: asemw.exe source.asm, где source.asm - листинг прошивки. На выходе получает файл source.hex, для получения бинарного файла прошивки необходимо воспользоваться утилитой hexbinw.exe из состава компилятора. Вызов данной утилиты выглядит следующим образом: hexbinw.exe source.asm.