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

Я заинтересован в написании диссамблера x86 в качестве образовательного проекта.

Единственный реальный ресурс, который я нашел - это Spiral Space, " Как написать дизассемблер ". Хотя это дает хорошее общее описание различных компонентов дизассемблера, я заинтересован в некоторых более подробных ресурсах. Я также быстро взглянул на исходный код NASM , но это несколько тяжелый материал для изучения.

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

Может кто-нибудь указать мне какие-либо подробные ресурсы по написанию дизассемблера x86?

64 голоса | спросил mmcdole 29 Mayam09 2009, 07:50:28

5 ответов


0

Ознакомьтесь с разделом 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, байт Scale Index Base (SIB), смещение (0, 1, 2 или 4 байта) и /или непосредственное значение ( 0, 1, 2 или 4 байта). Размеры этих полей зависят от кода операции, переопределения размера адреса и переопределения размера операнда, ранее декодированных.

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

ответил Adam Rosenfield 29 Mayam09 2009, 08:57:22
0

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

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

Цитата из https://code.google.com /п /distorm /вики /x86_x64_Machine_Code

  

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

     

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

     
  1. Префиксы инструкций, влияют на поведение инструкций   работа.
  2.   
  3. Обязательный префикс, используемый в качестве байта кода операции для инструкций SSE.
  4.   
  5. Байты кода операции, могут быть одним или несколькими байтами (до 3 целых байтов).
  6.   
  7. байт ModR /M является необязательным и иногда может содержать часть   сам код операции.
  8.   
  9. Байт SIB является необязательным и представляет сложную косвенную память   формы.
  10.   
  11. Смещение является необязательным, и это значение может варьироваться   байт (байт, слово, длинный) и используется как   смещение.
  12.   
  13. Immediate является необязательным и используется как построенное общее числовое значение   от разного размера байтов (байт,   слово, долго).
  14.   

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

/-------------------------------------------------------------------------------------------------------------------------------------------\
|*Prefixes | *Mandatory Prefix | *REX Prefix | Opcode Bytes | *ModR/M | *SIB | *Displacement (1,2 or 4 bytes) | *Immediate (1,2 or 4 bytes) |
\-------------------------------------------------------------------------------------------------------------------------------------------/
* means the element is optional.

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

Цитата:

  

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

     
    [Префиксы]   
  1. [Получить код операции]
  2.   
  3. [Фильтр кода операции]
  4.   
  5. [Извлечь операнд (ы)]
  6.   
  7. [Форматирование текста]
  8.   
  9. [Hex Dump]
  10.   
  11. [Расшифрованная инструкция]
  12.   

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


Оригинальные ссылки сохраняются по историческим причинам:

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

ответил hannson 29 Mayam09 2009, 08:41:55
0

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

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

ответил Charlie Martin 29 Mayam09 2009, 08:00:27
0

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

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

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

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

Так как это познавательно, взгляните на ndisasm.

ответил Joshua 29 Mayam09 2009, 08:02:55
0
Источники

Checkout objdump - это отличный инструмент, он содержит множество таблиц кодов операций и его источники могут стать хорошей основой для создания собственного дизассемблера.

ответил Grzegorz Wierzowiecki 8 AM00000030000004231 2011, 03:27:42

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132