- PVSM.RU - https://www.pvsm.ru -
В этой статье расскажем, как научиться отлаживать и полюбить маленькую черную плату Black Magic Probe V2.1. Но для начала немного о том, что это такое и зачем она нужна.
Плата Black Magic Probe Mini V2.1 (BMPM2) разработана 1BitSquared в сотрудничестве с Black Sphere Technologies, является адаптером JTAG и SWD, предназначена для программирования и отладки микроконтроллеров ARM Cortex-M и ARM Cortex-A. Можно добавить поддержку других процессоров. Описание процесса добавления можно найти по ссылке [1]. Стоит также отметить, что любой процессор с поддержкой ADIv5 (ARM Debug Interface v5) будет определяться платой.
На рисунках приведены процессоры семейств ARM Cortex-M и ARM 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, которые могут быть полезны при исследовании информационной безопасности устройств:
BMPM2 обладает двумя основными особенностями. Первая заключается в том, что на самом устройстве запускается gdbсервер, открывающий виртуальный порт, к которому можно напрямую подключиться через клиент gdb на своем хост-компьютере (рекомендуется набор инструментов gcc-arm-embedded [2]), поэтому не нужно настраивать конфигурации OpenOCD [3] или STLink [4]. Сравнение схем подключения отладочного интерфейса при помощи OpenOCD/STLink и BMPM2 можно увидеть ниже. Как видно, вариант с подключением через BMPM2 проще.
Второй является возможность скомпилировать прошивку под другие платы, при этом необходимость в BMPM2 отпадает. Совместимые платы представлены тут [5].
Для изучения возможностей работы были взяты четыре платы: 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 легко найти по ссылке [6].
После подключения 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 адаптер [7] по следующей схеме:
на интерфейсе SWD (если считать с крайнего сверху выхода):
Для демонстрации работоспособности процесса отладки была использована прошивка [8], содержащая несколько программных модулей. Один из них — игра 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)
К огромной печали, нам ни разу не удалось выиграть, поэтому захотелось что-нибудь в ней поломать. Для начала, мы посмотрели исходники [9]. В них была найдена переменная 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 для того, чтобы посмотреть, что находится по этому адресу.
Все верно. Если внимательно изучить данную таблицу и расположение фишек в начале игры, то можно заметить, что 001 означает красную фишку, а 002 — синюю. Можно попробовать изменить значение одной из ячеек. Для этого мы воспользовались командой:
set *(char *) 0x2002CAF4 = 1
Результат:
После этого мы решили попробовать значения всех ячеек приравнять единице, и тем самым выиграть игру с первого хода.
Результат выполнения скрипта:
Скрипт успешно отработал, нам удалось победить в игре, а это значит, что с помощью платы Black Magic Probe Mini V2.1 через gdb можно успешно отлаживать и "ломать" прошивки.
А теперь немного скучных примеров с моргающими лампочками.
STM32F103C8
Плату STM32F103C8 подсоединим к Black Magic Probe V2.1 через интерфейс JTAG.
Исходники для прошивки платы можно взять тут [10].
В исходном коде можно попробовать изменять скорость моргания лампочки, уменьшая или увеличивая интервалы времени, когда она горит и когда гаснет.
STM32vldiscovery
Плату STM32vldiscovery подсоединим к Black Magic Probe V2.1 через интерфейс SWD, а именно:
Исходники для прошивки платы можно взять тут [11].
Здесь все аналогично предыдущей плате, также меняем интервалы времени в исходниках и смотрим на лампочку.
Выводы
Плата Black Magic Probe Mini V2.1 — простая в использовании и имеет набор инструментов и библиотек с открытым исходным кодом, это является ее основными плюсами.
Минусом платы является отсутствие поддержки архитектуры процессоров arm64 и процессоров Texas Instruments.
http://1bitsy.org/overview/introduction/ [12]
https://1bitsquared.com/products/black-magic-probe [13]
https://github.com/esden/1bitsy-bmpm-exercises/blob/master/embedded_programming_with_black_magic_and_lights_on-workshop_guide.pdf [14]
https://github.com/blacksphere/blackmagic/wiki [15]
Авторы
Автор: Jokiv
Источник [18]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/informatsionnaya-bezopasnost/267049
Ссылки в тексте:
[1] ссылке: https://github.com/blacksphere/blackmagic/wiki/Adding-target-drivers
[2] gcc-arm-embedded: https://launchpad.net/gcc-arm-embedded
[3] OpenOCD: http://openocd.org/
[4] STLink: http://www.st.com/en/development-tools/st-link-v2.html
[5] тут: https://github.com/blacksphere/blackmagic/wiki/Debugger-Hardware
[6] ссылке: http://1bitsy.org/overview/quickstart/
[7] адаптер: https://1bitsquared.com/collections/embedded-hardware/products/jtag-swd-100mil-pitch-breakout
[8] прошивка: https://github.com/miehigh/STM32F429I-Discovery_FW_V1.0.1/tree/master/Projects/Demonstration
[9] исходники: https://github.com/miehigh/STM32F429I-Discovery_FW_V1.0.1/blob/master/Projects/Demonstration/Core/Demo/demo_game.c
[10] тут: https://github.com/jollheef/stm32f103c8t6_hello
[11] тут: https://gitlab.com/sakura.ix86/stmf100rbt6_blink
[12] http://1bitsy.org/overview/introduction/: http://1bitsy.org/overview/introduction/
[15] https://github.com/blacksphere/blackmagic/wiki: https://github.com/blacksphere/blackmagic/wiki
[16] Jokiv: https://habrahabr.ru/users/jokiv/
[17] veneramuholovka: https://habrahabr.ru/users/veneramuholovka/
[18] Источник: https://habrahabr.ru/post/339940/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.