A minute of Black Magic

Prev


В этой статье расскажем, как научиться отлаживать и полюбить маленькую черную плату Black Magic Probe V2.1. Но для начала немного о том, что это такое и зачем она нужна.

Плата Black Magic Probe Mini V2.1 (BMPM2) разработана 1BitSquared в сотрудничестве с Black Sphere Technologies, является адаптером JTAG и SWD, предназначена для программирования и отладки микроконтроллеров ARM Cortex-M и ARM Cortex-A. Можно добавить поддержку других процессоров. Описание процесса добавления можно найти по ссылке. Стоит также отметить, что любой процессор с поддержкой ADIv5 (ARM Debug Interface v5) будет определяться платой.


На рисунках приведены процессоры семейств ARM Cortex-M и ARM Cortex-A, поддерживаемые платой Black Magic Probe Mini V2.1.


Процессоры семейства Cortex-M, поддерживаемые платой Black Magic Probe Mini V2.1
Процессоры семейства Cortex-A, поддерживаемые платой Black Magic Probe Mini V2.1


В процессе тестирования Black Magic Probe было выявлено, что поддерживаемые процессоры не ограничиваются списком, предоставленным производителем. Официально не поддерживаемые процессоры с ARM Debug Interface v5 определяются, например, как «Cortex-M0» или «Cortex-A7». При этом, не гарантируется полная функциональность, но все же произвести минимальные действия по отладке получится.


Что можно делать с использованием платы Black Magic Probe:


  • прерывать процесс исполнения программы;
  • наблюдать за изменениями регистров и переменных;
  • устанавливать точки останова (можно установить точку останова в коде, которая заставит программу остановиться, как только эта точка будет достигнута);
  • просматривать стек вызовов (список функций и их параметров, которые привели нас к текущей точке и состоянию программы);
  • дизассемблирование (возможность просмотреть машинный код и узнать, что именно делает программа);
  • дамп памяти (сохранение ОЗУ и/или флэш-контента в файл).


Функции Black Magic Probe, которые могут быть полезны при исследовании информационной безопасности устройств:


  • разработка встроенного программного обеспечения и устройств для проведения атак;
  • реверс-инжиниринг IoT;
  • поиск уязвимостей;
  • динамический анализ с помощью IDA и других инструментов, совместимых с серверами gdb.


BMPM2 обладает двумя основными особенностями. Первая заключается в том, что на самом устройстве запускается gdbсервер, открывающий виртуальный порт, к которому можно напрямую подключиться через клиент gdb на своем хост-компьютере (рекомендуется набор инструментов gcc-arm-embedded), поэтому не нужно настраивать конфигурации OpenOCD или STLink. Сравнение схем подключения отладочного интерфейса при помощи OpenOCD/STLink и BMPM2 можно увидеть ниже. Как видно, вариант с подключением через BMPM2 проще.


Сравнение алгоритмов работы при отладке без платы Black Magic Probe Mini V2.1 и с ней


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


Для изучения возможностей работы были взяты четыре платы: TM32F103C8, STM32vldiscovery, STM32F429I-disc1 и предлагаемая разработчиками 1Bitsy V1.0.
Более подробно будет рассмотрена работа с 1Bitsy и STM32F429I-disc1. Первая была выбрана по рекомендации самих разработчиков, а у второй есть сенсорный экран, что делает процесс исследования более наглядным.


Познаем мир отладки с Black Magic Probe


Изучение работы Black Magic Probe V2.1 удобно начать с отладки 1Bitsy. Эта плата была создана специально для работы с BMPM2, поэтому не должно возникнуть никаких затруднений.
Соединим Black Magic Probe и 1Bitsy между собой кабелем JTAG и подключим их к компьютеру.
Ниже будет описана работа в среде GNU/Linux, руководство по работе в ОС Windows и MacOS легко найти по ссылке.


После подключения BMPM2 к ПК и к разъему JTAG, на 1Bitsy выполним три команды в gdb для начала отладки. Важно, чтобы пользователь был добавлен в группу dialout командой «sudo adduser $USER dialout», иначе ничего не заработает. Первой командой «target extended-remote /dev/ttyACMx» подключаемся к BMPM2, где x — номер серийного порта, далее сканируем все подключенные к Black Magic Probe устройства с помощью команды «monitor jtag_scan». Если все хорошо, то будет выведен список найденных устройств и командой «attach 1» мы подключимся к 1Bitsy.


(gdb) target extended-remote /dev/ttyACM0
Remote debugging using /dev/ttyACM0
(gdb) monitor jtag_scan
Target voltage: 3.3V
Available Targets:
No. Att Driver
 1      STM32F4xx
(gdb) attach 1
Attaching to Remote target
warning: No executable has been specified and target does not support
determining executable automatically.  Try using the "file" command.
0x0800026c in ?? ()
(gdb)


Все, теперь мы можем выполнить отладку прошивки, загруженной в 1Bitsy.
С 1Bitsy, и правда, не возникло никаких проблем с подключением, все просто и достаточно удобно. Сохранится ли простота и удобство при работе с другой платой?
В наличии была плата на основе микроконтроллера STM32 — STM32F429I-disc1, ей и воспользуемся, заодно зальем на нее какую-нибудь интересную прошивку. Главным отличием в работе с этой платой от работы с 1Bitsy является соединение по интерфейсу SWD, а не JTAG.


