【微信取证篇】微信过期图片恢复之微信Dat文件加密原理和解密工具

【微信取证篇】微信过期图片恢复之微信Dat文件加密原理和解密工具

挖一挖微信图片,看它藏着个什么世界—【蘇小沐】

1、实验环境

系统环境
Windows 11 专业工作站版,[v23H2(22631.3007)]
微信 for Windows版本,[v3.9.9.35]
Visual Studio Code,[v1.85.2]
Python,[v3.12.1]

(一)微信默认位置

最近更新微信才发现微信 for Windows版本v3.9保存的视频、文件存储位置又改回了【v3.7.0.26】版本之前的位置。

系统环境不同或者更改过存储路径的,建议直接在电脑微信设置里面查看,打开文件管理,查看保存路径。如果微信未登录可以尝试搜索"WeChat Files、FileStorage、MsgAttach"等相关文件夹查找。

图片

1、微信 for Windows版本:v3.7.0.26之前

  • 微信默认安装路径:C:\Program Files (x86)\Tencent\WeChat。
  • 微信默认存储路径:C:\Users\【电脑用户名】\Documents
  • 微信默认照片存储路径:C:\Users\【电脑用户名】\Documents\WeChat Files\【微信账号ID】\FileStorage\Image
  • 微信默认视频存储路径:C:\Users\【电脑用户名】\Documents\WeChat Files\【微信账号ID】\FileStorage\Video
  • 微信默认文件存储路径:C:\Users\【电脑用户名】\Documents\WeChat Files\【微信账号ID】\FileStorage\File

2、微信 for Windows版本:v3.7.0.26到v3.9.9.35

2022年5月底,从微信v3.7.0.26 版开始,FileStorage目录下多了一个**"MsgAttach"文件夹,微信视频、图片等的保存路径发生了重大改变,开始按群、好友分别保存了。具体参考我之前的文章【【微信取证篇】电脑版微信的照片视频文件位置变化**

【微信图片位置:C:\Users\【电脑用户名】\Documents\WeChat Files\【微信账户ID】\FileStorage\MsgAttach\【微信ID的MD5值】\Image\】

【微信视频位置:C:\Users\【电脑用户名】\Documents\WeChat Files\【微信账户ID】\FileStorage\MsgAttach\【微信ID的MD5值】\Video\】

图片

3、微信 for Windows版本v3.9.9.35

最近没怎么关注,暂不清楚微信 for Windows版本v3.7.0.26及后续哪个版本开始,微信保存的视频、文件存储位置又改回了【v3.7.0.26】之前的位置,而微信图片仍然是v3.7.0.26开始的**“MsgAttach”**文件夹新位置。

图片

但,影响不大,了解即可,总归是这几个目录下,个人没那么多精力微信每更新一次就记录它的变化!

【MsgAttach】目录下有许多长名称文件夹(文件夹名称对应微信ID的MD5值),每一个文件夹对应着与该好友/群聊的聊天图片,里面主要有"Image、Thumb"两个文件夹。

【微信图片位置:C:\Users\【电脑用户名】\Documents\WeChat Files\【微信账户ID】\FileStorage\MsgAttach\【微信ID的MD5值】\Image\】

图片

Thumb文件夹是缩略图,同样也可能存在很多照片,和Image目录下的文件夹一样都是按照阿拉伯数字"年-月"命名。

图片

(二)微信Dat文件解密原理

1、微信图片恢复原理

不管微信是登录还是退出状态,电脑端微信聊天收发过的视频、图片、文件都是保存在本地的,并不会像"微信聊天数据"如果微信未登录就无法解密,不过微信图片在本地的存储是Dat格式,而非常见的jpg、png等图片格式,所以无法直接打开浏览。

微信图片Dat解密不需要调用微信程序,不依赖微信ID和UIN等。

2、Dat文件加密原理:异或

获取Dat文件头信息,然后和常见的图片格式异或,如果异或的值相等,则得出解密后的文件类型

