查看PIN的Inspection API Page,有一个名为INS_IsLea()
的方法,如果当前指令是LEA
指令,则返回true。这很有用,但我需要确定其中一个指令操作数是否是间接引用。例如:
MOV rax, (%rdi)
我希望能够确定第二个操作数实际上是一个间接引用,但似乎没有可用的方法。
INS_OperandIsMemory(),如果您只想检查其中一个操作数是否为内存操作数。
请注意,第二个参数n
表示Intel语法中的操作数(0索引),例如
; rax = destination op; rdi = source op
mov rax, [rdi] ; rax = op #0 ; rdi = op #1
看起来您正在寻找两种情况:
- 如果操作数是包含内存地址的寄存器。这用于间接跳转或调用。可通过
INS_IsIndirectBranchOrCall(ins)
检测 - 如果第二个操作数是用于算术或移动操作的内存位置。可由
(!INS_IsBranchOrCall(ins) && (INS_MemoryOperandCount(ins) > 0))
检测
注意:lea
指令只是将存储器地址加载到寄存器中。它从未真正访问过内存地址。请阅读此处。如果指令操作码为lea
,则INS_IsLea
返回true。因此,对于MOV rax, (%rdi)
,它将返回false
我只是在猜测,因为在阅读这个问题之前,我从未听说过这个库,但是。。。
我认为,如果INS_IsMemoryRead()
、INS_IsMemoryWrite()
中的一个为真,那么它必须有一个间接内存操作数。
此外,INS_MemoryOperand*()
函数从不同的角度对操作数进行检查。