ДВИДНАЯ ДВИЖЕНИЯ АРМА ??

Rogerclark
Солнце 12 февраля 2017 г. 22:35
Привет, ребята

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

Насколько я могу сказать, Objdump не может разобрать двоичные файлы, поэтому, по -видимому, единственный способ загружать бинар на процессор, используя GDB, а затем использует GDB для разборки.

Но должен быть лучший / более простой способ, который не требует подключения оборудования и т. Д., И просто выплюнуть сборку бинарного ?

Редактировать.

Похоже, что Objdump может сделать это, используя бинарную опцию -B, но мне каким -то образом нужно сказать, чтобы рассказать ему архитектуру, так как в настоящее время, когда я пытаюсь, я получаю сообщение о том, что оно не может разобрать как «архитектура неизвестна»

Беннебой
Солнце 12 февраля 2017 г. 22:40
Единственный, о чем я знаю, это Ida Pro, но это не бесплатно...

Rogerclark
Солнце 12 февраля 2017 г. 22:42
Bennehboy ​​написал:Единственный, о чем я знаю, это Ida Pro, но это не бесплатно...

Беннебой
Солнце 12 февраля 2017 г. 22:48
Ida Pro - удивительный инструмент tbh.

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

Я смотрел на это для разборки кода ECU от моего автомобиля - он использует микроконтроллер CPU32 MC68836.

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

Rogerclark
Солнце 12 февраля 2017 г. 22:54
Спасибо

Я скачаю версию Eval

КСТАТИ

Я получил немного дальше, используя objdump

Похоже, если я использую

objdump -b двоичный -m arm -d тест.бин > тест.Асм

Я получаю некоторый результат, но его разборка с начала бинарного файла, который является векторным таблицей, поэтому к тому времени, когда он достиг реального начала кода, все испортилось

Я думаю, что указатель стека хранится в первых 4 байтах, а следующие 4 байта - это вектор сброса, который, как я предполагаю, является адресом начала кода

Но, как ни странно, в этом случае адрес не находится на ровной границе байта, вектор сброса, по -видимому, находится в Add 0x8002765

Но, возможно, я прочитаю данные векторной таблицы

Редактировать.

Я не могу правильно читать векторные сбросы векторных чисел

Начало бинарного

00 04 00 20

Что я предполагаю, означает поместить указатель стека на 0x200400

Но следующие 4 байта

67 37 00 80

