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

【问题讨论】:

【参考方案1】:

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 时才有效。

【讨论】:

我不明白“没有像 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_EAIARG_MEMORYREAD2_EAIARG_MULTI_MEMORYACCESS_EA。这将排除 LEA,它实际上并不访问内存。

以上是关于IARG_EXPLICIT_MEMORY_EA 应该用于啥?的主要内容,如果未能解决你的问题,请参考以下文章

单应矩阵是啥?怎么用呀

固定的透明元素不应包含文本,而仅应包括背景

必应词典api怎么用 java

如果 Mean = Mode 则应显示 1,否则应显示 0 的代码故障排除

如果存在移动应用而不是 Web 表单,则 Twitter OAuth 应打开移动应用以进行授权

在给定数组中查找最小值和最大值,其中约束应最小值索引应小于其最大值