微信DAT圖片解密實現


PC版的微信將用戶接收到的所有圖片加密為DAT文件並保存在本地,具體保存位置就看各自的微信-文件管理設置了。

DAT格式文件不能直接打開,強行查看也就只能看到一些亂碼。如果能夠找到解密的方式,就可以很方便在本地篩選圖片了,雖然大部分可能只是聊天吹水的內容。

加密方式

首先我嘗試一下在微信中發送一張新圖片(如果是轉發圖片,並不會有新的文件記錄。換句話說,微信去重了),然后在微信加密存儲目錄中找到新增的記錄,可以看到這兩個文件的文件大小是一模一樣的。

微信需要處理用戶接收到的所有圖片,加密方式勢必不能是特別復雜並且是可逆的。如果用AES、DES等加密算法,這么多群開起車來你扛的住,CPU也扛不住啊~

公布答案,其實是”異或加密“,對每位字節使用同一個值進行異或計算得到加密文件。

解密原理

現在我們只需要知道“密鑰”就可以對文件進行解密還原了。至於為啥,可以參考下異或運算的”自反法則 ( a ⊕ b ⊕ a == b )“。

假設 a 為原文,b為密鑰,c為密文,則有 c = a ⊕ b。

則 c ⊕ a = a ⊕ b ⊕ a = b

所以我們只需要知道一個圖片原本的字節,就能計算”密鑰“了。

總所周知(好吧,我也是剛查了才知道),JPEG文件的開始2個字節都是FF D8,這是JPEG協議規定的SOI文件頭。

通過程序讀取加密文件的前兩個字節為11 36,分別和FF D8進行異或計算,可以得到結果都為EE,就是加密的密鑰了。

11 ⊕ FF = EE

36 ⊕ D8 = EE

以此類推jpg/png/gif格式也就可以通過相同方法計算出密鑰。

圖片標識字節

  • jpg FF D8
  • png 89 50
  • gif 47 49

代碼實現

func Format(filePath string) byte {
	buf, _ := ioutil.ReadFile(filePath)
	imgbytes := [3][]byte{
		{0xff, 0xd8},
		{0x89, 0x50},
		{0x47, 0x49},
	}
	for _, xor := range imgbytes {
		if xor[0]^buf[0] == xor[1]^buf[1] {
			return byte(xor[0] ^ buf[0])
		}
	}
	return byte(0)
}

最后解密就只需要對加密文件的每個字節用”密鑰“進行異或計算就好了,自己去嘗試吧

PS:不同圖片的后綴名別忘了處理


免責聲明!

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



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