IDA脚本无法在ARM二进制文件中找到入口点
我有一个python脚本,它在目标目录中的任何二进制文件上调用一个ida脚本。 ida脚本找到beginEA(),然后迭代以输出二进制文件中每个函数的.gdl文件,其中每个gdl都包含该函数的基本块。 我正在处理的体系结构是arm,mips和x86。 直到最近我一直在测试其他团队提供的二进制文件。 他们如何编制他们的详细信息是我们不知道的ATM,但我正在寻求解决。 当我自己编译二进制文件并将它们提供给我的ida脚本时,对于mips和x86完全适用,但不适用于ARM。
我一直在测试一个简单的helloworld.c。 对于x86,我使用简单的gcc helloworld.c和mips-linux-gnu-gcc hw.c进行编译。对于arm,我尝试了所有可以在Ubuntu的repo中找到的gcc变体。 这是我当前的.idc
#include <idc.idc>
static main()
{
Wait();
auto currAddr, func, endSeg, funcName, counter, gdlPath, funcPath, funcStart, funcEnd;
auto log_path, logfile;
log_path=sprintf("/home/fury/Desktop/%s_log.txt",GetInputFile());
logfile=fopen(log_path,"w");
gdlPath = GetIdbPath();
gdlPath = substr(gdlPath,0,strlen(gdlPath)-4);
currAddr = BeginEA();
func = SegStart(currAddr);
endSeg = SegEnd(currAddr);
fprintf(logfile,"currAddr=%dn",currAddr);
fprintf(logfile,"func=%dn",func);
fprintf(logfile,"endSeg=%dn",endSeg);
counter = 0;
while (func != BADADDR && func < endSeg){
funcName = GetFunctionName(func);
if (funcName != "") {
funcStart = GetFunctionAttr(func, FUNCATTR_START);
funcEnd = GetFunctionAttr(func, FUNCATTR_END);
++counter;
funcPath = gdlPath+"@"+funcName+".gdl";
GenFuncGdl(funcPath, funcName, func, BADADDR, CHART_PRINT_NAMES|CHART_GEN_GDL);
}
func = NextFunction(func);
}
fprintf(logfile,"%d gdl's created for %sn",counter,GetInputFile());
fclose(logfile);
Exit(0);
}
行currAddr = BeginEA()是行为开始与ARM输入发生分歧的地方。 这启动了触发func和endseg的连锁反应,导致while循环从不执行。 这里是证明这一点的简单日志。 通常我们看到如下地址:
currAddr=134513424
func=134513424
endSeg=134513858
9 gdl's created for x86_@NAME:addition
但是对于ARM二进制文件,我得到了-1,这是BADADDR的IDA常量。
currAddr=-1
func=-1
endSeg=-1
0 gdl's created for arm-linux-gnueabi-gcc_@NAME:addition
我还应该提到,如果我使用GUI打开这些ARM二进制文件,我可以手动生成gdl而不会出现问题,但我确实需要将其自动化。 如果我在ida gui中打开一个x86和arm二进制文件,对于我相对比较业余的人来说,它们看起来是一样的。 因为我对编译器和逆向的知识通常很差,所以我希望我忽略了一些简单的东西。 另外,我需要命令行适用的解决方案,因为这意味着要一次处理1000个文件。 我尝试了所有我能想到的,如果可能,请协助。
更新:我结束了切换装置,并使用Objdump与调试信息和自己构建基本块,但现在我面临必须手动编译整个数据集与调试信息,如果我无法解决IDA问题。
链接地址: http://www.djcxy.com/p/70405.html