使用"英特尔引脚"时跟踪不匹配的CALL和RET指令数

Number of CALL and RET instructions tracking mismatch while using Intel Pin

本文关键字:quot CALL RET 指令 跟踪 英特尔 引脚 使用 不匹配      更新时间:2023-10-16

我正在尝试使用Intel Pintool监视x86-64机器(Mac Pro)上的CALLRET指令。我将IARG_INST_PTR(如下所述)传递给docount函数,并使用指令指针通过检查操作码(英特尔x86-64手册中的CALL是0xe8,RET是0xc3)来推断指令。然而,这种检查似乎并不完全准确,因为我注意到,对于任何装有此逻辑的给定二进制文件,RET的数量都比CALL多。

INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_CONTEXT,
IARG_INST_PTR, IARG_END);

有人能告诉我我做错了什么吗?

我从/tools/ManualExamples/inscount0.cpp那里借了这个模板。要找到它,请在此处搜索文件名。

调用和ret指令之间并不总是匹配的,因为函数可能会被异常、类似goto的语句、长跳转、信号等中断。因此,如果您想重新协调调用和ret,您可能需要考虑所有这些。

这已经讨论了好几次了,尤其是

有各种版本的CALL具有不同的操作码,因此您不能只检查0xE8。完整列表可在英特尔手册调用过程部分找到:

操作码指令说明E8 cwCALL rel16调用相对于下一条指令的近、相对、位移E8 cd调用相对下一条命令的近、相对于、位移在64位模式下扩展到64位的32位位移符号。FF/2CALL r/m16调用r/m16中给定的近距离、绝对间接地址。FF/2CALL r/m32调用r/m32中给定的远距离、绝对直接地址9A cpCALL ptr16:32调用操作数中给定的远绝对地址FF/3CALL m16:16调用m16:16中给定的远绝对间接地址。在32位模式下:如果选择器指向一个门,则RIP=从门获取的32位零扩展位移;其他的RIP=从远指针开始的零扩展16位偏移在说明书中引用FF/3调用m16:32在64位模式中:如果选择器指向一个门,则RIP=取自闸门的64位位移;其他的RIP=从远指针开始的零扩展32位偏移在说明书中引用REX。W FF/3调用m16:64在64位模式中:如果选择器指向一个门,则RIP=取自闸门的64位位移;其他的RIP=距远指针的64位偏移在说明书中引用

RET相同

Opcode*指令说明C3RET接近返回调用过程CBRET远返回调用过程C2 iwRET imm16接近返回调用过程并从堆栈中弹出imm16字节CA iwRET imm16远返回调用过程并从堆栈中弹出imm16字节

注意,上面包含相同操作码的行仅用于不同的模式(16/32/64位)