C++ 英特尔Pin调用应用程序中的函数

C++ 英特尔Pin调用应用程序中的函数,c++,c,intel-pin,C++,C,Intel Pin,我正在使用英特尔Pin工具对我的应用程序进行一些分析。我有一个插装例程和一个信号处理程序,它在应用程序中进行一些分析,然后根据一些条件调用应用程序中的函数来更新一些值 我的应用程序是用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(

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

我的应用程序是用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");
}
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++中的Pin工具如下:

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");
}
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来调用应用程序中的函数,使其实际工作。

C!=C++。只使用您正在使用的语言进行标记,除非两者都是相关的。我不熟悉pin,所以这只是一个暗中操作:检查RTN_xxx和其他类似系统的函数pin_xxx IMG_xxx函数是否返回代码失败。如果C++中的一个失败了,那么事情就不会继续进行下去。