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
我只是想了解宏在以下代码中的作用?
答案 0 :(得分:5)
许多操作码之后是一个ModR / M字节,它被分成3个部分:前两位是“Mod”,后三位是“Reg”,后三位是“R / M”。 / p>
“Mod”和“R / M”部分的组合指定寄存器和寻址模式; “Reg”部分可以指定另一个寄存器,或者在某些情况下,可以指定对操作码的进一步扩展。
在这种情况下,ModR / M字节如下所示:
0 0 1 1 0 0 0 0 \_/ \___/ \___/ Mod Reg R/M
00
的Mod位和000
的R / M位表示[EAX]
的寻址模式(在32位模式下)。
其余的Reg位是十进制的6
。因此MODRM_EAX_06
。
要完全了解示例中的内容,您需要知道vmx_ptrld
宏的作用。假设这确实是@sixlettervariables发现的,vmx_ptrld
产生字节0F C7
。
0F
是双字节操作码的第一个字节。在许多情况下,下一个字节将完成操作码;但C7
表示必须从ModR / M字节的Reg字段读取更多位,以确定操作码是什么。因此,最终的操作码为0F
,后跟C7
,后跟来自ModR / M字节的Reg字段的6
,在英特尔的手册中写为0F C7 /6
(可以是找到here)。
0F C7 /6
是VMPTRLD
,因此您日常工作的真正含义是:
mov eax,8
add eax,ebp
vmptrld [eax]
ret
据推测,它是为了旧的汇编程序的利益而编写的,它们不了解(相对较新的)VMX指令。
答案 1 :(得分:4)
看起来他们正在使用它来生成指令,这是指令的mod r/m byte。
答案 2 :(得分:1)
查看bluepill(我猜是OP正在询问的代码),vmx_ptrld
也是一个宏,所以
vmx_ptrld
MODRM_EAX_06
是单个指令,MODRM_EAX_06
是指令的数据。
基本原理: bluepill 是针对虚拟化的PoC漏洞利用。在编写时,显然使用的汇编程序还不支持与虚拟化相关的指令,因此它们通过宏进行内联编码。