英特尔 PIN:InsertPredicatedCall 和 INS_InsertCall

逆向工程 部件 x86 仪器仪表 小工具
2021-07-09 04:28:32

英特尔 PIN 手册(内存参考跟踪部分)说:

我们还使用INS_InsertPredicatedCall代替INS_InsertCall来避免在谓词为假时生成对谓词指令的引用,请参见此处。

_

当指令有谓词且谓词为假时,不调用分析函数见这里。

如果我想分析所有实际执行的指令,我应该选择哪两个?

我假设INS_InsertPredicatedCall但我不确定,因为我见过INS_InsertCall更多。但是为什么有人会使用它,即为什么有人要分析指令

当谓词为假时被谓词

? 也许这两个函数如何导致不同结果的最小示例在这里会有所帮助......

1个回答

你是对的,我们应该在你的情况下使用INS_InsertPredicatedCall而不是INS_InsertCall区分一个和另一个非常直观,请考虑以下代码

cond:
  xor eax, eax
  mov edx, 0x1
  cmp word [esp + 0x4], 0x5
  cmovz eax, edx
  ret

谁的C代码很喜欢

int cond(int input)
{
  return input == 0x5 ? 1 : 0;
}

如果您使用INS_InsertCall跟踪执行的指令cond(input),那么对于任何价值input,你观察总是跟踪:

xor eax, eax
mov edx, 0x1
cmp word [esp + 0x4], 0x5
cmovz eax, edx
ret

但是如果你使用INS_InsertPredicateCall, 那么 for input != 0x5,你只会观察到:

xor eax, eax
mov edx, 0x1
cmp word [esp + 0x4], 0x5
ret

由于cmovz是谓词指令,因此仅当 时才执行ZF = 1