【发布时间】:2014-03-01 23:20:10
【问题描述】:
我正在尝试对二进制文件格式进行逆向工程,但它没有魔法字节,也没有特定的扩展名。我只能影响文件的一个方面:一个短字符串。通过尝试不同的字符串,我能够弄清楚数据是如何存储在文件中的。似乎整个文件使用了某种简单的编码。我希望找到确切的编码可以让我缩小对文件格式的搜索范围。我知道该文件是由用 C++ 编写的 Windows 程序生成的。
现在,经过多次反复试验,我发现文件的某些部分是在 runs 中编码的。每次运行都以一个字节开始,该字节指示后面有多少字节以及从何处检索数据。
-
000ddddd(1 个字节)
从编码数据中取出以下 (ddddd)+1 个字节。 -
111····· ···ddddd ···bbbbb(3 个字节)
在解码后的数据中返回 (bbbbb)+1 个字节,并从中取出下一个 (ddddd)+9 个字节。 -
ddd····· ··bbbbbb(2 个字节)
在解码后的数据中返回 (bbbbbb)+1 个字节,并从中取出下一个 (ddd)+2 个字节。
这是一个例子:
这是文件的开头,其中编码了 UTF-16 字符串
abracadabra:. . . a . b . r . . c . . d . € . 0C 20 03 04 61 00 62 00 72 20 05 00 63 20 03 00 64 20 03 80 0D解码字符串:
0C number of Unicode chars: 12 (11 chars + \0) 20 03 . . . ?? 04 next 5 61 00 a . 62 00 b . 72 r 20 05 . a . back 6, take 3 00 next 1 63 c 20 03 . a . back 4, take 3 00 next 1 64 d 20 03 . a . back 4, take 3 80 0D b . r . a . back 14, take 6这会导致 (UTF-16):
a . b . r . a . c . a . d . a . b . r . a . 61 00 62 00 72 00 61 00 63 00 61 00 64 00 61 00 62 00 72 00 61 00
但是,对于这可能是什么编码/压缩算法,我没有线索。它看起来像是 LZ 的一些变体,不使用字典(如 LZ77),但到目前为止,我还没有找到任何与此描述匹配的算法。我也不确定整个文件是这样编码的,还是只是其中的一部分。
你知道这种编码吗?或者您对我可能会在文件中查找以识别编码的内容有任何提示吗?
【问题讨论】:
-
您确定文件包含文本吗?
-
@Hidde 我可以命令程序给我一个大文件,其中包含我选择的特定 18 个字符串。这些是我选择的字符串,以及它们在结果文件中的相应编码版本。我无法在二进制文件中找到任何其他字符串,但这可能是由于编码。
-
看来第一个字节是十六进制字符串的长度。
-
如果此编码用于压缩,它必须赢得最差压缩方法奖,永远!
-
请提供空字符串、单个字符和单个非 ASCII 字符(即需要 UTF-8 或 UTF-16 编码)的结果。
标签: string encoding compression reverse-engineering