如何用pintool找到main函数

2023-12-02

我是编写 pintool 程序的新手。我想用PIN找到目标程序的主要功能。但我总是只得到一个UnNamedImageEntryPoint使用 SYM_Name() 和 RTN_Name。我猜是缺少符号造成的。那么在没有符号的情况下有什么解决方案可以让我找到 main 函数吗? 这是我的主要功能:

int main(int argc, char *argv[]) {
    PIN_InitSymbols();
    init_all();
    if (PIN_Init(argc, argv)) return Usage();
    INS_AddInstrumentFunction(Instructions, 0);
    IMG_AddInstrumentFunction(ImageLoad, 0);
    PIN_AddFiniFunction(Fini, 0);
    PIN_StartProgram();
    return 0;
}

这就是我寻找主要功能的方式:

VOID ImageLoad(IMG img, VOID *v) {
    if (IMG_IsMainExecutable(img)) {
        for (SYM sym = IMG_RegsymHead(img); SYM_Valid(sym); sym = SYM_Next(sym)) {
            string undFuncName = PIN_UndecorateSymbolName(SYM_Name(sym), UNDECORATION_NAME_ONLY);
            output<<undFuncName<<endl;
            if (undFuncName == "main") {
                RTN_InsertCall(rtn, IPOINT_BEFORE,(AFUNPTR)onMainStarted, IARG_END);
            }
        }
    }
}

这就是我得到的所有 undFuncName 。

unnamedImageEntryPoint
.text

以下代码对我来说工作正常:

VOID ImageLoad(IMG img, VOID *v) {
  RTN mainRtn = RTN_FindByName(img, "main");
  if (RTN_Valid(mainRtn)){
    // ....... YOUR CODE
  }
}
// Another way:
VOID ImageLoad(IMG img, VOID *v) {
  for (SEC sec = IMG_SecHead(img); SEC_Valid(sec); sec = SEC_Next(sec)) {
   for (RTN rtn = SEC_RtnHead(sec); RTN_Valid(rtn); rtn = RTN_Next(rtn)) {
    if (RTN_Valid(rtn)){
    // ....... YOUR CODE
    // YOU CAN SEARCH FOR YOUR ROUTINE HERE
    }
   }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用pintool找到main函数 的相关文章

随机推荐