微信图片缓存中的 dat 文件处理

不太能搞懂微信的图片过期机制,有的图片在缓存目录中明明有相应的 dat 文件,它却提示“文件已过期或被清理”,真让人很郁闷。正好最近又确实有个重要的图片文件需要恢复,于是就搜索了一下相关的资料,发现微信的这个图片 dat 文件其实就是简单的异或处理了一下,关键是要找出来这个异或值,其实也不复杂,用 HEX 编辑器打开任意一个 dat 文件,取前 2 个字节的值,与常见的图片文件头进行 XOR 运算(Windows计算器,程序员模式),若结果是两个相同的字节,就取这个字节值。常见图片文件头:JPG 格式是 FFD8,GIF 格式是 4749,PNG 格式是 8950,其它格式的可以自行找一个其格式的正常文件用 HEX 编辑器打开看看。

尝试用 Python 写了个脚本,经过本人测试,工作基本正常:

 1 # -*- coding: utf-8 -*-
 2 
 3 import io
 4 import os
 5 
 6 code = 0x00
 7 jpg_code = bytearray([0xFF, 0xD8])
 8 gif_code = bytearray([0x47, 0x49])
 9 png_code = bytearray([0x89, 0x50])
10 
11 # 这里修改为要处理的 dat 文件所在文件夹
12 base_dir = "D:\\wechat_dat"
13 
14 def imageDecode(path, filename):
15   if filename.endswith(".dat"):
16     print(path, "/", filename)
17     with open(os.path.join(path, filename), "rb") as dat:
18         heads = bytearray(dat.read(2))
19 
20         # 判断是否为 GIF 格式
21         if heads[0] ^ gif_code[0] == heads[1] ^ gif_code[1]:
22           code = heads[0] ^ gif_code[0]
23         # 判断是否为 PNG 格式
24         elif heads[0] ^ png_code[0] == heads[1] ^ png_code[1]:
25           code = heads[0] ^ png_code[0]
26         # 默认都按 JPG 格式处理
27         else:
28           code = heads[0] ^ jpg_code[0]
29 
30         out = open(os.path.join(path, filename + ".jpg"), "wb")
31         dat.seek(0)
32         for now in dat:
33             for new_byte in now:
34                 new_byte = new_byte ^ code
35                 out.write(bytes([new_byte]))
36         dat.close()
37         out.close()
38 
39 for filename in os.listdir(base_dir):
40   if not os.path.isdir(os.path.join(base_dir, filename)):
41     imageDecode(base_dir, filename)

 

PS. 刚发现,输出的时候都按 jpg 扩展名输出了,不太严谨,不过我是用 ACDSee 看图,各种格式都能正确识别和显示,所以这块就不处理了,有兴趣的朋友可以自行改进代码。

 

posted @ 2022-04-10 16:30  润之  阅读(1270)  评论(0编辑  收藏  举报