IARG_EXPLICIT_MEMORY_EA 应该用来做什么?

What IARG_EXPLICIT_MEMORY_EA should be used for?

我愿意使用 lea 指令,然后调用 PIN_SafeCopy() 来捕获内存中的内容。我尝试使用 IARG_MEMORY_READ_EA 但它没有用。所以我转向 IARG_EXPLICIT_MEMORY_EA,因为它在精美的手册中写道,它对检测 lea 指令很有用。

但它也不起作用。采取以下指令:

 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 有什么区别?

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

lea和其他有内存操作数的指令的本质区别在于lea不使用它的内存操作数来访问内存。事实上,使用lea计算出的有效地址甚至可能不是内存地址。 所以如果 lea eax, ptr [r11+0x1] 中的有效地址是 0x00000088,那么 lea 可能只是用来添加 r11 和 0x1 并将结果存储在 eax 中。有效地址实际上并未用于访问内存(在后面的指令中)。

My question is: Is IARG_EXPLICIT_MEMORY_EA intended to compute the effective address of a lea instruction (that is loaded into the register) or is it something else ?

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

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

Bonus question: what's the difference between IARG_MEMORYREAD_EA|IARG_MEMORYWRITE_EA and 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.

时才有效