laironggui 发表于 2024-7-30 15:18

微信聊天记录的图片DAT文件还原

本帖最后由 laironggui 于 2024-7-30 15:25 编辑

微信聊天记录里的图片忘记保存原图过期了怎么办?备份微信聊天记录,图片全是一些DAT文件,无法直接预览,怎么办?
每次找个资料都可能会遇到这个问题,纠结来纠结去,终于找到了解决方案了。
可以把需要恢复的图片(在电脑的聊天记录存储里,查找*.dat,找到聊天记录时间附近的文件拷贝出来)

然后通过执行python脚本,直接得到解析后的图片成果:

完美~~~~

附代码:


# -*- coding:utf-8 -*-
import os

into_path = r'D:/test1'# 微信图片DAT文件存放路径
out_path = r"D:/test2"   # 转换后的图片存放路径

def main(into_path, out_path):
    dat_list = dat_files(into_path)
    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]
      imageDecode(temp_path, dat_file_name, out_path)
      value = round((num / lens) * 100, 2)
      print('正在处理--->[{}/{}] {}%'.format(num, lens, value))

def dat_files(file_dir):
    dat = []
    for files in os.listdir(file_dir):
      if os.path.splitext(files) == '.dat':
            dat.append(files)
    return dat

def imageDecode(temp_path, dat_file_name, out_path):
    dat_read = open(temp_path, "rb")
    xo, j = Format(temp_path)
    if j == 1:
      mat = '.png'
    elif j == 2:
      mat = '.gif'
    else:
      mat = '.jpg'
    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())
    dat_read.close()
    png_write.close()


def Format(f):
    dat_r = open(f, "rb")
    try:
      a = [(0x89, 0x50, 0x4e), (0x47, 0x49, 0x46), (0xff, 0xd8, 0xff)]
      for now in dat_r:
            j = 0
            for xor in a:
                j = j + 1
                i = 0
                res = []
                now2 = now[:3]
                for nowByte in now2:
                  res.append(nowByte ^ xor)
                  i += 1
                if res == res == res:
                  return res, j
    except:
      pass
    finally:
      dat_r.close()


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




000ADC 发表于 2024-7-31 18:22

根据楼主的代码处理了一下,做个了EXE文件,需要的可以下载一下,链接:https://pan.baidu.com/s/19Y41O9jaxfs4OA7UwLtoMw?pwd=du3r
提取码:du3r

Jason_R 发表于 2024-8-7 14:25

000ADC 发表于 2024-7-31 18:22
根据楼主的代码处理了一下,做个了EXE文件,需要的可以下载一下,链接:https://pan.baidu.com/s/19Y41O9ja ...

感谢分享

eakon1 发表于 2024-8-2 10:12

纯小白,有代码我都不会用.

wujn 发表于 2024-8-21 11:20

000ADC 发表于 2024-7-31 18:22
根据楼主的代码处理了一下,做个了EXE文件,需要的可以下载一下,链接:https://pan.baidu.com/s/19Y41O9ja ...

试用了下,非常完美

amansbj 发表于 2024-11-11 11:18

感谢楼主分享!
实际测试了一下,有一些文件无法解析。
以下是GPT优化了一下的。


# -*- coding:utf-8 -*-
import os

into_path = r'D:\Administrator\下载\Compressed'# 微信图片DAT文件存放路径
out_path = r"D:\Administrator\下载\Documents"   # 转换后的图片存放路径

def main(into_path, out_path):
    dat_list = dat_files(into_path)
    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]
      imageDecode(temp_path, dat_file_name, out_path)
      value = round((num / lens) * 100, 2)
      print('正在处理--->[{}/{}] {}%'.format(num, lens, value))

def dat_files(file_dir):
    dat = []
    for files in os.listdir(file_dir):
      if os.path.splitext(files) == '.dat':
            dat.append(files)
    return dat

def imageDecode(temp_path, dat_file_name, out_path):
    dat_read = open(temp_path, "rb")
    xo, j = Format(temp_path)
    if j == 1:
      mat = '.png'
    elif j == 2:
      mat = '.gif'
    else:
      mat = '.jpg'
    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())
    dat_read.close()
    png_write.close()


def Format(f):
    dat_r = open(f, "rb")
    try:
      a = [(0x89, 0x50, 0x4e), (0x47, 0x49, 0x66), (0xff, 0xd8, 0xff)]
      for now in dat_r:
            j = 0
            for xor in a:
                j = j + 1
                i = 0
                res = []
                now2 = now[:3]
                for nowByte in now2:
                  res.append(nowByte ^ xor)
                  i += 1
                if res == res == res:
                  return res, j
    except Exception as e:
      print(f"An error occurred: {e}")# 打印错误信息,帮助调试
    finally:
      dat_r.close()
    # 如果没有找到匹配项,返回一个默认值,例如 (0, 0)
    return 0, 0


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

shihuotiantang1 发表于 2024-11-2 20:06

000ADC 发表于 2024-7-31 18:22
根据楼主的代码处理了一下,做个了EXE文件,需要的可以下载一下,链接:https://pan.baidu.com/s/19Y41O9ja ...

360怎么报毒 怎么破

laotzudao0 发表于 2024-8-18 10:33

这功能很实用,谢谢

mishuai 发表于 2024-9-25 14:36

000ADC 发表于 2024-7-31 18:22
根据楼主的代码处理了一下,做个了EXE文件,需要的可以下载一下,链接:https://pan.baidu.com/s/19Y41O9ja ...

{:1_921:}感谢热心人

xiaoxing365 发表于 2024-11-21 16:21

谢楼主,wx压缩过的图片看着是真难受,尤其是有用的时候{:1_909:}

be.Ping 发表于 2024-11-20 22:21

谢谢大佬们 支持下

heartfilia 发表于 2024-11-20 17:10

感觉不错 打算后面用其它语言试试 学习一下

heartfilia 发表于 2024-11-20 17:07

amansbj 发表于 2024-11-11 11:18
感谢楼主分享!
实际测试了一下,有一些文件无法解析。
以下是GPT优化了一下的。


辛苦了 感谢~

siqi47 发表于 2024-11-18 09:59

学习了,刚好需要

shiguang1 发表于 2024-11-18 09:55

大佬有没有 png jpg 转 dat 格式的工具

smile223 发表于 2024-11-18 09:13

太好了,需要这样软件

solasafe 发表于 2024-11-15 15:10

mac微信存储的dat文件有大佬知道在哪个目录不{:1_937:}

晚霞的红蜻蜓 发表于 2024-11-10 17:40

我就是来逛逛的,不是灌水,我认真的看了帖子。不过看不懂。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 微信聊天记录的图片DAT文件还原