Вы можете использовать кодирование для этого. text.encode('UTF-8', :invalid => :replace, :undef => :replace)
Для получения дополнительной информации посмотрите в Ruby-Docs
Взгляните на раздел 17.2 в Справочном руководстве программиста 80386 . На самом деле дизассемблер - это просто прославленный конечный автомат . При разборке выполняются следующие шаги:
F3
, F2
или F0
); если да, то у вас есть префикс REP
/ REPE
/ REPNE
/ LOCK
. Перейти к следующему байту. 67
). Если это так, декодируйте адреса в остальной части инструкции в 16-битном режиме, если в настоящее время в 32-битном режиме, или декодировать адреса в 32-битном режиме, если в настоящее время в 16-битном режиме 66
). Если это так, декодируйте непосредственные операнды в 16-битном режиме, если в настоящее время в 32-битном режиме, или декодируйте непосредственные операнды в 32-битном режиме, если в настоящее время в 16-битном режиме 2E
, 36
, 3E
, 26
, 64
или 65
) . Если да, используйте соответствующий сегментный регистр для декодирования адресов вместо сегментного регистра по умолчанию. 0F
, то это расширенный код операции, и следующий байт считывается как расширенный код операции. Код операции сообщает вам о выполняемой операции. Аргументы кода операции могут быть декодированы из значений Mod R / M, SIB, смещения и немедленного значения. Есть много возможностей и много особых случаев из-за сложной природы x86. См. Ссылки выше для более подробного объяснения.
Аргументы кода операции могут быть декодированы из значений Mod R / M, SIB, смещения и немедленного значения. Есть много возможностей и много особых случаев из-за сложной природы x86. См. Ссылки выше для более подробного объяснения. Аргументы кода операции могут быть декодированы из значений Mod R / M, SIB, смещения и немедленного значения. Есть много возможностей и много особых случаев из-за сложной природы x86. См. Ссылки выше для более подробного объяснения.Начните с небольшой программы, которая была собрана, и которая дает вам и сгенерированный код, и инструкции. Получите себе справочник по архитектуре инструкций и проработайте часть сгенерированного кода со ссылкой на архитектуру вручную. Вы обнаружите, что инструкции имеют очень стереотипную структуру inst op op op с различным количеством операндов. Все, что вам нужно сделать, это перевести шестнадцатеричное или восьмеричное представление кода в соответствии с инструкциями; немного поэкспериментируя, покажет это.
Этот автоматизированный процесс является ядром дизассемблера. В идеале вы, вероятно, захотите создать массив структур инструкций внутри (или извне, если программа действительно большая).
Я бы порекомендовал проверить некоторые дизассемблеры с открытым исходным кодом, предпочтительно distorm и особенно "disOps (Instructions Sets DataBase)" (ctrl + найти его на странице).
Сама документация полна интересной информации о кодах операций и инструкциях.
Цитата из https://code.google.com/p/distorm/wiki/x86_x64_Machine_Code
80x86 Инструкция:
Инструкция 80x86 делится на количество элементов:
- Префиксы инструкций, влияют на поведение инструкции операция.
- Обязательный префикс, используемый в качестве байта кода операции для инструкций SSE.
- Байты кода операции могут быть одним или несколькими байтами (до 3 полных байтов).
- Байт ModR / M является необязательным и иногда может содержать часть сам код операции.
- Байт SIB является необязательным и представляет собой сложное косвенное обращение к памяти. форм.
- Смещение не является обязательным и представляет собой величину переменного размера байтов (byte, word, long) и используется как смещение.
- Немедленное не является обязательным и используется как общее числовое значение, построенное от разного размера байтов (байт, слово, длинное).
Формат выглядит следующим образом:
/ -------------------------------- -------------------------------------------------- -------------------------------------------------- ------- \ | * Префиксы | * Обязательный префикс | * Префикс REX | Байт кода операции | * ModR / M | * SIB | * Смещение (1,2 или 4 байта) | * Немедленно (1,2 или 4 байта) | \ ------------------------------------------------- -------------------------------------------------- ---------------------------------------- / * означает, что элемент является необязательным.
Структуры данных и этапы декодирования описаны в https://code.google.com/p/distorm/wiki/diStorm_Internals
Цитата:
Этапы декодирования
- [Префиксы]
- [Получить код операции]
- [Код операции фильтра]
- [Извлечь операнды]
- [Форматирование текста]
- [Hex Dump]
- [Декодированная инструкция]
Также объясняется каждый шаг.
Исходные ссылки сохранены по историческим причинам:
http://code.google.com/p/distorm/wiki/x86_x64_Machine_Code и http://code.google.com/p/distorm/wiki/diStorm_Internals
Вам нужна таблица кодов операций для загрузки.
Основная структура данных поиска - это дерево, однако таблица будет достаточно хороша, если вас не заботит скорость.
] Чтобы получить базовый тип кода операции, начинается с совпадения в таблице.
Существует несколько стандартных способов декодирования аргументов регистра; тем не менее, есть достаточно особых случаев, чтобы потребовать реализации большинства из них индивидуально.
Поскольку это образовательный, взгляните на ndisasm.