Как, и в чем отлаживать байт код
Как, и в чем отлаживать байт код
Прошу прощения, уже пятый день напрягаю поисковики, но всегда натыкаюсь на отладку из исходного кода, да еще на отладочной плате. Помогите уже начать отлаживать, а не забивать голову ненужным (пока) материалом.
Имею на руках устройство с Cortex-M3 (STM32F207) на борту. Прочитал из него прошивку, с помощью J-Flash (J-Link кабель) через SWD канал. Нужно пошагово походить по ветвлениям прошивки, прямо на этом процессоре, чтобы понять принцип работы. Но исходного кода прошивки нет. Нужно поставить несколько брейкпоинтов и просмотреть содержимое памяти и регистров в этих точках при остановке.
Какая среда отладки позволяет отлаживать чистый байт-код, без исходного кода?
Сильно не ругайте, я не спец по ARM, только начал их изучать,
Имею на руках устройство с Cortex-M3 (STM32F207) на борту. Прочитал из него прошивку, с помощью J-Flash (J-Link кабель) через SWD канал. Нужно пошагово походить по ветвлениям прошивки, прямо на этом процессоре, чтобы понять принцип работы. Но исходного кода прошивки нет. Нужно поставить несколько брейкпоинтов и просмотреть содержимое памяти и регистров в этих точках при остановке.
Какая среда отладки позволяет отлаживать чистый байт-код, без исходного кода?
Сильно не ругайте, я не спец по ARM, только начал их изучать,
- Реклама
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как, и в чем отлаживать байт код
можно покопать в сторону QEMU emulator и IDA
через GDB:
http://cxemotexnika.org/2010/12/%D0%BF% ... %BB%D0%BB/
IDA:
http://www.hexblog.com/?p=111
через GDB:
http://cxemotexnika.org/2010/12/%D0%BF% ... %BB%D0%BB/
IDA:
http://www.hexblog.com/?p=111
Re: Как, и в чем отлаживать байт код
Вы хотите сказать, получить СИ-исходный код с помощью ИДА?
И не понятно, зачем мне подключать симулятор ARM, если есть готовое устройство и J-Link?
Или я все неправильно понял?
И не понятно, зачем мне подключать симулятор ARM, если есть готовое устройство и J-Link?
Или я все неправильно понял?
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как, и в чем отлаживать байт код
почему Си - IDA интерактивный дизассемблер, который широко используется для реверс-инжиниринга.
Если "нужно пошагово походить по ветвлениям прошивки", то как это сделать без текста программы, а если текста нет - значит надо дизассаемблировать. Не видел дебагеров шагающих по hex кодам.
Еще Keil-у для ARM можно подсунуть "чужой" бинарный файл (или hex), но для прошивки, дизассемблер тоже покажет, но шагать не будет. Давно пробовал, может сейчас что поменялось
Если "нужно пошагово походить по ветвлениям прошивки", то как это сделать без текста программы, а если текста нет - значит надо дизассаемблировать. Не видел дебагеров шагающих по hex кодам.
Еще Keil-у для ARM можно подсунуть "чужой" бинарный файл (или hex), но для прошивки, дизассемблер тоже покажет, но шагать не будет. Давно пробовал, может сейчас что поменялось
Re: Как, и в чем отлаживать байт код
Хорошо а есть возможность менять байты во флеш памяти, во время работы процессора? Зачем мне это, сейчас попробую объяснить.
Например
Я подключусь к устройству через программу J-Mem. В нужном месте (где хотел поставить брейкпоинт), изменю два байта, чтоб получился переход на самого себя (бесконечный цикл). И когда выполнение байт кода доберется до моего цикла, прочитаю память.
Например
Я подключусь к устройству через программу J-Mem. В нужном месте (где хотел поставить брейкпоинт), изменю два байта, чтоб получился переход на самого себя (бесконечный цикл). И когда выполнение байт кода доберется до моего цикла, прочитаю память.
- Реклама
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как, и в чем отлаживать байт код
микроконтроллер может писать во флэш - можно отдельным проектом написать процедурку записи и "попросить" линкер разместить в свободном месте по определенному адресу (где заканчивается основная прошивка), после компиляции вручную соединить две прошивки в hex редакторе. Дебагер не знаю - может ли писать флэш.
А почему прямо в прошивке сразу эти 2 байта не поменять редактором hex?
А почему прямо в прошивке сразу эти 2 байта не поменять редактором hex?
Re: Как, и в чем отлаживать байт код
Я хотел, чтобы иметь возможность переустанавливать эти два байта во время работы контроллера. Типа снимать ставить брейкпоинты.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как, и в чем отлаживать байт код
Пока не вижу пути, как всеж дизасемблировать ИДА 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 - не прыгает никак.
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: Как, и в чем отлаживать байт код
Хорошо владеть терминологией.
Можно более понятнее написать, что вы только что сказали? Я практически ничего не понял, кроме отрывка про ИДА.
Можно более понятнее написать, что вы только что сказали? Я практически ничего не понял, кроме отрывка про ИДА.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как, и в чем отлаживать байт код
1)прошивка в виде файла, я понимаю есть, судя "Прочитал из него прошивку"
2)берем IDApro (на злачных местах есть)
3)открываем прошивку в IDApro, отвечаем там на вопросы и дизассемблируем и сохраняем получившийся ассемблерный текст.
4)в любимом IDE (Keil там, IAR) создаем ассемблерный проект с одним ассемблерным файлом, копируем выше получившийся текст в этот файл, пробуем компилировать, сходу может не получится, правим, добиваемся чтоб скомпилировалось.
5)прошиваем нашей новой прошивкой устройство, убеждаемся что работает
6)теперь в нашем новом проекте можно легко добавлять свои хотелки и дебажить просто тоже
2)берем IDApro (на злачных местах есть)
3)открываем прошивку в IDApro, отвечаем там на вопросы и дизассемблируем и сохраняем получившийся ассемблерный текст.
4)в любимом IDE (Keil там, IAR) создаем ассемблерный проект с одним ассемблерным файлом, копируем выше получившийся текст в этот файл, пробуем компилировать, сходу может не получится, правим, добиваемся чтоб скомпилировалось.
5)прошиваем нашей новой прошивкой устройство, убеждаемся что работает
6)теперь в нашем новом проекте можно легко добавлять свои хотелки и дебажить просто тоже
Re: Как, и в чем отлаживать байт код
Я пытаюсь запустить отладку, из-за того, что сомневаюсь в правильности дизассемблирования этой прошивки ИДА-ой. К тому-же ИДА очень слабо дружит с Thumb-2 (даже наверное не с Thumb-2, а именно с этим контроллером). Поэтому ее листингу доверять я не могу.
Re: Как, и в чем отлаживать байт код
Хотите отладку прошивки? Подключаете ST-Link к МК, запускаете программу STM32 ST-LINK Utility. Подключаетесь к МК и в меню Target открываете окно MCU Core. В нем кликаете по кнопке Step и наблюдаете за работой МК.
Re: Как, и в чем отлаживать байт код
ST-Link пока нет, но отлаживать хочется уже сейчас. А разве у J-Link нет такого функционала?
Установил ST-Link 4.1.0.0, но не вижу этот Step. Или он появится после коннекта с МК?
Установил ST-Link 4.1.0.0, но не вижу этот Step. Или он появится после коннекта с МК?
Re: Как, и в чем отлаживать байт код
Нужно было давно купить. Такой как на скриншоте стоит около 100 рублей.Magadan69 писал(а):ST-Link пока нет
Спойлер
Magadan69 писал(а):но не вижу этот Step.
Мурик писал(а):в меню Target открываете окно MCU Core. В нем кликаете по кнопке Step
Re: Как, и в чем отлаживать байт код
[uquote="Мурик",url="/forum/viewtopic.php?p=3338240#p3338240"]в меню Target открываете окно MCU Core. В нем кликаете по кнопке Step[/uquote]
Ясно, значит нужен ST-Link. У меня эта вкладка не открывается, пишет: "No ST-LINK detected".
Ясно, значит нужен ST-Link. У меня эта вкладка не открывается, пишет: "No ST-LINK detected".
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как, и в чем отлаживать байт код
[uquote="Мурик",url="/forum/viewtopic.php?p=3338227#p3338227"]открываете окно MCU Core. В нем кликаете по кнопке Step и наблюдаете за работой МК.[/uquote]
Посмотрел документ
http://www.st.com/content/ccc/resource/ ... 262073.pdf
Посмотрел документ
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: Как, и в чем отлаживать байт код
Пойду-ка я поизучаю "J-Link Commander" и "J-Link RTT Viewer". В коммандере точно можно брейкпоинты ставить, единственное работать придется в командной строке или по скриптам. Но мне для начала хватит.
Если я правильно все понял, то не придется никакую среду, типа Кеил, устанавливать.
Если я правильно все понял, то не придется никакую среду, типа Кеил, устанавливать.
- Shapa
- Встал на лапы
- Сообщения: 127
- Зарегистрирован: Пт июн 20, 2008 09:38:05
- Откуда: Харьков
- Контактная информация:
Re: Как, и в чем отлаживать байт код
Хоспаде.. наплели семь бочек арестантов.
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, а не будете пытаться реверсить не понимая что там внутри....
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: Как, и в чем отлаживать байт код
Спасибо за ликбез !!! (действительно спасибо, так как сложно было уложить понятия в голове).
Но я все-таки должен понять алгоритм "...4) Прошивки...", которая "*.bin".
К тому-же мне не нужна вся прошивка, мне нужно понять только несколько функций. В частности надо разобраться какие команды и с какими параметрами принимает АРМ по блютуз (не все), чтобы самому управлять устройством.
Переписывать данные во флеш я не буду (я не буду использовать софтварные брейкпоинты), мне достаточно шести железных брейкпоинтов, которые можно устанавливать в контроллере, J-Mem - просмотровика памяти, и того что АРМ-контроллер выдает значения своих регистров при остановке (halt). Я в принципе уже разобрал две функции (ида не ошиблась, но зато я теперь точно это знаю). Одно не удобно, работа с командной строкой в "J-Link Commander". Надо будет посмотреть на "openocd" и "arm-none-eabi-gdb" если они позволяют дебажить "...4) Прошивка...", то будет великолепно. Хоть немного автоматизирую процесс. А то обидно получается когда прошел уже немало кода вручну, остановился на брейкпоинте , и например, вместо команды "regs" наберешь команду "go", случайно по запарке.
Но я все-таки должен понять алгоритм "...4) Прошивки...", которая "*.bin".
К тому-же мне не нужна вся прошивка, мне нужно понять только несколько функций. В частности надо разобраться какие команды и с какими параметрами принимает АРМ по блютуз (не все), чтобы самому управлять устройством.
Переписывать данные во флеш я не буду (я не буду использовать софтварные брейкпоинты), мне достаточно шести железных брейкпоинтов, которые можно устанавливать в контроллере, J-Mem - просмотровика памяти, и того что АРМ-контроллер выдает значения своих регистров при остановке (halt). Я в принципе уже разобрал две функции (ида не ошиблась, но зато я теперь точно это знаю). Одно не удобно, работа с командной строкой в "J-Link Commander". Надо будет посмотреть на "openocd" и "arm-none-eabi-gdb" если они позволяют дебажить "...4) Прошивка...", то будет великолепно. Хоть немного автоматизирую процесс. А то обидно получается когда прошел уже немало кода вручну, остановился на брейкпоинте , и например, вместо команды "regs" наберешь команду "go", случайно по запарке.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как, и в чем отлаживать байт код
[uquote="Magadan69",url="/forum/viewtopic.php?p=3339770#p3339770"]В частности надо разобраться какие команды и с какими параметрами принимает АРМ по блютуз (не все), чтобы самому управлять устройством.[/uquote]
блютуз внешний модуль или внутри кристалла? Если внешний - можно к RX ноге через переходник USB-COM компьютерным терминалом подцепиться и смотреть. Если внутренний - пробовать сниферить через компьютерный блютуз тем же терминалом.
блютуз внешний модуль или внутри кристалла? Если внешний - можно к RX ноге через переходник USB-COM компьютерным терминалом подцепиться и смотреть. Если внутренний - пробовать сниферить через компьютерный блютуз тем же терминалом.


