字符串奇怪地分成二进制

逆向工程 反编译 加密 解压 海湾合作委员会
2021-06-19 09:20:24

最近我发现二进制文件中的一些部分对我来说很奇怪,我想问一下这是不是常见的编译器会做的事情,是否有办法撤消它。

(二进制文件来自原始闪存转储)

几个例子:

In Binary File:
4C 65 76 FF 65 6C 3D 30 28 4F 46 46 FF 29 2C 31 28 45 52 52 29 FF 2C 32 28 43 4D 44 29 2C FD 33 1C 41 50 52 4F 43 29
Levÿel=0(OFFÿ),1(ERR)ÿ,2(CMD),ý3.APROC)

What it actually should look like:
Level=0(OFF),1(ERR),2(CMD),3(....PROC)
Bin:
45 D2 60 67 65 6E 63 79 DA 50 FF 6F 70 20 54 65 73 74 20 33 4F 4E
EÒ`gencyÚPÿop Test 3ON

Actual:
Emergency Loop Test ON
Bin:
53 FF 65 72 76 69 63 65 20 55 FF 6E 61 76 61 69 6C 61 62 E3 6C 65
Sÿervice Uÿnavailabãle

Actual:
Service Unavailable

提前致谢。

编辑:

你怎么知道它应该是什么样子的?

因为当电路板运行时,它会在 GUI 中显示完全相同的字符串。

你能区分你的转储和磁盘上找到的二进制文件吗?

由于这个图像是从闪存中提取的,我会说它实际上是这样存储的。

你能用十六进制字节更新你的问题以帮助调查吗?

当然。

你知道使用的编译器吗?

不,我不知道用的是什么编译器。它必须是嵌入式系统的东西,因为它在 mcu 上运行。

你能提供一些环境信息吗?(操作系统、架构、编译器...)

运行某种 RENESAS 处理器的嵌入式系统板(确切型号未知)

更新:

每 8 个字节有某种指示符。在我的情况下,主要是 FF (ÿ) 表示接下来的 8 个字节没有被编码/压缩。如果字节类似于 FD (ý),在 Binary(MSB) 中为 10111111,则表示第二个字节已编码。

例子:

Levÿel=0(OFFÿ),1(ERR)ÿ,2(CMD),ý3.APROC)
678 12345678 12345678 12345678 12.345678

含义 (APROC) 实际上不是 (APROC) 而是更像 (....PROC)

2个回答

在黑暗中拍摄:也许这个文本(或整个二进制图像)被压缩了。想想LZSS 之类的东西

有一个包含八位的神秘字节1,后跟八个文字和正确字节的事实表明,神秘字节可能实际上是使用每个位位置来区分未压缩数据字节和指向较早数据的指针的标志。没有 神秘字节的FF情况后跟比其他实例更损坏的文本,导致人们相信0位表示指针数据的想法

一个快速的谷歌搜索揭示了ÿ在 UTF8 中是U+00FF. 我的猜测是您要么正在查看未正确解释的 UTF8 字节,要么您的转储与磁盘上的可执行文件存在差异,从而导致此类损坏的字符。我再问几个问题:

  • 你怎么知道它应该是什么样子的?
  • 你能区分你的转储和磁盘上找到的二进制文件吗?
  • 你能用十六进制字节更新你的问题以帮助调查吗?
  • 你知道使用的编译器吗?
  • 你能提供一些环境信息吗?(操作系统、架构、编译器...)

至于解除腐败,自己动手不行吗?如果不可行/您不希望上述问题变得更相关