Что, я думал, означал, что сброс вектор был на 0x8003767, но это не 2 байтовая граница и разборка с этого адреса просто дает гиббер :-(

Sheepdoll
Солнце 12 февраля 2017 11:17
Я использую https: // www.Onlinedisassembler.com/static/home/ Чтобы проверить вывод моего 68 -километрового дизассемблера, написанного в PostScript. Это также полезно для проверки небольших фрагментов машинного кода.

Hex Rays Ida Pro, вероятно, самый полный. Я использовал Intel 386 & Семейная демонстрационная версия. Ядро ARM может быть платной посудой.

Диссертация Cristina Cifuentes по декомпиляции, в то время как более 25 лет является довольно хорошим объяснением в отношении сложности в повторном генерировании читаемого кода человека. Нужно несколько проходов и иметь возможность воссоздать таблицы символов и карты ссылок. С оптимизацией регистра и подкладками кода становится все больше работы по обращению кода, чем написать эквивалентный код.

Написание разборщика не так уж сложно, большинство из них обусловлено таблицей. Итак, есть запись таблицы для каждой группы инструкций. Хотя есть миллионы возможных инструкций, большинство из них основаны на словах логического флага. На самом деле есть только около 7 инструкций машины. Все остальное - это вариант. Где все становится сложным, обращается к режимам и местам памяти. В итоге один в значительной степени заводит писать эмулятор машины для отслеживания регистрации.

Большая часть работы - статистический анализ и сопоставление библиотечных шаблонов. Это приводит к большому взаимодействию с пользователем. Почему я использую язык, как PostScript, для анализа кода 68K, поскольку он может напрямую генерировать графики вызовов.

Обратная инженерия также является незаконной под DMCA США. Много программного обеспечения специально запрещает реверс -инженерию. С другой стороны, есть необходимость, когда кто -то хочет учиться у Asfandon Ware или иметь дело с DPA (ассоциация мертвых программистов), чтобы поддерживать старый код и оборудование. Это серая область. Особенно при борьбе с хакерскими атаками и идентификацией вредоносных программ.

Старый код, особенно Mac OS от 6 до 9 заброшенных и мертвых посуды, также имеет антитехнологические инструкции и самостоятельный код. С другой стороны, некоторые известные программы с конца 1980 -х и начала 1990 -х годов были выпущены с таблицами отладки (данные ASCII в конце каждой функции).

Rogerclark
Солнце 12 февраля 2017 г. 11:28
Я только что попробовал демо -мощность IDA Pro, но это только поддерживает x86

Этот онлайн -диссоциатор выглядит хорошо, но проблема в векторе начала / сброса

Любые идеи, как я нахожу фактическое начало кода, как данные в начале двоичного файла, которые, как мне показалось

Беннебой
Солнце 12 февраля 2017 г. 11:33
Похоже, вы правильно читаете векторную таблицу из того, что я вижу из таблицы данных...

Rogerclark
Солнце 12 февраля 2017 г. 11:49
Bennehboy ​​написал:Похоже, вы правильно читаете векторную таблицу из того, что я вижу из таблицы данных...

Деван
Пн 13 февраля 2017 г. 12:54
От Раздел 2.3.4: Векторная таблица содержит значение сброса указателя стека и адреса начала, также называемые векторами исключений, для всех обработчиков исключений. Рисунок 2.2 показывает порядок векторов исключений в векторной таблице. Наименьшая значительная бита каждого вектора должен быть 1, указывая на то, что обработчик исключений-код большого пальца, см. Состояние большого пальца. Таким образом, для целей захвата фактического начального адреса вы можете просто игнорировать LSB, который делает его странным.

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

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

Бункер (Для MacOS и Linux) имеет приличный графический интерфейс и свободное время, ограниченное временем, которое ограничивает вас до 30 минут за раз. Это сработало довольно хорошо, когда я смотрел на дампы загрузчика Stlink.

Rogerclark
Пн 13 февраля 2017 г. 2:01
@Davan

Поэтому, если начальный адрес в векторной таблице равен 0x80007729

Означает ли это, что это действительно 0x80007728 ?

Редактировать.

Что делает настройка виртуальной машины в ретаргиозного декомпиляторе ?

Деван
Пн 13 февраля 2017 г. 3:36 утра
Rogerclark написал:Поэтому, если начальный адрес в векторной таблице равен 0x80007729

Означает ли это, что это действительно 0x80007728 ?

Рик Кимбалл
Пн 13 февраля 2017 г., 4:08
Rogerclark написал: ... objdump -b двоичный -m arm -d тест.бин > тест.Асм

Рик Кимбалл
Пн 13 февраля 2017 г., 4:14
Декодировать векторную таблицу:
$ od -t x4 -v sketch_feb09a.Ино.бин | Голова -15
0000000 20005000 08000165 080003E1 080003E5
0000020 080003E9 080003ed 080003f1 08000441
0000040 08000441 08000441 08000441 08000441
0000060 08000441 08000441 08000441 080007F9
0000100 08000441 08000441 08000441 08000441
0000120 08000441 08000441 08000441 08000441
0000140 08000441 08000441 08000441 08000441
0000160 08000441 08000441 08000441 08000441
0000200 08000441 08000441 08000495 08000441
0000220 08000441 08000441 08000441 08000441
0000240 08000881 080008A5 080008C9 08000901
0000260 08000955 080009C5 08000A35 08000441
0000300 08000441 08000441 08000441 08000441
0000320 08000441 08000AFD 08000B4D 08000B9D
0000340 08000441 08000441 08000441 4C05B510
Все векторные адреса странные, потому что именно так процессор ARM знает, что это инструкция большого пальца. Итак, 0x08000165 действительно @ 0x08000164
(нм.. Я вижу, что ранние сообщения ответили на этот вопрос)

Rogerclark
Пн 13 февраля 2017 г., 7:24 утра
Спасибо, Рик

Я думаю, что я немного ближе к читаемой разборке, используя ваши настройки, но что -то все еще немного странно, потому что я получаю неопределенные инструкции

8000484: FFF9 FFFF; <НЕОПРЕДЕЛЕННЫЙ> Инструкция: 0xfff9ffff

что, вероятно, означает, что любой код после этой точки определенно облажается

Смотрите прикрепленное мигание.бин


Пса. Я думаю, что что -то не так с дампом векторной таблицы, так как первые 4 прощания - это нули, где они должны быть адресом стека
Так что, похоже, 4 байта нулевого.


Спасибо

Роджер

Пса. Я также попробовал онлайн -разборщик, с которым связывал @devan, и его незначительно хуже, чем objdump, насколько я вижу

https: // retdec.com/декомпиляция/

Поскольку он не кажется таким умным, как objdump, показывая относительные смещения и т. Д., И у них есть другие проблемы

Беннебой
Пн 13 февраля 2017 г. 8:03
Роджер, я проведу бинар через IDA Pro этим вечером (когда не в офисе) и посмотрю, на что это похоже.

Эдогальдо
Пн 13 февраля 2017 г. 8:45 утра
Привет, Роджер, вы пробовали использовать опцию-Disassembler-Options = Force-Thrum in Arm-none-eabi-objdump?

Лучший, e.

Rogerclark
Пн 13 февраля 2017 г. 8:46 утра
Bennehboy ​​написал:Роджер, я проведу бинар через IDA Pro этим вечером (когда не в офисе) и посмотрю, на что это похоже.

Rogerclark
Пн 13 февраля 2017 г. 8:55 утра
Эдогальдо написал:Привет, Роджер, вы пробовали использовать опцию-Disassembler-Options = Force-Thrum in Arm-none-eabi-objdump?

Лучший, e.

Беннебой
Пн 13 февраля 2017 г. 9:10
Эта страница может быть полезна (для других, если не сами, Роджер)... http: // pygmy.уто.org/riscy/cortex/led-stm32.HTML

Rogerclark
Пн 13 февраля 2017 г. 9:15 утра
Спасибо

Sheepdoll
Пн 13 февраля 2017 г., 18:34
Вот ссылка на страницу чьей -то собранных ресурсов, которые я добавил в закладки, чтобы узнать больше о программировании голого металла и ASM ARM.

http: // asm.тип.Нг/

Эта подзаглавленная ссылка - хорошее место для начала
http: // www.Коранак.com/tonc/text/asm.htm

Этот тоже выглядит многообещающе.
https: // Сообщество.рука.com/процессоры/b/ ... R-Cortex-M

РЕДАКТИРОВАТЬ: Я нашел блог и git, которые я читал в прошлом месяце, я подумал. Я думал, что ссылка на код, опубликованная @bennehboy, выглядела знакома.
Его блог есть https: // ioprog.com/2015/10/05/Minimal-B ... ассемблер/
И GIT https: // github.com/fduignan?TAB = Репозитории

Беннебой
Пн 13 февраля 2017 г., 19:04
Не повезло с беглым взглядом на IDA Pro, подозревает, что это больше связано с моим отсутствием знаний, чем с инструментами, хотя.

Беннебой
Пн 13 февраля 2017 г., 19:15
Вот часть загрузчика Maple Mini V2...

Думайте, простота бинарного мигания - это то, что меня смутило : D

const int io_led[18] = {PC6, PG6, PG8, PG5, PG7, PD13, PD15, PD12, PD14, PG4, PG3, PC7, PG2, PB12, PD11, PD10, PB14, PB13};

Рик Кимбалл
Пн 13 февраля 2017 г., 19:42
Rogerclark написал:Спасибо, Рик
Я думаю, что я немного ближе к читаемой разборке, используя ваши настройки, но что -то все еще немного странно, потому что я получаю неопределенные инструкции
8000484: FFF9 FFFF; <НЕОПРЕДЕЛЕННЫЙ> Инструкция: 0xfff9ffff
что, вероятно, означает, что любой код после этой точки определенно облажается

Рик Кимбалл
Пн 13 февраля 2017 г., 19:53
Rogerclark написал:Пса. Я думаю, что что -то не так с дампом векторной таблицы, так как первые 4 прощания - это нули, где они должны быть адресом стека
Так что, похоже, 4 байта нулевого.

Rogerclark
Пн 13 февраля 2017 г., 20:42
Спасибо, ребята..

Рик.
Хорошо о векторной таблице. Я взглянул только на первые два 32 -битных значения и не смотрел на последующие ряды.

Re: Disassassembler, показывающий данные E.G как неверные инструкции.

Я обеспокоен тем, что эти вещи могут полностью испортить разборку, особенно при наборе инструкций большого пальца (поскольку инструкции короче), разборка может выйти, если синхронизируется, когда он попадет в неверную инструкцию.
Что сделало бы всю последующую разборку недействительной. Но похоже, что это не так.

Моя другая забота, хотя это не является проблемой, - это то же самое, но применительно к разборке векторной таблицы, я.E, является ли разборка непосредственно после окончания векторной таблицы правильным или потенциально может быть испорчена, потому что конец векторной таблицы мог иметь данные, которые были разбиты на границе 2 байта, охватывающей в начале реального кода.

Но похоже, что мои опасения необоснованы, и это не может произойти.


КСТАТИ.

Прошлой ночью (мое измельчение) я посмотрел на использование своего BMP и GDB для этого, но у меня были проблемы с загрузкой файла бин, а не эльфом.

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

Также что -то странное, когда я продолжал получать аварию по адресу старта с эскизом Blink.

Понятия не имею, что с этим происходит.

Я также @victor_pv предложил попробовать отладчик озона Сеггера, но опять же, это действительно только сработало с файлом эльфа, а не с бин.
Но это похоже на то, что это хороший отладчик для всех, кто использует Windows, и имеет совместимый отладчик.
эн.G немного. Stlinks могут быть законно преобразованы в jlink.

Рик Кимбалл
Пн 13 февраля 2017 г., 21:31
Rogerclark написал: Прошлой ночью (мое измельчение) я посмотрел на использование своего BMP и GDB для этого, но у меня были проблемы с загрузкой файла бин, а не эльфом.
Я думал, что команда восстановления GDB должна была загрузить мусорное ведро, но, похоже, она не сработала, и я не мог получить код для сброса и запуска.

Rogerclark
Пн 13 февраля 2017 г., 21:39
Рик Кимбалл написал:Rogerclark написал: Прошлой ночью (мое измельчение) я посмотрел на использование своего BMP и GDB для этого, но у меня были проблемы с загрузкой файла бин, а не эльфом.
Я думал, что команда восстановления GDB должна была загрузить мусорное ведро, но, похоже, она не сработала, и я не мог получить код для сброса и запуска.

Rogerclark
Пн 13 февраля 2017 г., 21:42
ХОРОШО

BMP сейчас работает с файлом ELF.

Я попробую вручную сделать то же самое, восстановив файл bin

Rogerclark
Пн 13 февраля 2017 г., 21:53
Нет.

Restore не работает для меня в GDB :-(

GDB работает нормально

изданный if(false) // CODE NEVER RUN!! { functionAbc(); // THIS MAKE THE PROGRAM STOP WORKING WHEN ON RUN MODE - (BOOT 0 ONRUN), BUT WORK AFTER UPLOAD, the first time. } //The sketch uses 145500 bytes (27%) of storage space for programs. The maximum is 524288 bytes. //Global variables use 17192 bytes of dynamic memory.

Rogerclark
Пн 13 февраля 2017 г., 21:55
Я могу попробовать отключить BMP, подключение Stlink

Загрузка через Stlink, затем подключите BMP и скажите ему сбросить и запустить

, Но это боль каждый раз каждый раз