Мне нужно написать что-то вроде «дизассемблера», мне нужно прочитать оперативную память (раздел кода) и показать его в формате, как
ADD rax, rbx
MOV rcx, rax
Где найти исчерпывающее руководство / документ о том, как преобразовать код операции в соответствующую операцию / операнды? Я нацеливаюсь на сборку x64
Я бы порекомендовал вам просто использовать лицензированный 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, я создал:
для вашего удобства. Архивы содержат DLL и заголовочные файлы. (Разумно ли скачивать и запускать библиотеки DLL от случайных незнакомцев, которые отвечают на вопросы по Stackoverflow — это другой вопрос;).
Вы можете взглянуть на эта библиотека — Вы можете использовать его «как есть» или просто поучиться у его источника (выпущенного по лицензии BSD).
Это мой список опкодов, отсортированный по номерам:
http://ref.x86asm.net/geek64.html
Этот сайт также имеет много других списков. Однако, как вы можете видеть, на x86 / 64 довольно много операционных кодов, поэтому написание дизассемблера вручную займет некоторое время.
Я бы посоветовал вам передать код существующему дизассемблеру. Например, посмотрите этот вопрос:
Для Intel вы можете найти его на http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html — в частности, вы могли быть заинтересованы в томе 2.
Для процессоров AMD это должно быть здесь: http://developer.amd.com/resources/documentation-articles/developer-guides-manuals/#manuals . Похоже, вам понадобится том 3.
Тем не менее, у них много общего.
Если вы создаете свой собственный дизассемблер, обязательно загрузите руководство по набору инструкций (Том 2) из …
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
Примечания и таблицы в приложениях неоценимы. Вы, вероятно, заметите, что многие инструкции следуют аналогичному шаблону. В результате вы можете создавать свои собственные таблицы указателей функций для декодирования инструкций. Заполнение таблиц может занять много времени.
Надеюсь это поможет.