Как записать дизассемблер? [закрытый]

Вы можете использовать кодирование для этого. text.encode('UTF-8', :invalid => :replace, :undef => :replace)

Для получения дополнительной информации посмотрите в Ruby-Docs

65
задан Jay Bosamiya 21 February 2015 в 22:22
поделиться

4 ответа

Взгляните на раздел 17.2 в Справочном руководстве программиста 80386 . На самом деле дизассемблер - это просто прославленный конечный автомат . При разборке выполняются следующие шаги:

  1. Проверить, является ли текущий байт байтом префикса инструкции ( F3 , F2 или F0 ); если да, то у вас есть префикс REP / REPE / REPNE / LOCK . Перейти к следующему байту.
  2. Проверить, является ли текущий байт байтом размера адреса ( 67 ). Если это так, декодируйте адреса в остальной части инструкции в 16-битном режиме, если в настоящее время в 32-битном режиме, или декодировать адреса в 32-битном режиме, если в настоящее время в 16-битном режиме
  3. Проверьте, является ли текущий байт байтом размера операнда ( 66 ). Если это так, декодируйте непосредственные операнды в 16-битном режиме, если в настоящее время в 32-битном режиме, или декодируйте непосредственные операнды в 32-битном режиме, если в настоящее время в 16-битном режиме
  4. Проверьте, является ли текущий байт байтом замены сегмента ( 2E , 36 , 3E , 26 , 64 или 65 ) . Если да, используйте соответствующий сегментный регистр для декодирования адресов вместо сегментного регистра по умолчанию.
  5. Следующий байт - это код операции. Если код операции 0F , то это расширенный код операции, и следующий байт считывается как расширенный код операции.
  6. В зависимости от конкретного кода операции считывать и декодировать байт Mod R / M, байт базы индекса масштабирования (SIB), смещение (0, 1, 2 или 4 байта) и / или непосредственное значение (0, 1, 2 или 4 байта). Размеры этих полей зависят от кода операции, переопределения размера адреса и переопределения размера операнда, ранее декодированного.

Код операции сообщает вам о выполняемой операции. Аргументы кода операции могут быть декодированы из значений Mod R / M, SIB, смещения и немедленного значения. Есть много возможностей и много особых случаев из-за сложной природы x86. См. Ссылки выше для более подробного объяснения.

Аргументы кода операции могут быть декодированы из значений Mod R / M, SIB, смещения и немедленного значения. Есть много возможностей и много особых случаев из-за сложной природы x86. См. Ссылки выше для более подробного объяснения.

Аргументы кода операции могут быть декодированы из значений Mod R / M, SIB, смещения и немедленного значения. Есть много возможностей и много особых случаев из-за сложной природы x86. См. Ссылки выше для более подробного объяснения.

63
ответ дан 24 November 2019 в 15:29
поделиться

Начните с небольшой программы, которая была собрана, и которая дает вам и сгенерированный код, и инструкции. Получите себе справочник по архитектуре инструкций и проработайте часть сгенерированного кода со ссылкой на архитектуру вручную. Вы обнаружите, что инструкции имеют очень стереотипную структуру inst op op op с различным количеством операндов. Все, что вам нужно сделать, это перевести шестнадцатеричное или восьмеричное представление кода в соответствии с инструкциями; немного поэкспериментируя, покажет это.

Этот автоматизированный процесс является ядром дизассемблера. В идеале вы, вероятно, захотите создать массив структур инструкций внутри (или извне, если программа действительно большая).

6
ответ дан 24 November 2019 в 15:29
поделиться

Я бы порекомендовал проверить некоторые дизассемблеры с открытым исходным кодом, предпочтительно distorm и особенно "disOps (Instructions Sets DataBase)" (ctrl + найти его на странице).

Сама документация полна интересной информации о кодах операций и инструкциях.

Цитата из https://code.google.com/p/distorm/wiki/x86_x64_Machine_Code

80x86 Инструкция:

Инструкция 80x86 делится на количество элементов:

  1. Префиксы инструкций, влияют на поведение инструкции операция.
  2. Обязательный префикс, используемый в качестве байта кода операции для инструкций SSE.
  3. Байты кода операции могут быть одним или несколькими байтами (до 3 полных байтов).
  4. Байт ModR / M является необязательным и иногда может содержать часть сам код операции.
  5. Байт SIB является необязательным и представляет собой сложное косвенное обращение к памяти. форм.
  6. Смещение не является обязательным и представляет собой величину переменного размера байтов (byte, word, long) и используется как смещение.
  7. Немедленное не является обязательным и используется как общее числовое значение, построенное от разного размера байтов (байт, слово, длинное).

Формат выглядит следующим образом:

 / -------------------------------- -------------------------------------------------- -------------------------------------------------- ------- \
| * Префиксы | * Обязательный префикс | * Префикс REX | Байт кода операции | * ModR / M | * SIB | * Смещение (1,2 или 4 байта) | * Немедленно (1,2 или 4 байта) |
\ ------------------------------------------------- -------------------------------------------------- ---------------------------------------- /
* означает, что элемент является необязательным.

Структуры данных и этапы декодирования описаны в https://code.google.com/p/distorm/wiki/diStorm_Internals

Цитата:

Этапы декодирования

  1. [Префиксы]
  2. [Получить код операции]
  3. [Код операции фильтра]
  4. [Извлечь операнды]
  5. [Форматирование текста]
  6. [Hex Dump]
  7. [Декодированная инструкция]

Также объясняется каждый шаг.


Исходные ссылки сохранены по историческим причинам:

http://code.google.com/p/distorm/wiki/x86_x64_Machine_Code и http://code.google.com/p/distorm/wiki/diStorm_Internals

22
ответ дан 24 November 2019 в 15:29
поделиться

Вам нужна таблица кодов операций для загрузки.

Основная структура данных поиска - это дерево, однако таблица будет достаточно хороша, если вас не заботит скорость.

] Чтобы получить базовый тип кода операции, начинается с совпадения в таблице.

Существует несколько стандартных способов декодирования аргументов регистра; тем не менее, есть достаточно особых случаев, чтобы потребовать реализации большинства из них индивидуально.

Поскольку это образовательный, взгляните на ndisasm.

4
ответ дан 24 November 2019 в 15:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: