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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM