如何找出 Intel Hex 文件所属的处理器类型?

逆向工程 拆卸 手臂 英特尔 图片 未知数据
2021-06-27 08:24:50

我有一个文本文件,我知道它是设备的固件。此文件具有Intel 十六进制格式,如下所示:

:03:8000:00:028100FA
:02:8003:00:XXXXXX
:02:800B:00:XXXXXX
:02:8013:00:XXXXXX
:01:801B:00:XXXX
:01:8023:00:XXXX
:10:802B:00:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
:10:803B:00:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
:10:804B:00:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
:10:805B:00:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

如何找出该文件属于哪种类型的处理器(Intel/ARM/PIC/...)?我该如何拆卸它?

字节频率:

ebra@him:~$ cat single-byte-per-line | sort | uniq -c | sort -n
      1 
      3 59
      5 4C
      6 49
      6 57
      6 5D
      8 47
      8 48
      8 4A
      8 4E
      8 52
     10 C6
     11 7E
     11 8F
     11 9B
     12 51
     12 8E
     12 95
     12 9C
     12 9D
     12 B7
     12 CE
     13 CF
     14 27
     14 55
     14 56
     14 58
     14 5C
     14 7F
     15 73
     15 8D
     15 9E
     15 C7
     15 D6
     16 5F
     16 D7
     17 1B
     17 A5
     17 C8
     17 CB
     18 AF
     18 B1
     19 46
     19 5A
     19 8B
     19 C1
     20 D9
     20 ED
     21 72
     21 94
     21 A6
     22 43
     22 4F
     22 71
     22 AC
     22 B9
     22 C9
     23 9F
     23 A3
     23 BE
     24 42
     24 AD
     24 BD
     24 BF
     24 E9
     25 4D
     25 CC
     26 87
     26 A1
     26 B8
     26 E8
     27 69
     27 6F
     27 88
     28 F1
     29 53
     29 5E
     29 61
     29 77
     29 BC
     30 45
     30 AB
     31 1A
     32 86
     33 1E
     33 4B
     34 1C
     35 1F
     35 67
     36 BB
     36 EA
     37 98
     37 99
     37 DD
     37 F4
     37 FD
     38 2C
     38 B2
     40 3B
     40 EE
     41 25
     41 97
     41 E7
     42 2D
     42 D4
     42 EF
     43 1D
     43 8C
     44 5B
     44 96
     44 DC
     46 28
     46 3A
     46 D5
     46 DF
     46 F7
     46 FE
     47 76
     47 7D
     48 C5
     48 FC
     49 D8
     50 35
     53 0E
     53 B5
     57 BA
     57 E6
     58 A7
     58 C4
     58 CA
     59 19
     59 21
     59 AA
     62 3D
     62 A8
     63 93
     63 A9
     65 34
     65 8A
     65 B0
     65 F6
     67 AE
     67 D1
     68 31
     69 EC
     70 26
     70 41
     71 14
     71 81
     72 23
     72 3E
     72 65
     72 B6
     74 F8
     75 44
     75 6B
     76 64
     76 7C
     76 92
     77 FF
     78 37
     78 91
     78 B3
     79 2F
     80 A0
     82 38
     84 A2
     85 DA
     87 0D
     90 24
     91 6D
     91 A4
     93 18
     95 62
     95 CD
     96 0B
     96 3C
     99 68
     99 E4
    101 6C
    103 50
    106 63
    109 39
    109 3F
    109 DE
    111 6E
    112 6A
    115 E1
    116 36
    117 70
    117 89
    118 D3
    128 17
    131 FB
    134 D0
    137 54
    146 FA
    149 0C
    151 0A
    154 F9
    164 60
    173 C3
    174 2A
    183 DB
    184 C0
    185 29
    185 E3
    189 16
    191 83
    200 2E
    203 9A
    204 66
    207 F3
    212 15
    212 20
    220 0F
    221 7B
    226 7A
    240 33
    241 E2
    242 F5
    244 EB
    247 30
    247 32
    255 2B
    256 06
    261 10
    275 13
    284 07
    286 40
    288 E0
    309 84
    311 85
    313 03
    321 04
    325 22
    326 C2
    327 F2
    333 01
    333 79
    344 82
    353 90
    357 11
    362 F0
    376 80
    414 05
    422 78
    436 09
    467 74
    489 D2
    570 08
    656 E5
    889 B4
   1301 12
   1369 02
   1717 00
   2081 75

