在Intel Pin中,您可以使用IARG_RETURN_IP
作为RTN_InsertCall
的参数之一来获取例行调用的返回地址。
我希望对系统调用执行相同操作,使用PIN_AddSyscallEntryFunction
和PIN_AddSyscallExitFunction
进行检测。
所以一开始我考虑在调用之后获取指令指针的值
函数中的ADDRINT returnIp = PIN_GetContextReg(ctx, REG_INST_PTR);
作为参数传递给PIN_AddSyscallExitFunction
。
但是,我注意到,如果我以相同的方式得到REG_INST_POINTER
的值,但是在执行系统调用之前的这一次,我总是得到指令指针的两个值。
例如,我之前总是会得到2003266482,之后会得到2003266484。
所以我想知道为什么会这样,如果我做错了什么。
答案 0 :(得分:1)
这与在libc中执行系统调用的方式有关,有一个程序集存根实际上需要做什么来将控制从内核传递回内核,所有系统调用都会通过。