b64 编码的双精度列表的未知二进制格式

逆向工程 解压 编码 未知数据
2021-07-05 10:58:29

同时对数据库中间件进行逆向工程。这大概是使用 Base64 编码对 double 或 float 值列表进行编码,然后对其进行压缩。

通过zlib.decompress()我能够解压缩它,但我得到了一串可能是多个 base64 字符串。我可以看到它由多个组成,因为它包含多个=. 但是 afaik,这些并不总是标记 b64 编码字符串的结尾,因为也可以没有=.

这是一个领域的摘录:

b'<\x12u<\xf4\x808=\x95\xf0U=\x9fse;\xef\xbe\xf2=A\xd1K=\x1fB\x99=\x95\x11\xa3=\xb8\xcd\xbd<\xd2\xfaL=\x1d\x80U=\xd6:\x1e=\xdcp\xcd=1\xd2\xe1=\t\x01\x8e<\x85\xa8\x16>8\xb4\xa7>2\xf4\x11=>\x03\x9b<\xdfA\x9b>%>a>\xcf\x9a\x05>Ie\x1c>\t@Y<\xdfC\xe2=\xf8\'\xb0=zpa=\x8e\xe8\xde<\xc8\xcby=\x88\xfe\xb6=\xb8Uv=\xd5\xe3\xee=q\xef|<B\xe1\x1f=%\xfe\x85=\x90_\x04=p\x9e\xbd=\x89og=\x96\x88\x87<\xa2\x9c\x84=\x969\xaf=\xab\x84^<\xef\x81\xf6<T\x7f\xf4<\x85\xd6\x86<\x80Q\x93<\xb4\xf9\x00<\xfc&s<\xb9q\x1b<\xd3\xd8\xa0<4\xe9\xc3=\x86a\xb4=\xd5s_=\xc8\xb1==\xc24\xca=~\xd3\xe8=^7\xa5=e\xa3-=\x07?4<\xd5HJ=='

作为这个领域的业余爱好者,我非常不确定从哪里开始。从我知道的文档中,它是一个 b64 编码的列表,但我不知道如何使用它。显然,当解码时,它将由二进制格式组成,在某些计算机语言中表示浮点数列表。

有关如何继续解决此问题的任何提示?不幸的是,我目前无法访问该软件,我唯一拥有的就是这个数据结构。

很抱歉我的业余问题,并提前感谢您的任何提示!

1个回答

您在此处拥有的数据不是 base64 编码的,因为它只有字母、数字+/、 和 (如您所提到的)=\x字符串中转义码表示不可打印或超出 ASCII 范围的字节。

每四个字节=或接近=值 ( ;, <, =, >)的常规模式表明这是一个简单的 4 字节小端字段数组,其中的值彼此相对接近。这是一个 4 字节(单精度)浮点数组的样子。

>>> data = b'<\x12u<\xf4\x808=\x95\xf0U=\x9fse;\xef\xbe\xf2=A\xd1K=...'
>>> struct.unpack_from('<{}f'.format(str(len(data)//4)), data)
(0.014957960695028305, 0.045044854283332825, 0.05223139002919197, 0.003501154249534011, 0.11852823942899704, 0.049760106950998306, 0.07483314722776413, 0.07962337881326675, 0.0231693834066391, 0.05004388839006424, [...])

这看起来像您期望的值范围吗?