PC版微信加密图片解密思路与代码实现_Python

PC版微信加密图片解密思路与代码实现_Python

前言

PC版的微信会加密存储用户接受到的所有图片信息。
存储路径为
C:\Users\用户名\Documents\WeChat Files\微信号\FileStorage\Image\xxxx-xx

存储的文件均为DAT格式。不能直接打开。当用户删掉聊天记录后,又想找回丢失的图片文件会造成一定的困扰。如果能找到其加密方式就能对这类文件解密还原成jpg/png/gif等常见的文件格式。
在这里插入图片描述

解密思路

  • 这类对文件加密的方式很容易让人联想到“异或法加密”,即对文件逐个字节与加密码进行异或计算得到加密文件。
  • 使用16进制的方式打开DAT文件,可见几乎前两个字节均为 0xDF,0xF8。
    在这里插入图片描述
  • 而jpg头信息前两个字节为0xFF, 0xD8。用0xDF与0xFF做异或运算,0xF8与0xD8做异或运算。结果均为0x20。因此可得加密码为0x20(但在实际操作中,每个用户的加密码都不一样,需要在程序中计算出的加密码)。
    在这里插入图片描述
  • 基于这样的思路,对每个DAT文件的所有字节与相应的加密码进行异或计算即可解密DAT文件。

代码实现

居于以上的解密思路,通过简单的Python文件操作方法即可对文件进行解密。代码实现中,只对常用的jpg/png/gif文件进行操作。

import os
# 图片字节头信息,
[0][1]为jpg头信息,
[2][3]为png头信息,
[4][5]为gif头信息
pic_head = [0xff, 0xd8, 0x89, 0x50, 0x47, 0x49]
# 解密码
decode_code = 0

def get_code(file_path):
    """
    自动判断文件类型,并获取dat文件解密码
    :param file_path: dat文件路径
    :return: 如果文件为jpg/png/gif格式,则返回解密码,否则返回0
    """
    dat_file = open(file_path, "rb")
    dat_read = dat_file.read(2)
    head_index = 0
    while head_index < len(pic_head):
    # 使用第一个头信息字节来计算加密码
    # 第二个字节来验证解密码是否正确
        code = dat_read[0] ^ pic_head[head_index]
        idf_code = dat_read[1] ^ code
        head_index = head_index + 1
        if idf_code == pic_head[head_index]:
            dat_file.close()
            return code
        head_index = head_index + 1

    print("not jpg, png, gif")
    return 0


def decode_dat(file_path):
    """
    解密文件,并生成图片
    :param file_path: dat文件路径
    :return: 无
    """
    decode_code = get_code(file_path)
    dat_file = open(file_path, "rb")
    pic_name = file_path + ".jpg"
    pic_write = open(pic_name, "wb")
    for dat_data in dat_file:
        for dat_byte in dat_data:
            pic_data = dat_byte ^ decode_code
            pic_write.write(bytes([pic_data]))
    print(pic_name + "完成")
    dat_file.close()
    pic_write.close()


def find_datfile(dir_path):
    """
    获取dat文件目录下所有的文件
    :param dir_path: dat文件目录
    :return: 无
    """
    files_list = os.listdir(dir_path)
    for file_name in files_list:
        file_path = dir_path + "\\" + file_name
        decode_dat(file_path)


path = input("请输入需要解密微信dat文件的目录:")
find_datfile(path)

运行效果

  • 微信存储的加密文件如下
    在这里插入图片描述
  • 运行代码
    在这里插入图片描述
  • 解密成功
    在这里插入图片描述

挖坑

等有空用pyqt做个GUI版。。。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值