我正在尝试使用Intel Pintool来监控x86-64计算机(Mac Pro)上的CALL
和RET
指令。我将IARG_INST_PTR
(下面提到的)传递给docount
函数并使用指令指针我通过检查操作码推导出指令(CALL
是0xe8和{{1}来自Intel x86-64 manual的是0xc3。但是,看起来这个检查并不完全准确,因为对于任何使用此逻辑的二进制文件,我注意到RET
比RET
更多。
CALL
有人可以给我一些关于我做错了什么的指示吗?
我借用了INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_CONTEXT,
IARG_INST_PTR, IARG_END);
的模板。要找到它,请搜索文件名here。
答案 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