【问题标题】:How to find main function with pintool如何使用 pintool 找到主要功能
【发布时间】:2020-07-05 15:27:31
【问题描述】:

我是编写 pintool 程序的新手。我想用 PIN 找到目标程序的主要功能。但我总是得到一个带有 SYM_Name() 和 RTN_Name 的UnNamedImageEntryPoint。我猜是缺少符号导致了这种情况。那么当没有符号时,我有什么解决方案可以找到主要功能吗? 这是我的主要功能:

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

【问题讨论】:

  • 编译器完成后,main 函数就没有什么特别之处了。它和其他任何功能一样。一旦链接器完成并添加了实际调用main 的代码,就没有什么可以将它与其他函数区分开来了。
  • 但是我们可以在IDA pro的大多数程序中找到main函数。我认为必须有办法使用 PIN 码。
  • 您可以很容易地找到执行实际开始的“开始”函数。然后使用推导可能会找到一个可能是main 函数的函数的跳转。
  • 问题是我在带有 PIN 码的程序中找不到任何功能。当我找到RTN_Name()SYM_Name() 的函数时,我只得到了unnamedImageEntryPoint.text。在正常情况下,我可以通过这种方式获取所有函数名称。好吧,我知道可执行文件中没有名称,但至少我想找到更多的功能,而不仅仅是一个unnamedImageEntryPoint
  • unnamedImageEntryPoint 很可能是链接器添加的“启动”函数,操作系统真正开始执行程序的地方。如果要使用符号,则需要将这些符号保留在生成的可执行程序映像文件中。如果您从文件中删除所有符号,那么您根本无法使用处理符号的函数。

标签: c++ intel-pin


【解决方案1】:

以下代码适用于我:

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
    }
   }
  }
}

【讨论】:

  • 感谢您的回答。但是当目标 IMG 在没有调试信息的情况下编译时,这将不起作用。
猜你喜欢
  • 2015-03-17
  • 1970-01-01
  • 2020-03-22
  • 2011-06-18
  • 1970-01-01
  • 2016-09-16
  • 2012-07-18
  • 2011-02-07
  • 1970-01-01
相关资源
最近更新 更多