如何区分不同系列微控制器的不同hex文件?

逆向工程 反编译 C 十六进制
2021-06-30 07:05:13

有什么办法可以区分不同微控制器的十六进制文件吗?我有一个十六进制文件,现在我忘记了它属于哪个微控制器。有没有可用的工具来说明这一点?或任何提示或技巧要知道?

编辑: 有一个类似的问题在这里,但这个问题专门属于PIC系列,而我什么,如果我们从不同的家庭像AVR,8051,PIC等来区分

3个回答

我的第一个想法是对对齐的字节进行频率分析。对于大多数汇编语言,最相关的字节在最高有效位上对齐。

因此,创建一个可以识别 asm 类型的标识符可能很容易。但是,令人惊讶的是,经过几次谷歌搜索后,我没有找到任何关于此的工具或论文......

也许这里有事可做。

我不知道为此设计的工具。在实践中,将其加载到具有不同架构的 IDA(或任何其他反汇编程序)中直到看起来正确可能是最简单的方法。您也许可以编写一个脚本来自动执行此操作。

如果你想构建自己的工具,我建议你看看Christopher Domas 的演讲“RE 动态二进制可视化的未来”它讨论了许多可用于分析未知数据的技术。大意图描绘了每个文件中每组两个或三个字节的频率。不同架构之间的图明显不同,可用于自动识别数据类型。实际的工具和您需要的数据集不是公开可用的,但如果我想进行自动架构检测,我会采用这种方式。

一种更简单的方法是在不同架构中搜索函数序言模式。虽然实现更简单,但准备数据集需要更多的人工时间(因为识别功能序言不能自动化)。某些处理器可能不够强大,无法运行 C 代码,如果未编译代码,则可能没有可预测的函数序言。您或许能够找到其他可以搜索的常见操作。

尝试了解它可以针对哪些类型的 CPU。您可能还可以通过查看此文件来猜测 CPU 的位长(file_size % 32 == 0?大概是 32 位)。一旦你有了一个简单的列表,通过一些反汇编程序运行二进制文件,看看代码是否有意义。尝试在一些模拟 CPU 中运行它,看看它是否有任何作用。

另外,请记住,无效指令可能并不意味着您使用了错误的 CPU,它可能只是数据或其他东西。实际上可能值得检查文件以查看是否找不到任何字符串或任何内容,以便更好地了解事物的位置。