如果我提取所有以 开头的 2 字节序列75,我有:

ebra@him:~$ cat sequence-starts-with-75 | grep -o .... | sort | uniq -c | sort -n
      1 7505
      1 750D
      1 750E
      1 7514
      1 7519
      1 751F
      1 7521
      1 7522
      1 7526
      1 7527
      1 752D
      1 7530
      1 7545
      1 7547
      1 7548
      1 754D
      1 754F
      1 7557
      1 755F
      1 7560
      1 756F
      1 7570
      1 7571
      1 7572
      1 7573
      1 7581
      1 7587
      1 758B
      1 7594
      1 75A8
      1 75B8
      1 75C8
      1 75CA
      1 75CB
      1 75CC
      1 75CD
      1 75E5
      1 75F2
      2 7501
      2 7510
      2 751D
      2 7525
      2 7534
      2 7536
      2 753C
      2 753D
      2 7566
      2 758D
      2 7598
      2 7599
      2 75B4
      2 75D0
      2 75D4
      3 7523
      3 752F
      3 757A
      3 758C
      4 752E
      4 753A
      6 7535
      6 7537
      6 753B
      6 753F
      6 7567
      6 7569
      7 7500
      7 7540
      7 757B
      7 758A
      8 757C
      8 75A0
     10 7524
     11 7563
     11 7574
     11 7576
     11 7577
     11 7579
     12 7518
     13 7575
     14 752C
     16 7565
     16 7578
     17 7517
     17 75F0
     18 7528
     18 7564
     19 7539
     19 753E
     27 7562
     37 7515
     37 7583
     38 7516
     45 7533
     49 756A
     49 756B
     50 756C
     52 756E
     53 756D
     58 7532
     68 7512
     73 7568
    141 752B
    143 7529
    144 752A
    169 7582
    204 7513
    248 7511

对于以 75 开头的 3 字节序列:

    ebra@him:~$ cat sequence-starts-with-75 | grep -o ...... | sort | uniq -c | sort -n
  .. [Truncated] ...
  6 750075
  6 752B03
  6 752B08
  6 753269
  6 753F00
  6 756BA4
  6 757500
  6 757800
  6 758204
  6 758205
  6 75820B
  6 75F000
  7 75120A
  7 752801
  7 752B05
  7 756E08
  8 751101
  8 752910
  8 756BC0
  8 756D0C
  8 757400
  8 75A000
  9 751104
  9 752803
  9 758200
  9 758203
 10 752901
 10 752C80
 10 756BB2
 11 751864
 11 753200
 11 756ABC
 11 758208
 12 753290
 13 751210
 14 752B01
 14 752B10
 14 753910
 14 756C01
 14 75820F
 15 752B06
 16 753E00
 16 756BB0
 17 7517FF
 17 75326A
 17 753300
 18 752906
 19 756811
 19 756E00
 19 758209
 20 758201
 21 752904
 21 752B04
 22 756D00
 23 756C00
 24 75820A
 30 756A00
 34 758202
 35 752902
 36 758301
 37 752905
 46 752B02
 46 756810
 65 751103
 77 751102
 79 751100
142 752A00
2个回答

这听起来类似于给定文档,推断语言。

我会将指令的频率(文件中每个值的计数)与从已知处理器类型的文件派生的指令频率进行比较。

有效的unigram 模型如果您以通用格式获取文件,我可以助您一臂之力。

你不能 -Intel hex格式不包含这种数据。您需要手动寻找正确的架构。您可以使用IDAGhidra为此,并在下面针对它可能的每个架构打开。

国际开发协会

然后你需要反汇编整个文件,看看它是否有意义。(控制流、函数数量、外部参照……)

或者当然,为此使用一些脚本。