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_EA
和 IARG_MEMORYOP_EA
有什么区别?
IARG_EXPLICIT_MEMORY_EA
表示显式内存操作数的有效地址,它是在指令编码中由专用位指定的内存操作数。在 x86 中,最多可以有一个显式内存操作数。 lea
确实有显式内存操作数,但许多其他指令也可能有显式内存操作数。 push
、pop
和字符串指令具有隐式内存操作数。 IARG_EXPLICIT_MEMORY_EA
仅在 INS_HasExplicitMemoryReference
为 true
时有效。
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_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
.
时才有效
我愿意使用 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_EA
和 IARG_MEMORYOP_EA
有什么区别?
IARG_EXPLICIT_MEMORY_EA
表示显式内存操作数的有效地址,它是在指令编码中由专用位指定的内存操作数。在 x86 中,最多可以有一个显式内存操作数。 lea
确实有显式内存操作数,但许多其他指令也可能有显式内存操作数。 push
、pop
和字符串指令具有隐式内存操作数。 IARG_EXPLICIT_MEMORY_EA
仅在 INS_HasExplicitMemoryReference
为 true
时有效。
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_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
.