Перед началом работы соединяем платы через JTAG/SWD адаптер по следующей схеме:
на интерфейсе SWD (если считать с крайнего сверху выхода):


  1. SWCLK
  2. GND
  3. SWDIO
  4. 3V — tVref.


STM32F429I-disc1 и Black Magic Probe


Для демонстрации работоспособности процесса отладки была использована прошивка, содержащая несколько программных модулей. Один из них — игра Reversi, её будет отлаживать интереснее всего.
Заливаем прошивку на плату и в gdb вводим почти те же команды, что и для 1Bitsy, с той лишь разницей, что плата подключена по SWD, поэтому потребуется использовать команду swdp_scan.


(gdb) target extended-remote /dev/ttyACM0
Remote debugging using /dev/ttyACM0
(gdb) monitor swdp_scan
Target voltage: 3.3V
Available Targets:
No. Att Driver
 1      STM32F4xx
(gdb) attach 1
Attaching to Remote target
warning: No executable has been specified and target does not support
determining executable automatically.  Try using the "file" command.
0x0800026c in ?? ()
(gdb)


К огромной печали, нам ни разу не удалось выиграть, поэтому захотелось что-нибудь в ней поломать. Для начала, мы посмотрели исходники. В них была найдена переменная Board, предположительно, обозначающая адрес первой ячейки доски. Рядом есть строки «Reversi — Player 1» и «Reversi — Player 2».


static void _SetPlayer(int Player) {
  int Score, ValidMoves, PossibleMoves;
  char ac[256];

  _Board.ActPlayer = Player;
  if (Player == 1) {
    FRAMEWIN_SetText(_hFrame, "Reversi - Player 1");
  } else {
    FRAMEWIN_SetText(_hFrame, "Reversi - Player 2");
  }
  FRAMEWIN_SetBarColor(_hFrame, 1, (Player == 1) ? GUI_RED : GUI_BLUE);
  PossibleMoves = _CalcValidMoves(&_Board);
  GUI_Exec();

if (!PossibleMoves) {
    GUI_Exec();
    _Board.ActPlayer = 3 - Player;


По этим строкам мы осуществили поиск в дизассемблере IDA.
Выяснили, что из псевдокода можно узнать адрес, который является начальным адресом ячеек доски.


  v1 = a1;
  v2002CB74 = a1;
  if ( a1 == 1 )
  {
    sub_D8B3C(v2002CB80, "Reversi - Player 1");
    v2 = 255;
  }
  else
  {
    sub_D8B3C(v2002CB80, "Reversi - Player 2");
    v2 = 16711680;
  }
  sub_E06A8(v2002CB80, 1, v2);
  v3 = sub_DEDF8(0x2002CAF4);
  result = ((int (*)(void))sub_C91B4)();
  if ( v3 )
    return result;
  sub_C91B4(result);
  v2002CB74 = 3 - v1;
  v5 = sub_DEDF8(0x2002CAF4);


Далее, решили воспользоваться gdb для того, чтобы посмотреть, что находится по этому адресу.


Вывод GDB
Начало игры


Все верно. Если внимательно изучить данную таблицу и расположение фишек в начале игры, то можно заметить, что 001 означает красную фишку, а 002 — синюю. Можно попробовать изменить значение одной из ячеек. Для этого мы воспользовались командой:


set *(char *) 0x2002CAF4 = 1


Результат:


Вывод GDB
Состояние ячеек после ввода команды


После этого мы решили попробовать значения всех ячеек приравнять единице, и тем самым выиграть игру с первого хода.
Результат выполнения скрипта:


Результат выполнения скрипта
Состояние ячеек после выполнения скрипта


Скрипт успешно отработал, нам удалось победить в игре, а это значит, что с помощью платы Black Magic Probe Mini V2.1 через gdb можно успешно отлаживать и «ломать» прошивки.
А теперь немного скучных примеров с моргающими лампочками.


STM32F103C8


Плату STM32F103C8 подсоединим к Black Magic Probe V2.1 через интерфейс JTAG.


Интерфейс JTAG


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


STM32vldiscovery


Плату STM32vldiscovery подсоединим к Black Magic Probe V2.1 через интерфейс SWD, а именно:


  1. 3V3 — tVref
  2. PA13 — SWDIO
  3. PA14 — SWCLK
  4. GND — GND


Исходники для прошивки платы можно взять тут.
Здесь все аналогично предыдущей плате, также меняем интервалы времени в исходниках и смотрим на лампочку.


Выводы


Плата Black Magic Probe Mini V2.1 — простая в использовании и имеет набор инструментов и библиотек с открытым исходным кодом, это является ее основными плюсами.
Минусом платы является отсутствие поддержки архитектуры процессоров arm64 и процессоров Texas Instruments.


http://1bitsy.org/overview/introduction/
https://1bitsquared.com/products/black-magic-probe
https://github.com/esden/1bitsy-bmpm-exercises/blob/master/embedded_programming_with_black_magic_and_lights_on-workshop_guide.pdf
https://github.com/blacksphere/blackmagic/wiki


Авторы


  • Евгений Рассказов Jokiv
  • Валерия Губарева veneramuholovka

© Habrahabr.ru