不太能搞懂微信的圖片過期機制,有的圖片在緩存目錄中明明有相應的 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 看圖,各種格式都能正確識別和顯示,所以這塊就不處理了,有興趣的朋友可以自行改進代碼。