0

查看 PIN 的检查 API 页面INS_IsLea(),如果当前指令是非指令,则调用该方法返回 true LEA。这很有用,但我需要确定指令操作数之一是否是间接引用。例如:

MOV rax, (%rdi)

我希望能够确定第二个操作数实际上是间接引用,但似乎没有可用的方法。

4

3 回答 3

1

INS_OperandIsMemory()如果您只想检查其中一个操作数是否是内存操作数。

请注意,第二个参数 ,n表示 Intel 语法中的操作数编号(索引为 0),例如

; rax = destination op; rdi = source op
mov rax, [rdi] ; rax = op #0 ; rdi = op #1
于 2016-05-04T23:46:12.860 回答
1

看起来您正在寻找两种情况:

  1. 如果操作数是包含内存地址的寄存器。这用于间接跳转或调用。可以通过检测INS_IsIndirectBranchOrCall(ins)
  2. 如果第二个操作数是用于算术或移动操作的内存位置。可以通过以下方式检测(!INS_IsBranchOrCall(ins) && (INS_MemoryOperandCount(ins) > 0))

注意: lea指令只是将内存地址加载到寄存器中。它从不实际访问内存地址。在这里阅读。INS_IsLea返回 true 是指令操作码是lea。因此它将返回 falseMOV rax, (%rdi)

于 2016-05-26T07:03:15.117 回答
0

我只是在这里猜测,因为在阅读这个问题之前我从未听说过这个图书馆,但是......

我认为如果 , 之一为真INS_IsMemoryRead()INS_IsMemoryWrite()则它必须具有间接内存操作数。

此外,从不同的角度,INS_MemoryOperand*()函数检查操作数。

于 2016-05-04T20:50:44.170 回答