Intel Pin:如何获取系统调用的return地址
Intel Pin: how to obtain return address of system call
在 Intel Pin 中,您可以使用 IARG_RETURN_IP
作为 RTN_InsertCall
.
的参数之一获取例程调用的 return 地址
我想对系统调用做同样的事情,使用 PIN_AddSyscallEntryFunction
和 PIN_AddSyscallExitFunction
进行检测。
所以一开始我想的是在调用之后获取指令指针的值使用
ADDRINT returnIp = PIN_GetContextReg(ctx, REG_INST_PTR);
在作为参数传递给 PIN_AddSyscallExitFunction
的函数中。
但是,我注意到,如果我以相同的方式获取 REG_INST_POINTER
的值,但这次是在执行系统调用之前,我总是会为指令指针获取相同的两个值。
例如,我总是在之前得到 2003266482,在之后得到 2003266484。
所以我想知道为什么会这样,是否我做错了什么。
这与系统调用在 libc 中的执行方式有关,有一个程序集存根实际上执行将控制权从内核传递和返回内核所需的操作,所有系统调用都经过该程序。
在 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。
所以我想知道为什么会这样,是否我做错了什么。
这与系统调用在 libc 中的执行方式有关,有一个程序集存根实际上执行将控制权从内核传递和返回内核所需的操作,所有系统调用都经过该程序。