簡體   English   中英

需要一些x86程序集的幫助

[英]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 /6VMPTRLD ,因此您例程的真正含義是:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM