Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Как, и в чем отлаживать байт код

Сб мар 24, 2018 16:58:07

Прошу прощения, уже пятый день напрягаю поисковики, но всегда натыкаюсь на отладку из исходного кода, да еще на отладочной плате. Помогите уже начать отлаживать, а не забивать голову ненужным (пока) материалом.
Имею на руках устройство с Cortex-M3 (STM32F207) на борту. Прочитал из него прошивку, с помощью J-Flash (J-Link кабель) через SWD канал. Нужно пошагово походить по ветвлениям прошивки, прямо на этом процессоре, чтобы понять принцип работы. Но исходного кода прошивки нет. Нужно поставить несколько брейкпоинтов и просмотреть содержимое памяти и регистров в этих точках при остановке.
Какая среда отладки позволяет отлаживать чистый байт-код, без исходного кода?
Сильно не ругайте, я не спец по ARM, только начал их изучать,

Re: Как, и в чем отлаживать байт код

Сб мар 24, 2018 18:30:51

можно покопать в сторону QEMU emulator и IDA
через GDB:
http://cxemotexnika.org/2010/12/%D0%BF% ... %BB%D0%BB/
IDA:
http://www.hexblog.com/?p=111

Re: Как, и в чем отлаживать байт код

Сб мар 24, 2018 18:39:00

Вы хотите сказать, получить СИ-исходный код с помощью ИДА?
И не понятно, зачем мне подключать симулятор ARM, если есть готовое устройство и J-Link?
Или я все неправильно понял?

Re: Как, и в чем отлаживать байт код

Сб мар 24, 2018 18:59:18

почему Си - IDA интерактивный дизассемблер, который широко используется для реверс-инжиниринга.
Если "нужно пошагово походить по ветвлениям прошивки", то как это сделать без текста программы, а если текста нет - значит надо дизассаемблировать. Не видел дебагеров шагающих по hex кодам.
Еще Keil-у для ARM можно подсунуть "чужой" бинарный файл (или hex), но для прошивки, дизассемблер тоже покажет, но шагать не будет. Давно пробовал, может сейчас что поменялось

Re: Как, и в чем отлаживать байт код

Сб мар 24, 2018 19:11:11

Хорошо а есть возможность менять байты во флеш памяти, во время работы процессора? Зачем мне это, сейчас попробую объяснить.
Например
Я подключусь к устройству через программу J-Mem. В нужном месте (где хотел поставить брейкпоинт), изменю два байта, чтоб получился переход на самого себя (бесконечный цикл). И когда выполнение байт кода доберется до моего цикла, прочитаю память.

Re: Как, и в чем отлаживать байт код

Сб мар 24, 2018 19:25:03

микроконтроллер может писать во флэш - можно отдельным проектом написать процедурку записи и "попросить" линкер разместить в свободном месте по определенному адресу (где заканчивается основная прошивка), после компиляции вручную соединить две прошивки в hex редакторе. Дебагер не знаю - может ли писать флэш.
А почему прямо в прошивке сразу эти 2 байта не поменять редактором hex?

Re: Как, и в чем отлаживать байт код

Сб мар 24, 2018 19:28:21

Я хотел, чтобы иметь возможность переустанавливать эти два байта во время работы контроллера. Типа снимать ставить брейкпоинты.

Re: Как, и в чем отлаживать байт код

Сб мар 24, 2018 19:40:51

Пока не вижу пути, как всеж дизасемблировать ИДА supports:
ARMv7-M: Cortex-M3 (e.g. NXP LPC17xx/18xx/13xx, STM32 F1/F2/L1 series, TI Stellaris, Toshiba TX03/TMPM3xx etc.)
Самому скомпилировать, что получилось. Добиться аналогичной работы "своей" программы, потом уже добавлять свое.
Нашел
http://www.keil.com/support/docs/1936.htm
Только там µVision Version 2.12 и слово simulate. У меня 5.14 - не прыгает никак.

Re: Как, и в чем отлаживать байт код

Сб мар 24, 2018 19:46:59

Хорошо владеть терминологией.
Можно более понятнее написать, что вы только что сказали? Я практически ничего не понял, кроме отрывка про ИДА.

Re: Как, и в чем отлаживать байт код

Сб мар 24, 2018 20:04:01

