确定指令是否具有间接内存操作数



查看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

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

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

注意:lea指令只是将存储器地址加载到寄存器中。它从未真正访问过内存地址。请阅读此处。如果指令操作码为lea,则INS_IsLea返回true。因此,对于MOV rax, (%rdi) ,它将返回false

我只是在猜测,因为在阅读这个问题之前,我从未听说过这个库,但是。。。

我认为,如果INS_IsMemoryRead()INS_IsMemoryWrite()中的一个为真,那么它必须有一个间接内存操作数。

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

最新更新