查看PIN Inspection API Page,有一个名为INS_IsLea()
的方法,如果当前指令是LEA
指令,则返回true。这很有用,但我需要确定其中一个指令操作数是否是间接引用。例如:
MOV rax, (%rdi)
我希望能够确定第二个操作数实际上是间接引用,但似乎没有可用的方法。
答案 0 :(得分:1)
INS_OperandIsMemory()如果您只是想检查其中一个操作数是否是内存操作数。
请注意,第二个参数n
表示Intel语法中的操作数(0-indexed),例如
; rax = destination op; rdi = source op
mov rax, [rdi] ; rax = op #0 ; rdi = op #1
答案 1 :(得分:1)
看起来你正在寻找两种情况:
INS_IsIndirectBranchOrCall(ins)
(!INS_IsBranchOrCall(ins) && (INS_MemoryOperandCount(ins) > 0))
注:的
lea
指令只是将内存地址加载到寄存器中。它实际上从未访问过内存地址。阅读here。 INS_IsLea
返回true,指令操作码为lea
。因此,它将为MOV rax, (%rdi)
答案 2 :(得分:0)
我只是在这里猜测,因为我在阅读这个问题之前从未听说过这个图书馆,但是......
我认为如果INS_IsMemoryRead()
,INS_IsMemoryWrite()
中的一个为真,则必须有间接内存操作数。
此外,从不同的角度来看,INS_MemoryOperand*()
函数会检查操作数。