Intel Pin调用应用程序中的函数

Intel Pin call a function in the application program

本文关键字:函数 应用程序 Pin 调用 Intel      更新时间:2023-10-16

我正在使用"英特尔引脚"工具对我的应用程序进行一些分析。我有一个插入例程和一个信号处理程序,它在应用程序中进行一些分析,然后根据一些条件调用应用程序中的函数来更新一些值。

我的应用程序是用C编写的,如下所示-

int pin_flag; //global variable in the C program
void access_from_pin()
{
pin_flag = 1;
}
void Check() //empty function in C
{
}
int main()
{
while(!pin_flag)
{
Check();
}
printf("Pin has changed the flag");
}

我在C++中的Pintool如下-

VOID check_routine(THREADID tid, ADDRINT ret)
{
ADDRINT *addr = ; //hardcode address of the function access_from_pin
((void(*)(void))addr)();
}
VOID Image(IMG img, VOID *v)
{
RTN check_call = RTN_FindByName(img, "Check");
if (RTN_Valid(check_call))
{
RTN_Open(check_call);
RTN_InsertCall(check_call, IPOINT_AFTER, (AFUNPTR)check_routine,IARG_THREAD_ID,IARG_END);
RTN_Close(check_call);
}
}
int main(int argc, char *argv[])
{
PIN_InitSymbols();
if (PIN_Init(argc, argv)) 
return Usage();
/* Image Instrumentation function*/
IMG_AddInstrumentFunction(Image, 0);
PIN_StartProgram();    
return 0;
}

当我用应用程序作为C程序运行pintool时,我会遇到分段错误。图像例程是检查特定函数调用的正确方法吗?我还可以使用应用程序的地址直接访问函数吗?我通过其他方式获得函数的地址,它是有效的,所以这不是问题所在。由于Pin在运行时修改代码,而这个pintool只是修改指令流,在特定条件下,我应该能够跳转到有效地址。你知道我哪里错了吗?

必须使用PIN_CallApplicationFunction API以实际工作的方式调用应用程序中的函数。