3、Dat数据和异或值全部异或

知道文件类型,将Dat全部数据和得到的"异或值"进行异或,即可解码出原图片文件。

(三)实操解码Dat文件

1、获取Dat文件头特征值

常见的几类图片格式的文件头,可通过十六进制文本编辑器打开查看。

后缀名文件头
JPG/JPEG(.jpg)FF D8
PNG(.png)89 50
Windows Bitmap(.bmp)42 4D
GIF(.gif)47 49 46 38
TIFF (.tif)49 49 2A 00
CAD (.dwg)41 43 31 30
Adobe Photoshop (.psd)38 42 50 53

使用WinHex查看Dat文件头特征值,记录其开头两个16进制的值(57、8E),这两个值是解密的关键!

图片

2、求出"异或值"

【解密目标:与常见图片文件头"异或"得到相同的两个16进制值】

使用Windows自带的计算器,切换为"程序员"模式,将WinHex获取Dat文件头的特征值分别与常见的图片格式文件头值异或,当然,也可以一个个单独异或,如果异或得到相同的两个16进制值即为解码关键的"异或值"。

图片

从上面可以看出,使用(57、8E)分别和JPEG的头文件值(FF、D8)、PNG的头文件值(89、50)异或,结果是PNG的异或值相等,所以此Dat解码后的格式为PNG图片格式。

3、Dat整体异或

解出了,只需要将dat文件的所有数据都与"DE"异或便可以解密Dat数据,然后保存为对应的图片格式便可以打开查看了。

图片

另存为PNG图片。

图片

保存图片(解码成功后另存为JPG等图片格式也是可以正常查看的,主要是前面解码的时候不要搞错格式就行!!!)。

图片

(四)Dat解码工具

1、Python脚本解码

编写Python脚本,有Python环境的可以直接运行此Python代码,需要创建"D:/Dat文件副本"路径。然后把需要解密的Dat文件拷贝到"D:/Dat文件副本"位置下,运行脚本开始解密,解密后的图片自动输出到"D:/Dat文件副本/Dat解密图片"下。有需要的可以把输入、输出路径"替换成自己的。

建议拷贝"Dat文件副本"到新的目录来测试运行。如果删除了原Dat文件,那么电脑微信原始图片也就被删除,不会再显示在聊天记录中,需要恢复的话很难!!!总之,数据无价,操作需谨慎!

有编程能力的可以自行封装!

# !/usr/bin/env python3
# 微信Dat文件转图片
# JPG 16进制文件头 FF D8
# PNG 16进制文件头 89 50
# GIF 16进制文件头 47 49
# 微信.bat 16进制 a1 86--->jpg  ab 8c--->jpg  dd 04--->png
# 自动计算异或值

import os

into_path = r'D:/Dat文件副本'		# 输入路径,确保此路径存在,将需要解码的Dat文件复制到此文件夹下
out_path = r"D:/Dat文件副本/Dat解密图片"		# 输出路径,保存Dat解码后的图片文件

def create_directory(path):
    if not os.path.exists(path):
        os.makedirs(path)

create_directory("D:/Dat文件副本/Dat解密图片")		#  遇到保存路径不存在,则自动创建保存路径

def main(into_path, out_path):

    dat_list = Dat_files(into_path) 		# 以列表呈现路径文件夹下的Dat文件
    lens = len(dat_list)
    if lens == 0:
        print('没有Dat文件')
        exit()

    num = 0
    for dat_file in dat_list:		# 逐步读取文件
        num += 1
        temp_path = into_path + '/' + dat_file		# 拼接路径:微信图片路径+图片名
        dat_file_name = dat_file[:-4]		# 截取字符串 去掉.dat
        imageDecode(temp_path, dat_file_name, out_path)		# 转码函数
        value = int((num / lens) * 100)             # 显示Dat转换进度
        print('转换进度-->{}%'.format(value))

