Нужна помощь с сборкой x86 - PullRequest
2 голосов
/ 28 июня 2011
MODRM_EAX_06 MACRO   ;/* [EAX], with reg/opcode: /6 */ 
    BYTE    030h 
ENDM 

Что делает байт 030h?

Для дополнительной информации этот макрос используется в

void vmxPtrld(u64 addr) 
VmxPtrld PROC StdCall _addr_low,_addr_high 
mov eax,8 
add eax,ebp 
vmx_ptrld 
MODRM_EAX_06 
ret 
VmxPtrld ENDP 

Я просто хочу понять, что делает макрос в следующем коде?

Ответы [ 3 ]

5 голосов
/ 28 июня 2011

За многими кодами операций следует байт ModR / M, который разделен на 3 части: верхние два бита - «Mod», следующие три - «Reg», а нижние три - «R / M».

Комбинация частей "Mod" и "R / M" определяет регистр и режим адресации; часть «Reg» может указывать другой регистр или, в некоторых случаях, может указывать дополнительное расширение кода операции.

В этом случае байт ModR / M выглядит следующим образом:

    0 0 1 1 0 0 0 0
    \_/ \___/ \___/
    Mod  Reg   R/M

Модифицированные биты 00 и R / M биты 000 означают режим адресации [EAX] (в 32-битном режиме).

Остальные биты Reg являются 6 в десятичном виде. Отсюда MODRM_EAX_06.

Чтобы полностью понять, что происходит в вашем примере, вам нужно знать, что делает макрос vmx_ptrld. Предполагая, что это действительно то, что найдено @sixlettervariables, vmx_ptrld производит байты 0F C7.

0F - это первый байт двухбайтового кода операции. Во многих случаях следующий байт завершит код операции; но C7 указывает, что дополнительные биты должны быть считаны из поля Reg байта ModR / M, чтобы определить, какой это код операции. Таким образом, окончательный код операции - 0F, за которым следует C7, за которым следует 6 из поля Reg байта ModR / M, записанного как 0F C7 /6 в руководствах Intel (который можно найти здесь ).

0F C7 /6 - это VMPTRLD, поэтому реальный смысл вашей рутины:

mov eax,8 
add eax,ebp 
vmptrld [eax]
ret 

Предположительно, это было написано так для старых ассемблеров, которые не понимают (относительно недавних) инструкций VMX.

4 голосов
/ 28 июня 2011

Похоже, что они используют это для генерации инструкций, и это mod r / m байт инструкции.

1 голос
/ 28 июня 2011

Глядя на bluepill (я полагаю, это код, о котором спрашивает OP), vmx_ptrld также является макросом, поэтому

vmx_ptrld
MODRM_EAX_06

- это отдельная инструкция, MODRM_EAX_06 - данные для инструкции.

Обоснование: bluepill - это уязвимость PoC для виртуализации. Когда он был написан, очевидно, что используемый ассемблер еще не поддерживал инструкции, связанные с виртуализацией, поэтому они были встроены в код с помощью макросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...