我是编写 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(使用前将#替换为@)