【问题标题】:Intel Pin call a function in the application programIntel Pin 调用应用程序中的函数
【发布时间】:2018-04-22 16:31:06
【问题描述】:

我正在使用 Intel 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");
}

我在 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 时,我遇到了分段错误。 Image 例程是检查特定函数调用的正确方法吗?我也可以使用其地址直接从应用程序访问功能吗?我通过其他方式获得了函数的地址,它是有效的,所以这不是问题。由于 Pin 在运行时修改了代码,而这个 pintool 只是修改了指令流,并且在某种情况下,我应该能够跳转到一个有效的地址。有什么想法我哪里出错了吗?

【问题讨论】:

  • C != C++。仅使用您正在使用的语言进行标记,除非两者确实相关。
  • 我对 pin 不熟悉,所以这只是在黑暗中刺伤:检查 RTN_xxx 和其他系统类似函数 PIN_xxx IMG_xxx 函数是否返回代码失败。很可能如果其中一个失败了,那么事情就无法顺利进行。
  • @tambre 应用程序是 C 语言,而 pintool 是 C++

标签: c++ c intel-pin


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-01-04
    • 2019-08-25
    • 2018-04-03
    • 2011-12-15
    • 2018-08-08
    • 2014-04-04
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多