这篇文章主要来讲解一下PC微信的图片保存机制以及解密获取方法
微信图片保存机制
微信图片的保存机制,一言以蔽之,查看过的历史图片会按照好友备注来独立生成文件夹保存在本地,文件夹的好友备注名称是加密过的,压根无法确定谁是谁,而未查看过的图片在微信服务器中,无法获取。
查看过的历史图片
最新版本的PC微信(windows系统)的历史聊天图片通常是保存在本地的MsgAttach文件夹内
打开MsgAttach文件夹,发现有很多字母名称的文件夹
这些文件夹的名称一看就是MD5的加密值,大概率是有图片发送记录的好友备注或wxid的MD5加密值,破解意义不大。
点击一个最新的文件夹进入后,发现有两个文件夹,名为Image与Thumb
这里我猜测,Image为原始图像,Thumb为缩率图(解密后发现该猜想正确!),继续打开Image文件夹,发现有年份-月份的文件夹
那么我们前边所说到的d47d7a7a7560b2f4242aa3eb77d62c39这个文件夹的名称大概率就是好友备注或wxid的MD5加密值,继续打开发现内部是很多的dat文件。
网络查询发现,微信 .dat 文件通常使用单字节异或加密,密钥可能是文件头的第一个字节与标准图片文件头的异或结果。对此也有大佬实现了该方法并上传到github上,
但是,目前还没有一个可用的Python代码来实现,这里我给出一个完全可用的python代码来进行解密,经过多次测试,发现效果还可以。
解密代码
import os
def decrypt_wechat_dat(dat_file, output_file=None):
"""
解密微信.dat类型文件并保存为图片
Args:
dat_file:.dat 文件路径
output_file:输出的图片文件路径(可选)
Returns:
解密后的数据(bytes类型)
"""
with open(dat_file, 'rb') as f:
encrypted_data = f.read()
#常见的图片文件头
image_headers = {
b'\xFF\xD8\xFF': 'jpg',
b'\x89\x50\x4E\x47': 'png',
b'\x47\x49\x46\x38': 'gif',
b'\x42\x4D': 'bmp',
b'\x49\x49\x2A\x00': 'tif',
b'\x4D\x4D\x00\x2A': 'tif',
}
#异或解密
possible_keys=[]
for header in image_headers:
if len(header)<=len(encrypted_data):
key=bytes([encrypted_data[i] ^ header[i] for i in range(len(header))])
#密钥是单字节
if all(k==key[0] for k in key):
possible_keys.append(key[0])
if not possible_keys:
raise ValueError("无法自动推断密钥,请手动指定密钥!")
key=possible_keys[0]
decrypted_data=bytes([b ^ key for b in encrypted_data])
detected_format=None
for header, fmt in image_headers.items():
if decrypted_data.startswith(header):
detected_format=fmt
break
if not detected_format:
raise ValueError("解密后的数据不是已知的图片格式!")
if output_file is None:
output_file=os.path.splitext(dat_file)[0] + '.' + detected_format
with open(output_file, 'wb') as f:
f.write(decrypted_data)
print(f"解密成功,图片已保存为:{output_file}")
return decrypted_data
if __name__ == '__main__':
try:
decrypt_wechat_dat(r"D:\WeChat Files\wxid_y9ojb3zojmp22\FileStorage\MsgAttach\14369f05a9713f01434fd0b3dedede90\Thumb\2025-06\ab934d922a405ebb72e1da77c00d5cb3_t.dat",'test.png')
except Exception as e:
print(f"解密失败:{e}")
测试:
该图片来自最近一周我给好友发送过的截图,后续我将在此基础上给出一个快速导出所有微信历史图片的方法。
未查看过的图片
微信的未查看过的图片可以分为三类,别人发给我们的,我们发给别人的,以及我们最近查看过的
别人发给我们的
经过大量测试,最终得到结论:别人发给我们的图片如果还未点击查看过,一般是保存在微信自身服务器中,除非使用hook或爬虫等方法,否则在微信本地是无法获取到。而前边谈到的MsgAttach\好友备注加密文件夹\image\2025-06 只会存储我们点击查看过的历史图片,只有图片被点击查看过后,该文件夹下的内容才会自动更新。
我们最近查看的
PC端在图片查看器中查看过的图片,是被保存在Temp文件夹下的MM_Wechat_image.dat文件中。只要图片在图片查看器窗口中被打开,那么微信服务器便会迅速将该图片进行异或加密后存储在我们本地的Temp文件夹的这个文件中。
也就是说,我们在图片查看器窗口中左右切换图片时本地的MM_Wechat_image.dat也会快速更新
当前图片查看器窗口内正在查看的图片
MM_Wechat_image.dat解密后的图片:
我们发给别人的
我们发给别人的图片,如果是windowsPC端发送,则会直接以jpg格式存储在Temp内,手机端发送的图片与上边所谈到的别人发给我们的图片保存机制一样,都是只有点击查看过才可以在本地的MsgAttach\好友备注加密文件夹\image\2025-06 文件夹内发现。
给好友使用PC微信发送一张图片,本地的Temp文件夹中迅速出现两张该图片
总结
文中涉及到的几个文件夹路径分别为:
1.微信设置->点击文件管理->点击打开文件夹->\FileStorage\Temp1.微信设置->点击文件管理->点击打开文件夹->\FileStorage\MsgAttach
以上便是PC微信图片保存机制的所有内容,如果对你有用,可以给作者一个免费的三连支持一下!