我愿意使用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_EA
和IARG_MEMORYOP_EA
之间有什么区别?
答案 0 :(得分:2)
IARG_EXPLICIT_MEMORY_EA
代表显式内存操作数的有效地址,该内存操作数是由指令编码中的专用位指定的内存操作数。在x86中,最多可以有一个显式内存操作数。 lea
确实具有显式的内存操作数,但是许多其他指令也可能具有显式的内存操作数。 push
,pop
和字符串指令具有隐式内存操作数。 IARG_EXPLICIT_MEMORY_EA
仅在INS_HasExplicitMemoryReference
为true
时有效。
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_EA
,IARG_MEMORYWRITE_EA
,IARG_MEMORYREAD2_EA
和IARG_MEMORYOP_EA
代表指令实际使用的显式或隐式内存操作数。 IARG_MEMORYREAD_EA
仅在INS_IsMemoryRead
为true
时有效。 IARG_MEMORYWRITE_EA
仅在INS_IsMemoryWrite
为true
时有效。 IARG_MEMORYREAD2_EA
仅在INS_HasMemoryRead2
为true
时有效。最后,IARG_MEMORYOP_EA
仅在INS_IsMemoryRead
或INS_IsMemoryWrite
中的至少一个为true
时有效。