微信图片缓存中的 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 看图,各种格式都能正确识别和显示,所以这块就不处理了,有兴趣的朋友可以自行改进代码。
✉ ext2@qq.com