如何从 .bin 确定平台?

逆向工程 拆卸
2021-06-27 18:53:44

我有一个 android 应用程序 (com.daye.dayeapp) 来控制我的机器人割草机。该应用程序在 assets 文件夹中包含新固件,格式为 122KB .bin 文件。我如何确定它的架构?binwalk 没有帮助。

我的反编译/黑客经验很旧。Z80 和 68k 系列 CPU。旧的英特尔前 MacOS。在过去删除了许多复制保护。

查看字符串的输出,它包含大量未加密的数据。有些地方显然有 '\0' 终止的字符串。

BinWalk 有一些熵指示某些部分。但这很可能是误报。至少最后一个。

除了打开它并尝试从芯片中识别架构之外,还有其他方法吗?

它确实有传感器、液晶显示器、按钮、蓝牙模块。所以它确实有一些 I/O 端口。如果我能找到一些 JTAG 头,我可能会尝试读取原始固件。

DECIMAL       HEXADECIMAL     ENTROPY
--------------------------------------------------------------------------------
0             0x0             Falling entropy edge (0.711720)
120832        0x1D800         Falling entropy edge (0.843220)
123904        0x1E400         Falling entropy edge (0.842013)

0x0001E3B0  20 20 16 4C 06 4D 6F 77 65 72 31 23 0D 16 00 1B |...L.Mower1#....|
0x0001E3C0  12 33 01 A1 21 69 66 A0 0D 32 30 31 37 30 38 32 |.3..!if..2017082|
0x0001E3D0  33 32 33 34 35 74 A0 04 31 30 31 01 42 32 07 42 |32345t..101.B2.B|
0x0001E3E0  33 07 42 34 07 42 35 07 32 36 2A 0C 1D 6C 23 2A |3.B4.B5.26*..l#*|
0x0001E3F0  38 3F 54 5B 69 4D 6F 6E 54 75 65 57 65 64 54 68 |8?T[iMonTueWedTh|
0x0001E400  75 46 72 69 53 61 74 53 75 6E 6C 14 92 11 E3 0D |uFriSatSunl.....|
0x0001E410  2F 41 03 02 3D 2A 01 0D 11 6C 16 0D B4 21 24 1C |/A..=*...l...!$.|
0x0001E420  05 0F 54 24 54 21 24 1E 2E C6 23 1E 2E F6 17 1C |..T$T!$...#.....|

\0 终止的字符串(以 CRLF 行结尾!?):

0x0000A270  A0 24 00 20 A4 24 00 20 A8 24 00 20 43 4F 4C 4C |.$...$...$..COLL|
0x0000A280  49 53 49 4F 4E 20 72 65 74 75 72 6E 20 0D 0A 0D |ISION.return....|
0x0000A290  0A 20 00 00 54 49 4C 54 20 72 65 74 75 72 6E 20 |....TILT.return.|
0x0000A2A0  0D 0A 0D 0A 20 00 00 00 AC 00 00 20 AD 00 00 20 |................|
0x0000A2B0  AC 24 00 20 4F 55 54 20 42 4F 55 4E 44 41 52 59 |.$..OUT.BOUNDARY|
0x0000A2C0  20 72 65 74 75 72 6E 20 0D 0A 0D 0A 20 00 00 00 |.return.........|

和文件的开头。看起来很奇怪?一些跳表?

0x00000000  B0 73 00 20 55 11 01 08 39 11 01 08 3B 11 01 08 |.s..U...9...;...|
0x00000010  3F 11 01 08 43 11 01 08 47 11 01 08 00 00 00 00 |?...C...G.......|
0x00000020  00 00 00 00 00 00 00 00 00 00 00 00 4B 11 01 08 |............K...|
0x00000030  4D 11 01 08 00 00 00 00 4F 11 01 08 51 11 01 08 |M.......O...Q...|
0x00000040  6F 11 01 08 6F 11 01 08 6F 11 01 08 E9 53 01 08 |o...o...o....S..|
0x00000050  6F 11 01 08 6F 11 01 08 1F 4F 01 08 6F 11 01 08 |o...o....O..o...|
0x00000060  6F 11 01 08 6F 11 01 08 6F 11 01 08 6F 11 01 08 |o...o...o...o...|
0x00000070  6F 11 01 08 6F 11 01 08 6F 11 01 08 6F 11 01 08 |o...o...o...o...|
0x00000080  6F 11 01 08 6F 11 01 08 6F 11 01 08 6F 11 01 08 |o...o...o...o...|
0x00000090  6F 11 01 08 6F 11 01 08 6F 11 01 08 91 43 01 08 |o...o...o....C..|
0x000000A0  6F 11 01 08 6F 11 01 08 6F 11 01 08 6F 11 01 08 |o...o...o...o...|
0x000000B0  FD 0B 02 08 01 4B 01 08 6F 11 01 08 6F 11 01 08 |.....K..o...o...|
0x000000C0  6F 11 01 08 6F 11 01 08 6F 11 01 08 6F 11 01 08 |o...o...o...o...|
0x000000D0  6F 11 01 08 3F 68 02 08 6F 11 01 08 6F 11 01 08 |o...?h..o...o...|
0x000000E0  6F 11 01 08 6F 11 01 08 6F 11 01 08 6F 11 01 08 |o...o...o...o...|
0x000000F0  6F 11 01 08 6F 11 01 08 6F 11 01 08 6F 11 01 08 |o...o...o...o...|
0x00000100  6F 11 01 08 6F 11 01 08 6F 11 01 08 6F 11 01 08 |o...o...o...o...|
0x00000110  A7 59 01 08 6D 5B 01 08 73 08 02 08 6F 11 01 08 |.Y..m[..s...o...|
0x00000120  6F 11 01 08 6F 11 01 08 6F 11 01 08 6F 11 01 08 |o...o...o...o...|
0x00000130  00 F0 02 F8 00 F0 66 F8 0A A0 90 E8 00 0C 82 44 |......f........D|
0x00000140  83 44 AA F1 01 07 DA 45 01 D1 00 F0 5B F8 AF F2 |.D.....E....[...|
0x00000150  09 0E BA E8 0F 00 13 F0 01 0F 18 BF FB 1A 43 F0 |..............C.|
0x00000160  01 03 18 47 4C D6 01 00 6C D6 01 00 10 F8 01 3B |...GL...l......;|
0x00000170  0A 44 13 F0 03 04 08 BF 10 F8 01 4B 1D 11 08 BF |.D.........K....|
0x00000180  10 F8 01 5B 64 1E 05 D0 10 F8 01 6B 64 1E 01 F8 |...[d......kd...|
0x00000190  01 6B F9 D1 00 2D 15 D0 10 F8 01 4B 03 F0 0C 03 |.k...-.....K....|
0x000001A0  0C 2B A1 EB 04 04 0A BF 10 F8 01 3B A4 EB 83 14 |.+.........;....|
2个回答

和文件的开头。看起来很奇怪?一些跳表?

0x00000000  B0 73 00 20 55 11 01 08 39 11 01 08 3B 11 01 08 |.s..U...9...;...|

那是一个 ARM 向量表。第一个字是靠近 RAM 顶部的初始堆栈指针值,其余是向量。

  • B0 73 00 20这是 0x200073B0 可能表示从 0x20000000 开始的具有 32K RAM 的部件 因为它比许多便宜的部件具有更多的 RAM,它有助于缩小您的搜索范围

  • 55 11 01 08这是 0x08011155 和代码的重置向量或初始入口点,您可以从中看出两件事:

    • 该部分具有超过 64K 的闪存
    • 地址中设置的 1 位表示它在 Thumb 模式下运行,这是所有当前 MCU(如 Cortex-M0、M3、M4 等)提供的。

进一步看,我们发现

0x000000B0  FD 0B 02 08

所以有超过 128K 的闪存

0x00000120  6F 11 01 08 6F 11 01 08 6F 11 01 08 6F 11 01 08 |o...o...o...o...|
0x00000130  00 F0 02 F8 00 F0 66 F8 0A A0 90 E8 00 0C 82 44 |......f........D|

您的最后一个向量位于 0x12c,因此向量表的大小可能会限制可能性

一个很好的猜测是某种 STM32,但还有许多其他芯片供应商获得了 ARM Cortex 内核的许可,虽然 0x800000 排除了一些制造商,但仍有许多可能性与其一致。

您可以注意到的另一件事是向量中 0 的特殊模式。在许多向量表源中,这些将对应于保留向量,您可以尝试匹配该模式。从 startup_stm32l073xx.s 举一个方便的例子

__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset Handler
                DCD     NMI_Handler               ; NMI Handler
                DCD     HardFault_Handler         ; Hard Fault Handler
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved

等等

您的下一步可能是反汇编,例如,如果您安装基于 gcc 的 arm 交叉开发工具链,您可以执行以下操作:

arm-none-eabi-objdump -d -marm -Mforce-thumb --adjust-vma=0x8000000 -b binary YOURFILE.BIN

但是,并不完全确定您拥有的图像本身是否从 0x8000000 开始。相反,它可能从负责将其复制到闪存中的引导加载程序之后的更高地址开始。或者它可能是链接到双库部分第二个的图像,就像 STM32L1xx 不提供库地址交换(与双库模型提供的 STM32L0xx 相比)。您可能需要对基地址(如传递给--adjust-vma进行一些试验,直到在向量的目标上找到合理的代码。尤其是重置的,您希望在那里很早就找到诸如将初始化数据复制到 RAM 的循环之类的东西。

然后,您可以查找对齐的 32 位常量,这些常量是映射到典型外设(GPIO、I2C 或 SPI 等)寄存器的地址,并尝试进一步缩小范围。通常这些常量会在初始化它们以初始化相应外设的函数的尾部找到。

如果您发现 FPU 指令的编码,则它至少必须是 Cortex-M4,但仅仅因为处理器具有 FPU 并不意味着必须构建代码来使用它。

除了打开它并尝试从芯片中识别架构之外,还有其他方法吗?

这通常相当有效,但另一个有效的方法是查看产品上是否贴有 FCC 标签,查看该标签,看看您可以从列表报告的内部照片部分了解到什么。

  1. 检测 CPU 字节序。在文件偏移量 0x000098C0 处,您可以找到下一个:

    000098B0: 74 00 00 20-4D 4F 54 5F-43 54 52 4C-28 2D 31 33 t MOT_CTRL(-13
    000098C0: 35 30 2C 31-30 395 0FF05A, 0FF05-05A )◙║·  

对于小端 32 位,BA FA FF FF 是 -1350,所以假设我们有 LE CPU

  1. 使用cpu_rec实用程序检测 CPU

./cpu_rec.py AutoMower.bin
AutoMower.bin full(0x1e708) ARMhf 块(0x6400;25) ARMhf

所以假设我们有支持硬件浮点的 Little Endian ARM。

  1. 检测入口点。
    在文件偏移量 0x000098C0 处,您可以找到下一个:

    00006DB0:54 68 61 6E-6B 20 79 6F-75 3B 00 00-3E 3C 00 20 谢谢;><

3E 3C 00 20 是 0x20003C3E for little endian 32-bit 和 0x3C3E 的范围是 0-0x1E707,所以假设固件的起始地址是 0x20000000