首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IARG_EXPLICIT_MEMORY_EA应该用于什么?

IARG_EXPLICIT_MEMORY_EA应该用于什么?
EN

Stack Overflow用户
提问于 2019-07-14 20:17:19
回答 1查看 136关注 0票数 2

我愿意测试lea指令,然后调用PIN_SafeCopy()来捕获内存的内容。我和IARG_MEMORY_READ_EA试过了,但没有起作用。因此,我移到IARG_EXPLICIT_MEMORY_EA,因为它是写在精细的手册,它是有用的仪器精益说明。

但这两者都不起作用。接受以下指示:

代码语言:javascript
复制
 lea eax, ptr [r11+0x1]

我从IARG_EXPLICIT_MEMORY_EA获得的地址是0x00000088,我不能在PIN_SafeCopy()中使用它

我的问题是IARG_EXPLICIT_MEMORY_EA打算计算lea指令的有效地址(加载到寄存器中)还是其他的?

我会理解,没有真正的需要计算有效地址,因为这是指示itself...still的工作,我想确保我的理解是正确的。

额外的问题IARG_MEMORYREAD_EAIARG_MEMORYWRITE_EAIARG_MEMORYOP_EA之间有什么区别?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-15 10:21:18

IARG_EXPLICIT_MEMORY_EA表示显式内存操作数的有效地址,该内存操作数是由指令编码中的专用位指定的内存操作数。在x86中,最多只能有一个显式内存操作数。lea确实有一个显式内存操作数,但许多其他指令也可能具有显式内存操作数。pushpop和string指令具有隐式内存操作数。只有当IARG_EXPLICIT_MEMORY_EAtrue时,INS_HasExplicitMemoryReference才是有效的。

lea与具有内存操作数的其他指令之间的根本区别在于,lea不使用其内存操作数来访问内存。实际上,使用lea计算的有效地址甚至可能不是内存地址。因此,如果 has advantages over other (combinations of) instructions for doing arithmetic.中的有效地址是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_EAtrue时,INS_IsMemoryRead才是有效的。只有当IARG_MEMORYWRITE_EAtrue时,INS_IsMemoryWrite才是有效的。只有当IARG_MEMORYREAD2_EAtrue时,INS_HasMemoryRead2才是有效的。最后,IARG_MEMORYOP_EA只有在INS_IsMemoryReadINS_IsMemoryWrite中至少有一个是true时才有效。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57030850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档