解密固件:它是否有真正的“格式”,它与解密其他文件有何不同?

逆向工程 二元分析 固件 解密
2021-07-01 22:39:22

我有一个系统的固件,我试图解密其中的一些只是为了看看它的全部功能;没有任何违法或类似的事情,例如复制解密的副本等等。

但由于以下几个原因,这似乎很难:

1.可能没有特定的格式或方式将其与其他二进制文件区分开来;

2.可能不知道是怎么加密的;

3.可能不会“正常”加密,可能会特别加密。

问题是,该文件有一些未加密的代码,但我不能 100% 确定它可以代表什么样的操作码字节,因为它

这是一个全 ARM 驱动的设备的固件,但我没有公开说它的名字。这是否意味着它的固件将是 ARM ISA/操作码的某种变体(因为它是 ARM 处理器的机器代码)?如果是这样,我应该从哪里开始解密,如果可能的话,我应该继续确定什么版本的 ARM、ISA(指令集 = 架构)等?

固件在文件的开头有一个幻数(它只是说公司的名字),但之后它有未加密的字节,然后是更多的幻数,然后是加密的字节,然后是更多的幻数,然后是更多的未加密字节,等等。等。您可以区分加密的部分,因为每个字节都有一个完全无意义的 ASCII 字符,文件的其他部分没有,并且它们在后面的段中。这清楚地表明这些是不规则的加密字节范围。

1个回答

哇识别固件格式

  1. 在过去,使用 Intel HEX 和 bin Flash 内存转储

    固件通常由硬件程序员为特定IC或由ISP复制到设备HEX是非常具体的Intel_HEX (*.hex)文本文件,易于识别。另一方面,很难识别BIN转储。如果您可以在里面看到任何令牌或可以反汇编它并且代码有意义,那么它可能是一个二进制内存转储。如果它被加密,你就不走运了。

  2. elf 或 obj 格式

    这些是类似于PE 的较新的对象格式十六进制视图中的ELF如下所示:

    7f 45 4c 46 01 02 01 00 | 00 00 00 00 00 00 00 00 | .ELF...
    

    OBJ非常依赖于目标平台,如果它来自 Intel、MS 或 Linux,...

  3. 文件系统转储

    一些设备实现了自己的编程接口,并使用固件作为磁盘映像,因此文件是某个FileSystem 的转储,其中固件作为某个文件写入您必须识别FileFormat类型(通常通过引导扇区第一个512字节)。然后解压里面的文件,从头开始。如果您使用USB密钥并将文件系统转储以 1:1 的比例写入其中,然后尝试从支持各种文件格式的操作系统访问它,有时会有所帮助。您还可以使用一些 HDD 实用程序,如 PQ-magic 或任何能够识别 FS 类型的工具。

  4. 解密

    您需要使用IC 的反汇编程序,甚至更好的模拟器/仿真器,某些设备SDK也包含模拟,因此请尝试将固件加载到其内存中并尝试运行它以测试它是否执行了有意义的操作。对于反汇编,您也需要分析代码以查看...

[笔记]

您应该至少发布文件扩展名和文件开头的十六进制视图

[编辑 1] 对推荐的回应 + 一些附加信息

是否完全从头开始文本?

所以它仍然可以是: - bin memory dump - 任何打包/编码的东西(甚至是特定的文件系统)

  1. 识别打包/编码结构

    尝试在里面找到像RIFF (*.avi) 格式的块。请注意,可能没有ID字符串。您基本上是在文件中寻找十六进制编码的长度或偏移量,这些长度或偏移量将加起来为文件大小或下一个块结构,其长度为特定块偏移量或分离表中的长度。别忘了它可以是展位的LSB 或 MSB首先不要假设任何事情。长度/偏移量通常是编码16/32/64位 ( 2/4/8BYTE) 还尝试找到重复模式(如果存在某种类型的块头)

  2. 识别文件系统

    一些FS在某个偏移处有特定的ID,所以寻找那个(比如FAT32,...)。大多数FS使用FAT+DIR表,因此请查找如下内容:

    MDOS 目录示例

    这就是DIR表在MDOS文件系统中的样子它是一种保存光盘所有文件/目录的结构。每个文件都应该有编码名称、类型(扩展名)、起始扇区、长度。

    • E5 hex = 229 dec 通常标记空闲目录空间(在许多 FS 系统中)

    所以如果你知道目标系统中应该存在的任何文件名,你可以寻找它来定位DIR表......

    MDOS FAT 示例

    这就是FAT表在MDOS中的样子FAT持有约光盘的每个扇区/群集信息。在这种情况下它是 12 位所以每个值是 1.5 字节长!!!某些值将扇区标记为系统/保留(不可用)、坏、空闲或如果存在任何其他值,则它是下一个扇区的索引,该索引与链表中的此相关联。解码时请记住字节顺序可能很小或很大

  3. 识别 bin 内存转储

    在这种情况下,该文件是您的 arm操作系统的内存转储这意味着您应该查找程序的特定部分,例如:

    • 中断表
    • 特定的程序令牌(它打印出来的东西......)
    • 图形

    最后两个非常简单,所以我只会为中断添加信息。大多数处理器上的中断在内存中都有固定的位置,因此对于每个中断,保留的字节很少。在这个地方通常存在一些跳转指令,跳转应该导致中断处理程序例程应该以中断指令的特定结束结束,例如:retiretn或者通过设置/重置特定寄存器来标记中断被处理......

    因此,在 bin 内寻找紧密包装的跳转指令,如果找到,请检查它们的计数和距离是否与CPU数据表匹配您还可以检查跳转地址附近的某处是否从存在的中断中返回。如果是,那么您拥有所需的一切。中断表的偏移量通常是固定的......所以你应该很容易找到目标设备内存映射中 bin dump 从哪里开始。

    当心你的 bin 可能有像 Intel hex 文件一样的偏移编码