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

上一篇: IDA Script failing to find entry point in ARM binaries

下一篇: Armv5l Cross compiling static file size differences