IARG_EXPLICIT_MEMORY_EA 应该用于啥?
Posted
技术标签:
【中文标题】IARG_EXPLICIT_MEMORY_EA 应该用于啥?【英文标题】:What IARG_EXPLICIT_MEMORY_EA should be used for?IARG_EXPLICIT_MEMORY_EA 应该用于什么? 【发布时间】:2019-11-23 15:09:03 【问题描述】:我愿意检测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
之间有什么区别?
【问题讨论】:
【参考方案1】: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
时才有效。
【讨论】:
我不明白“没有像 IARG_MEMORYREAD_EA|IARG_MEMORYWRITE_EA 这样的东西。”也许我应该用“,”而不是“|” @Heyji 哦,好的。IARG_MEMORYREAD_EA
表示指令读取的内存操作数。 IARG_MEMORYWRITE_EA
表示指令写入的内存操作数。 IARG_MEMORYOP_EA
表示读或写。
@Haidi Brais,我明白了。所以 IARG_MEMORYOP_EA 是一种可以立即处理内存操作数的商品,无论它是读、写还是两者兼而有之。紧随其后的是 IARG_MEMORYREAD_EA 和 IARG_MEMORYWRITE_EA 不是吗?
@Heyji 是的。但是“它来了”是什么意思?
@Feng.Ma 是的,例如从内存读取到寄存器的 MOV 指令。如果要统计从内存中读取的内存操作数的数量,可以使用IARG_MEMORYREAD_EA
、IARG_MEMORYREAD2_EA
和IARG_MULTI_MEMORYACCESS_EA
。这将排除 LEA,它实际上并不访问内存。以上是关于IARG_EXPLICIT_MEMORY_EA 应该用于啥?的主要内容,如果未能解决你的问题,请参考以下文章
如果 Mean = Mode 则应显示 1,否则应显示 0 的代码故障排除