未知文件格式的图像库?

逆向工程 艾达 固件
2021-07-10 01:13:45

作为初学者,我正在尝试使用 IDA Pro 加载未知格式的二进制文件,但我不知道该文件的 Image Base。有什么方法可以获取Image Base。您能否在答案中也参考相关论文。

2个回答

我在这里为 Cortex M3 MCU 写了一些东西:http : //www.reddit.com/r/ReverseEngineering/comments/21kgtc/beginners_project_logitech_g940_firmware/cgeokv3

由于您没有写任何关于您的 blob 所使用的设备以及它是如何到达那里的,我们无法得出任何结论。

但是你真的需要知道你有哪个 CPU,闪存在哪里,向量表如何在这个特定模型上工作以确定某些东西。

一些 MCU 在闪存的开头有一个引导加载程序,用户代码从它开始,其他 MCU 在闪存的上部区域有引导加载程序,用户代码从前面开始。

一种可能的方法是,如果存在字符串表和指向这些字符串的指针表,则将 bin 加载到 IDA 零处并找到字符串,然后编写一个程序来搜索二进制文件,寻找与开头的差异匹配的 int32 差异每个字符串。

我搜索了大/小端格式的字节/字/整数,一旦找到匹配项,就可以根据与搜索地址和结果地址/指针表的差异计算正确的基数。

这是我使用的 C# 代码

static void SearchDumpsForIntDiff(string filename, params int[] dcode)
{
    var sw = new StreamWriter(File.Open(filename + "status.txt", FileMode.Create, FileAccess.Write, FileShare.ReadWrite));

    byte[] data = File.ReadAllBytes(filename);

    if (data.Length == 0) return;

    int dl = dcode.Length;
    for(int loc = 0; loc < (data.Length - (dcode.Length*4)); loc++)     
    {
        for(int off = 0; off < (dcode.Length-1); off++)
        {
            int t1 = dcode[off];
            int t2 = dcode[off + 1];
            int d1 = (t2 - t1)/8;
            int v1 = (int)ReadUint32(data, loc + ((off + 0) * 4));
            int v2 = (int)ReadUint32(data, loc + ((off + 1) * 4));

            int d2 = v2 - v1; 

            if( d1 != d2 )
                break;

            if( off == (dcode.Length-2))
            {                            
                sw.WriteLine("Match at {0:X8}",  loc);
                Console.WriteLine("Match at {0:X8}",  loc);
            }
        }

    }

    sw.Close();
    sw.Dispose();
}

我用过的

SearchDumpsForIntDiff(@"Nikon\D7000Update\b750103a.bin", 0x79DF9A, 0x79DFB2, 0x79DFBA, 0x79DFC2);