需要一些x86程序集的帮助

时间:2011-06-27 22:04:00

标签: c assembly x86

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 个答案:

答案 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 /6VMPTRLD,因此您日常工作的真正含义是:

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漏洞利用。在编写时,显然使用的汇编程序还不支持与虚拟化相关的指令,因此它们通过宏进行内联编码。