十六进制字符串产生半清晰的输出。我如何找到其余部分的编码方式及其含义?
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。
我偶然发现了一个十六进制字符串,我想知道它是关于什么的以及为什么它是这样编码的。
十六进制字符串来自未知应用程序的 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。