1. 程式人生 > 其它 >微信圖片快取中的 dat 檔案處理

微信圖片快取中的 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 看圖,各種格式都能正確識別和顯示,所以這塊就不處理了,有興趣的朋友可以自行改進程式碼。