我试图逆向工程一个二进制文件格式,但它没有魔术字节,也没有具体的扩展名。我只能影响文件的一个方面:短字符串。通过尝试不同的字符串,我能够弄清楚数据如何存储在文件中。看来整个文件使用某种简单的编码。我希望找到确切的编码可以让我缩小搜索文件格式的范围。我知道该文件是由用C++编写的Windows程序生成的。这是什么编码/压缩算法?
现在,经过多次反复试验,我发现文件的某些部分编码为运行。每次运行都从一个字节开始,指出将要检索的字节数和检索数据的位置。
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
@Hidde我可以命令该程序为我提供一个大文件,其中包含我选择的特定18个字符的字符串。这些是我选择的字符串,以及它们在结果文件中的相应编码版本。我无法在二进制文件中找到任何其他字符串,但这可能是由于编码所致。 – Virtlink
看起来第一个字节是以十六进制表示的字符串的长度。 –