Intel Pin 无法检测到 memcmp 或 strcmp

Intel Pin cannot detect memcmp or strcmp

我正在尝试编写一个分析应用程序中 memcmp 和 strcmp 的 return 值的 pintool。首先,我编写了一个例程跟踪 pintool,其中列出了所有已执行的例程。我的示例代码非常简单,仅使用 memcmp 将固定字符串与用户提供的字符串进行比较。但是,我注意到我的 pintool 从未报告 memcmp。我也尝试了 strcmp 并遇到了同样的问题。

这里是事情变得奇怪的地方。作为健全性检查,我写了另一个 pintool,据说可以打印每张图像中的每个例程,即使是那些未执行的例程。这是图像检测的代码:

VOID Image(IMG img, VOID* v)
{
    const char* img_name = IMG_Name(img).c_str();

    for(SEC sec = IMG_SecHead(img); SEC_Valid(sec); sec = SEC_Next(sec))
    {
        const char* sec_name = SEC_Name(sec).c_str();

        for(RTN rtn = SEC_RtnHead(sec); RTN_Valid(rtn); rtn = RTN_Next(rtn))
        {
            const char* rtn_name = RTN_Name(rtn).c_str();
            
            printf("%s -- %s -- %s\n", img_name, sec_name, rtn_name);
        }
    }
}

这会打印出很多例程,例如 statmkdirmemcpy 等...但没有 memcmpstrcmp!有人知道这里发生了什么吗?

您应该使用 IFUNC_SYMBOLS 初始化 pintools(请参阅文档 SYMBOL_INFO_MODE):

将您的代码用于:

int main(INT32 argc, CHAR* argv[])
{
    if (PIN_Init(argc, argv)) return 0;
    PIN_InitSymbolsAlt(SYMBOL_INFO_MODE(UINT32(IFUNC_SYMBOLS) | UINT32(DEBUG_OR_EXPORT_SYMBOLS)));
    IMG_AddInstrumentFunction(Image, 0);
    PIN_StartProgram();    
    return 0;
}

打印 memcmp & strcmp