[英]Need some help with x86 assembly
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
我只是想了解宏在下面的代碼中做了什么?
許多操作碼之后是一個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
硬件位和000
R / M位表示[EAX]
的尋址模式(在32位模式下)。
其余的Reg位是十進制的6
。 因此MODRM_EAX_06
。
要完全了解示例中的內容,您需要知道vmx_ptrld
宏的作用。 假設這確實是@sixlettervariables找到的, vmx_ptrld
產生字節0F C7
。
0F
是雙字節操作碼的第一個字節。 在許多情況下,下一個字節將完成操作碼; 但是C7
表示必須從ModR / M字節的Reg字段讀取更多位以確定操作碼是什么。 所以最終的操作碼0F
之后C7
其次是6
從MODR / M字節的Reg字段,寫成0F C7 /6
英特爾手冊(可以發現這里 )。
0F C7 /6
是VMPTRLD
,因此您例程的真正含義是:
mov eax,8
add eax,ebp
vmptrld [eax]
ret
據推測,它是為了舊的匯編程序的利益而編寫的,它們不了解(相對較新的)VMX指令。
看起來他們正在使用它來生成指令,這是指令的mod r / m字節 。
看看bluepill (我猜是OP正在詢問的代碼), vmx_ptrld
也是一個宏,所以
vmx_ptrld
MODRM_EAX_06
是一條指令, MODRM_EAX_06
是指令的數據。
理由: bluepill是用於虛擬化的PoC漏洞。 在編寫時,顯然使用的匯編程序還不支持與虛擬化相關的指令,因此它們通過宏進行內聯編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.