我正在尝试编写一个pintool来分析应用程序中memcmp和strcmp的返回值。首先,我编写了一个例程跟踪工具,它列出了执行的所有例程。我的示例代码非常简单,只是使用memcmp
将固定字符串与用户提供的字符串进行比较。然而,我注意到我的pintool从来没有报告memcmp
。我也尝试了strcmp
,也有同样的问题。
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 -- %sn", img_name, sec_name, rtn_name);
}
}
}
打印出许多例程,如stat
,mkdir
,memcpy
等…但没有memcmp
或strcmp
!有人知道这是怎么回事吗?
您应该使用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;
}
print memcmp &比较字符串