Форматирование шестнадцатеричного кода в asm-код

Мне нужно написать что-то вроде «дизассемблера», мне нужно прочитать оперативную память (раздел кода) и показать его в формате, как

ADD rax, rbx
MOV rcx, rax

Где найти исчерпывающее руководство / документ о том, как преобразовать код операции в соответствующую операцию / операнды? Я нацеливаюсь на сборку x64

1

Решение

Я бы порекомендовал вам просто использовать лицензированный BSD библиотека udis86 вместо того, чтобы писать еще один дизассемблер x86:

#include <stdio.h>
#include <udis86.h>

enum {
/* Controls whether to disassemble for x86 or x64 */
UDIS86_MODE = 64 /* 16, 32, or 64 */
};

int main()
{
ud_t ud_obj;

ud_init(&ud_obj);

ud_set_input_file(&ud_obj, stdin);
ud_set_mode(&ud_obj, UDIS86_MODE);
ud_set_syntax(&ud_obj, UD_SYN_INTEL);

while (ud_disassemble(&ud_obj)) {
printf("\t%s\n", ud_insn_asm(&ud_obj));
}

return 0;
}

Версия Udis86 на github даже поддерживает последние инструкции Intel AVX.

Udis86 довольно легко собрать для x86 или x64 Windows с помощью набора инструментов MinGW64 / MSYS. На тот случай, если вы не знакомы с GCC и системой сборки GNU autotools, я создал:

  1. http://scottt.tw/mingw32-udis86.tar.gz
  2. http://scottt.tw/mingw64-udis86.tar.gz

для вашего удобства. Архивы содержат DLL и заголовочные файлы. (Разумно ли скачивать и запускать библиотеки DLL от случайных незнакомцев, которые отвечают на вопросы по Stackoverflow — это другой вопрос;).

2

Другие решения

Вы можете взглянуть на эта библиотека — Вы можете использовать его «как есть» или просто поучиться у его источника (выпущенного по лицензии BSD).

3

Это мой список опкодов, отсортированный по номерам:

http://ref.x86asm.net/geek64.html

Этот сайт также имеет много других списков. Однако, как вы можете видеть, на x86 / 64 довольно много операционных кодов, поэтому написание дизассемблера вручную займет некоторое время.

Я бы посоветовал вам передать код существующему дизассемблеру. Например, посмотрите этот вопрос:

Как мне разобрать сырой код x86?

0

  1. Для Intel вы можете найти его на http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html — в частности, вы могли быть заинтересованы в томе 2.

  2. Для процессоров AMD это должно быть здесь: http://developer.amd.com/resources/documentation-articles/developer-guides-manuals/#manuals . Похоже, вам понадобится том 3.

Тем не менее, у них много общего.

0

Если вы создаете свой собственный дизассемблер, обязательно загрузите руководство по набору инструкций (Том 2) из ​​…

http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

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

Надеюсь это поможет.

0
По вопросам рекламы [email protected]