十六进制字符串产生半清晰的输出。我如何找到其余部分的编码方式及其含义?

Hex string produces semi-legible output. How do I find how the rest is encoded and what it means?

我偶然发现了一个十六进制字符串,我想知道它是关于什么的以及为什么它是这样编码的。

十六进制字符串来自未知应用程序的 cookie(它本身是在转储 session.db 的已编码内容后发现的)。上面写着:

HEX=0x80037d710028580a0000005f7065726d616e656e74710188580a00000061646d696e5f61757468710288580700000076657273696f6e71035805000000372e342e30710458050000007469746c6571055811000000e5ae9de5a1944c696e7578e99da2e69dbf71065804000000636f6465710788752e

一个简单的 xxd -r -p 揭示了它的一些内容(实际上我对 xxd 输出进行了 hexdump,更好地显示 ASCII 部分和剩余的十六进制部分):

echo $HEX | xxd -r -p | hexdump -C
00000000  80 03 7d 71 00 28 58 0a  00 00 00 5f 70 65 72 6d  |..}q.(X...._perm|
00000010  61 6e 65 6e 74 71 01 88  58 0a 00 00 00 61 64 6d  |anentq..X....adm|
00000020  69 6e 5f 61 75 74 68 71  02 88 58 07 00 00 00 76  |in_authq..X....v|
00000030  65 72 73 69 6f 6e 71 03  58 05 00 00 00 37 2e 34  |ersionq.X....7.4|
00000040  2e 30 71 04 58 05 00 00  00 74 69 74 6c 65 71 05  |.0q.X....titleq.|
00000050  58 11 00 00 00 e5 ae 9d  e5 a1 94 4c 69 6e 75 78  |X..........Linux|
00000060  e9 9d a2 e6 9d bf 71 06  58 04 00 00 00 63 6f 64  |......q.X....cod|
00000070  65 71 07 88 75 2e                                 |eq..u.|
00000076

为什么有些部分清晰可辨,有些部分明显编码更深?

我将如何确定乱码部分的编码方式及其含义?

好像是用Python3的Pickle序列化的对象,一个对象序列化库:

import pickle
f = open("/mnt/z/Temp/download.dat", "rb")
data = pickle.Unpickler(f).load()
print(data)

输出:

{'_permanent': True, 'admin_auth': True, 'version': '7.4.0', 'title': '宝塔Linux面板', 'code': True}

我是怎么知道的:嗯,如果你知道的话,可以从它的外观模式中认出它。否则,谷歌搜索第一个字节 80 03 7d 71 00 也会出现一些结果,其中人们正在谈论由 Python 创建的文件,查看他们的代码会发现 pickle 是用于编写这些文件的库文件。

可能产生此会话对象的 Web 应用程序是用 Django 或其他一些基于 Python 的 Web 框架编写的。

所以,并不是有些部分被“进一步编码”,只是它是一种二进制格式,对结构化数据进行编码,“可读”部分是字符串部分,“乱码”部分只是部分人类无法直接读取但在协议中有意义的格式(例如,定义某物的值类型,下一部分的长度等)。

顺便说一句,“宝塔Linux面板”(“宝塔Linux面板”)似乎是easy-to-use server management panel