1)прошивка в виде файла, я понимаю есть, судя "Прочитал из него прошивку"
2)берем IDApro (на злачных местах есть)
3)открываем прошивку в IDApro, отвечаем там на вопросы и дизассемблируем и сохраняем получившийся ассемблерный текст.
4)в любимом IDE (Keil там, IAR) создаем ассемблерный проект с одним ассемблерным файлом, копируем выше получившийся текст в этот файл, пробуем компилировать, сходу может не получится, правим, добиваемся чтоб скомпилировалось.
5)прошиваем нашей новой прошивкой устройство, убеждаемся что работает
6)теперь в нашем новом проекте можно легко добавлять свои хотелки и дебажить просто тоже

Re: Как, и в чем отлаживать байт код

Сб мар 24, 2018 20:12:06

Я пытаюсь запустить отладку, из-за того, что сомневаюсь в правильности дизассемблирования этой прошивки ИДА-ой. К тому-же ИДА очень слабо дружит с Thumb-2 (даже наверное не с Thumb-2, а именно с этим контроллером). Поэтому ее листингу доверять я не могу.

Re: Как, и в чем отлаживать байт код

Сб мар 24, 2018 21:14:17

Хотите отладку прошивки? Подключаете ST-Link к МК, запускаете программу STM32 ST-LINK Utility. Подключаетесь к МК и в меню Target открываете окно MCU Core. В нем кликаете по кнопке Step и наблюдаете за работой МК.

Re: Как, и в чем отлаживать байт код

Сб мар 24, 2018 21:24:19

ST-Link пока нет, но отлаживать хочется уже сейчас. А разве у J-Link нет такого функционала?
Установил ST-Link 4.1.0.0, но не вижу этот Step. Или он появится после коннекта с МК?

Re: Как, и в чем отлаживать байт код

Сб мар 24, 2018 21:31:09

Magadan69 писал(а):ST-Link пока нет
Нужно было давно купить. Такой как на скриншоте стоит около 100 рублей.

Magadan69 писал(а):но не вижу этот Step.
Мурик писал(а):в меню Target открываете окно MCU Core. В нем кликаете по кнопке Step

Re: Как, и в чем отлаживать байт код

Сб мар 24, 2018 21:36:02

в меню Target открываете окно MCU Core. В нем кликаете по кнопке Step

Ясно, значит нужен ST-Link. У меня эта вкладка не открывается, пишет: "No ST-LINK detected".

Re: Как, и в чем отлаживать байт код

Вс мар 25, 2018 08:42:31

открываете окно MCU Core. В нем кликаете по кнопке Step и наблюдаете за работой МК.

Посмотрел документ
http://www.st.com/content/ccc/resource/ ... 262073.pdf
3.7 MCU core functions
The Core panel dialog box shown in displays the ARM® Cortex®-M3 core register values.

Посмотреть можно вроде только регистры ядра и пошагать. Для хотелок ТСа может быть недостаточно:
Нужно поставить несколько брейкпоинтов и просмотреть содержимое памяти и регистров в этих точках при остановке.

Re: Как, и в чем отлаживать байт код

Вс мар 25, 2018 13:07:42

Пойду-ка я поизучаю "J-Link Commander" и "J-Link RTT Viewer". В коммандере точно можно брейкпоинты ставить, единственное работать придется в командной строке или по скриптам. Но мне для начала хватит.
Если я правильно все понял, то не придется никакую среду, типа Кеил, устанавливать.

Re: Как, и в чем отлаживать байт код

Пн мар 26, 2018 23:49:09

Хоспаде.. наплели семь бочек арестантов.
Magadan69 уверен у вас сейчас каша в голове. Давайте начнем с терминологии:

То что вы хотите - реверс-инжиниринг. Очень не простоая задача

Байт-код - слово применяемо к промежуточному представлению программы. к примеру Java программы находятся именно в этом состоянии (https://ru.wikipedia.org/wiki/Байт-код). Давайте о нем забудем. То что вы подразумевали будем называть Прошивкой/Фирмварью/хексом/бинарем (4)

1) Исходный код - надеюсь тут вопросов нету, С/С++, asm, или что-угодно
2) Объектные файлы - то что получили в результате компиляции(!) пример: *.o
3) Исполняемые файлы - то, что получили в результате линковки(!) пример: *.exe, *.dll, *.elf, *.so
4) Прошивка - бинарное представление программы, что можно залито непосредственно в камень (микроконтроллер) и прочитано из него. примеры: *.bin, *.hex

Собственно, у вас нету пунктов [1;3]. Есть только 4.
Если при сборке был флаг -g, то пунк 3 будет содержать в себе всю дебаг информацию (пути к файлам, символы и тд). его можно "полноценно" дебажить

