IARG_EXPLICIT_MEMORY_EA应该用于什么?

时间:2019-07-14 20:17:19

标签: x86 profiling instrumentation intel-pin

我愿意使用lea指令,然后调用PIN_SafeCopy()来捕获内存内容。我尝试了IARG_MEMORY_READ_EA,但是没有用。因此,我转到IARG_EXPLICIT_MEMORY_EA,因为它在精美的手册中写到,它对于仪器学习指令很有用。

但是它也不起作用。按照以下说明进行操作:

 lea eax, ptr [r11+0x1]

我通过IARG_EXPLICIT_MEMORY_EA获得的地址是0x00000088,我不能与PIN_SafeCopy()一起使用

我的问题是IARG_EXPLICIT_MEMORY_EA是要计算lea指令(已加载到寄存器中)的有效地址还是其他东西?

我会理解并不需要真正地计算有效地址,因为这是指令本身的工作...我仍然想确保自己的理解是正确的。

奖励问题IARG_MEMORYREAD_EA | IARG_MEMORYWRITE_EAIARG_MEMORYOP_EA之间有什么区别?

1 个答案:

答案 0 :(得分:2)

IARG_EXPLICIT_MEMORY_EA代表显式内存操作数的有效地址,该内存操作数是由指令编码中的专用位指定的内存操作数。在x86中,最多可以有一个显式内存操作数。 lea确实具有显式的内存操作数,但是许多其他指令也可能具有显式的内存操作数。 pushpop和字符串指令具有隐式内存操作数。 IARG_EXPLICIT_MEMORY_EA仅在INS_HasExplicitMemoryReferencetrue时有效。

lea与其他具有内存操作数的指令之间的本质区别是lea不使用其内存操作数来访问内存。实际上,使用lea计算的有效地址甚至可能不是内存地址。 lea has advantages over other (combinations of) instructions for doing arithmetic.因此,如果lea eax, ptr [r11+0x1]中的有效地址为0x00000088,则可能使用lea仅将r11和0x1加起来并将结果存储在eax中。有效地址实际上并没有用于访问内存(在后面的指令中)。

  

我的问题是:IARG_EXPLICIT_MEMORY_EA是否打算计算   lea指令的有效地址(已加载到   注册)还是其他?

是的,但不仅限于lea。可以使用IARG_EXPLICIT_MEMORY_EA捕获带有显式内存操作数的任何指令的有效地址,并将其传递给分析例程。

如果您只对lea感兴趣,则在向分析例程调用之前使用INS_IsLea

  

奖金问题:两者之间有什么区别   IARG_MEMORYREAD_EA | IARG_MEMORYWRITE_EA和IARG_MEMORYOP_EA吗?

没有IARG_MEMORYREAD_EA|IARG_MEMORYWRITE_EA这样的东西。 IARG_MEMORYREAD_EA|IARG_MEMORYWRITE_EA的值可以等于或可以不等于IARG_MEMORYOP_EA,它的含义可以是任何IARG_*自变量,或者什么都不是。

请注意,IARG_MEMORYREAD_EAIARG_MEMORYWRITE_EAIARG_MEMORYREAD2_EAIARG_MEMORYOP_EA代表指令实际使用的显式或隐式内存操作数。 IARG_MEMORYREAD_EA仅在INS_IsMemoryReadtrue时有效。 IARG_MEMORYWRITE_EA仅在INS_IsMemoryWritetrue时有效。 IARG_MEMORYREAD2_EA仅在INS_HasMemoryRead2true时有效。最后,IARG_MEMORYOP_EA仅在INS_IsMemoryReadINS_IsMemoryWrite中的至少一个为true时有效。