使用Intel Pin时,CALL和RET指令跟踪不匹配的数量

时间:2015-04-18 02:28:40

标签: c++ x86 x86-64 instructions intel-pin

我正在尝试使用Intel Pintool来监控x86-64计算机(Mac Pro)上的CALLRET指令。我将IARG_INST_PTR(下面提到的)传递给docount函数并使用指令指针我通过检查操作码推导出指令(CALL是0xe8和{{1}来自Intel x86-64 manual的是0xc3。但是,看起来这个检查并不完全准确,因为对于任何使用此逻辑的二进制文件,我注意到RETRET更多。

CALL

有人可以给我一些关于我做错了什么的指示吗?

我借用了INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_CONTEXT, IARG_INST_PTR, IARG_END); 的模板。要找到它,请搜索文件名here

2 个答案:

答案 0 :(得分:0)

CALL的各种版本都有不同的操作码,所以你不能只检查0xE8。完整列表可在英特尔手册中找到,呼叫程序部分:

E8 cw
E8 cd
FF /2
FF /2
FF /2
9A cd
9A cp
FF /3
FF /3
REX.W + FF /3

RET

相同
C3
CB
C2 iw
CA iw

答案 1 :(得分:0)

调用和ret指令之间并不总是匹配,因为函数可以被异常,goto-like语句,longjumps,signal等等中断...所以如果你想重新调和调用和ret,你可能会我想考虑所有这些。

已经多次讨论过,特别是here