我愿意测试lea指令,然后调用PIN_SafeCopy()来捕获内存的内容。我和IARG_MEMORY_READ_EA试过了,但没有起作用。因此,我移到IARG_EXPLICIT_MEMORY_EA,因为它是写在精细的手册,它是有用的仪器精益说明。
但这两者都不起作用。接受以下指示:
lea eax, ptr [r11+0x1]我从IARG_EXPLICIT_MEMORY_EA获得的地址是0x00000088,我不能在PIN_SafeCopy()中使用它
我的问题是:IARG_EXPLICIT_MEMORY_EA打算计算lea指令的有效地址(加载到寄存器中)还是其他的?
我会理解,没有真正的需要计算有效地址,因为这是指示itself...still的工作,我想确保我的理解是正确的。
额外的问题:IARG_MEMORYREAD_EA,IARG_MEMORYWRITE_EA和IARG_MEMORYOP_EA之间有什么区别?
发布于 2019-07-15 10:21:18
IARG_EXPLICIT_MEMORY_EA表示显式内存操作数的有效地址,该内存操作数是由指令编码中的专用位指定的内存操作数。在x86中,最多只能有一个显式内存操作数。lea确实有一个显式内存操作数,但许多其他指令也可能具有显式内存操作数。push、pop和string指令具有隐式内存操作数。只有当IARG_EXPLICIT_MEMORY_EA是true时,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_EA、IARG_MEMORYWRITE_EA、IARG_MEMORYREAD2_EA和IARG_MEMORYOP_EA表示指令实际用于访问内存的显式或隐式内存操作数。只有当IARG_MEMORYREAD_EA是true时,INS_IsMemoryRead才是有效的。只有当IARG_MEMORYWRITE_EA是true时,INS_IsMemoryWrite才是有效的。只有当IARG_MEMORYREAD2_EA是true时,INS_HasMemoryRead2才是有效的。最后,IARG_MEMORYOP_EA只有在INS_IsMemoryRead或INS_IsMemoryWrite中至少有一个是true时才有效。
https://stackoverflow.com/questions/57030850
复制相似问题