【发布时间】: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很可能是链接器添加的“启动”函数,操作系统真正开始执行程序的地方。如果要使用符号,则需要将这些符号保留在生成的可执行程序映像文件中。如果您从文件中删除所有符号,那么您根本无法使用处理符号的函数。