def Dat_files(file_dir):
    """
    :param file_dir: 寻找文件夹下的dat文件
    :return: 返回文件夹下dat文件的列表
    """
    dat = []
    for files in os.listdir(file_dir):
        if os.path.splitext(files)[1] == '.dat':
            dat.append(files)
    return dat

def imageDecode(temp_path, dat_file_name, out_path):
    dat_read = open(temp_path, "rb") 		# 读取.bat 文件
    xo, j = Format(temp_path) 		# 判断图片格式并计算返回异或值函数

    if j == 1:
        mat = '.png'
    elif j == 2:
        mat = '.jpg'
    else:
        mat = '.gif'

    out = out_path + '/' + dat_file_name + mat		# 图片输出路径
    png_write = open(out, "wb")		# 图片写入
    dat_read.seek(0)		# 重置文件指针位置

    for now in dat_read:		# 循环字节
        for nowByte in now:
            newByte = nowByte ^ xo		# 转码计算
            png_write.write(bytes([newByte]))		# 转码后重新写入

    dat_read.close()
    png_write.close()


def Format(f):
    """
    计算异或值
    各图片头部信息
    png: 89 50 4e 47
    jpeg:ff d8 ff
    gif: 47 49 46 38
    """
    dat_r = open(f, "rb")

    try:
        a = [(0x89, 0x50, 0x4e), (0xff, 0xd8, 0xff), (0x47, 0x49, 0x46)]
        for now in dat_r:
            j = 0
            for xor in a:
                j = j + 1  # 记录格式 1:png 2:jpeg 3:gif
                i = 0
                res = []
                now2 = now[:3]		# 取前三组判断
                for nowByte in now2:
                    res.append(nowByte ^ xor[i])
                    i += 1
                if res[0] == res[1] == res[2]:
                    return res[0], j
    except:
        pass
    finally:
        dat_r.close()

# 运行
if __name__ == '__main__':
    main(into_path, out_path)

运行此脚本,会显示Dat图片转换进度,运行完自动关闭。

图片

2、WxDatViewer工具

这款小工具着眼于对聊天图片进行直接、批量的整理,除了能批量把电脑端微信加密后的 dat 文件导出为图片外,还能直接批量查看dat图片,更是提供了诸如仅查看重复图片、过滤指定类型/大小/画面尺寸/时间范围的图片等选项,方便删除不重要的dat图片,特别适合整理PC端大量的微信图片文件

具体可以看作者介绍,因为没有什么上手难度,所以就没必要说太多!概括为强大、便携、速度快,所见即所得!!!

个人建议拷贝副本来转换,再三确认不需要了再删除!数据无价谨慎操作!!!

图片

3、参考资料

【微信取证篇】电脑版微信的照片视频文件位置变化

微信dat图片批量解密、查看、整理工具:WxDatViewer 2.5 - 吾爱破解

总结

加密可以有效防止其他人未经授权地访问和查看你的图片,在数据安全、个人隐私保护方面,这条路还很长!

书写片面,纯粹做个记录,有错漏之处欢迎指正。

公众号回复关键词【微信取证】自动获取资源合集,如链接失效请留言,便于及时更新。

【声明:欢迎转发收藏,喜欢记得点点赞!转载引用请注明出处,著作所有权归作者 [蘇小沐] 所有】

【注:本文的软件资源等收集于官网或互联网共享,如有侵权请联系删除,谢谢!】

记录
开始编辑:2024年 01月 21日
最后编辑:2024年 01月 24日

【往期精彩回顾】

图片

▲ 【微信取证篇】电脑版微信的照片视频文件位置变化

图片

▲ 【微信取证篇】取证遇到微信昵称、微信号、微信账号、微信ID一次性区分清楚(更新)

图片

▲ 【微信取证篇】聊聊微信聊天记录的删除与数据恢复

  • 27
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DFIR蘇小沐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值