То, что вы хотите сделать software developer'ы называют Debug. для этого есть Debug'еры (gdb например). Это очередная грамма которая контролирует исполнение вашей программы ( debug(myprogramm()) )
Как происходит процесс дебага на вашем десктопе? К примеру накидали вы hello world. скомпили. слинковали. запустили под дебагером. Дебагер получает от вас команды "шаг. стоп. run. и тд" он же может и модифицировать код/перменные!

Ситуация с микрокнтроллером чуть сложнее. Потмоу что мы делаем cross-компиляцию. То есть на x86 машине м собираем код для ARMv7-M. Соответсвенно в случае отладки у нас так же - cross-debug. Здесь трабла - отладчик то не запустить на x86, он же ARM... Но тут нас спасает gdb! Он ведь умеет в remote.
То есть у нас есть две сущности:
1) gdbserver - собственно ваш отладчик (j-link, st-link, etc.) и ваш камень с прошивкой
2) gdb client - то, что подключится к серверу и будет посылать команды

Тут есть варианты выбора, CMD, Keil, IAR и всё такое. Лично я эти виндовые проприретарные вещи ненавижу. Так что опишу вообще Unix'овый подход

Итак, что надо:
1) openocd - прекрасный gdbserver - который работает с любым отладчиком (j-link, st-link, etc.) http://gnutoolchains.com/arm-eabi/openocd/
2) arm-none-eabi-gdb - gdb client https://developer.arm.com/open-source/g ... /downloads

Как:
1) вам надо запустить gdbserver. Открываем консоль и скорее всего будет так
openocd -f interface/jlink.cfg -f target/stm32f1x.cfg - собственно в таргете - и есть ваш камень (семейство)
2) клиент. Опять же - консоль и
arm-none-eabi-gdb
здесь же
target remote :3333

и всё - можно апсчаться

Но есть одна загвоздочка.... Микроконтроллер вещь противная с флеш-памятью. и прошивка живет во флеше. Как все мы знаем, во флешку можно писать побайтно, стирать - только страницей. Значит если вы хотите поменять хотя бы 1 бит с 0->1 то придется теперь всю страницу.

Поэтмоу я б рекомендовал вам не заморачивать с пошаговой отладкой, а, как писали выше. Выкачать прошивку. Взять IDA и уже там модифицировать прошивку (ида это умеет) и дальше - заливать и смотреть что происходит. Благо у арма есть bkpt инструкция

Надеюсь вы сможете оценить сложность данной процедуры и напишете код с 0, а не будете пытаться реверсить не понимая что там внутри....

Re: Как, и в чем отлаживать байт код

Вт мар 27, 2018 00:16:33

Спасибо за ликбез !!! (действительно спасибо, так как сложно было уложить понятия в голове).
Но я все-таки должен понять алгоритм "...4) Прошивки...", которая "*.bin".
К тому-же мне не нужна вся прошивка, мне нужно понять только несколько функций. В частности надо разобраться какие команды и с какими параметрами принимает АРМ по блютуз (не все), чтобы самому управлять устройством.
Переписывать данные во флеш я не буду (я не буду использовать софтварные брейкпоинты), мне достаточно шести железных брейкпоинтов, которые можно устанавливать в контроллере, J-Mem - просмотровика памяти, и того что АРМ-контроллер выдает значения своих регистров при остановке (halt). Я в принципе уже разобрал две функции (ида не ошиблась, но зато я теперь точно это знаю). Одно не удобно, работа с командной строкой в "J-Link Commander". Надо будет посмотреть на "openocd" и "arm-none-eabi-gdb" если они позволяют дебажить "...4) Прошивка...", то будет великолепно. Хоть немного автоматизирую процесс. А то обидно получается когда прошел уже немало кода вручну, остановился на брейкпоинте , и например, вместо команды "regs" наберешь команду "go", случайно по запарке.

Re: Как, и в чем отлаживать байт код

Вт мар 27, 2018 08:13:32

В частности надо разобраться какие команды и с какими параметрами принимает АРМ по блютуз (не все), чтобы самому управлять устройством.

блютуз внешний модуль или внутри кристалла? Если внешний - можно к RX ноге через переходник USB-COM компьютерным терминалом подцепиться и смотреть. Если внутренний - пробовать сниферить через компьютерный блютуз тем же терминалом.
Ответить