python微信数据解密-dat文件转图片(支持JPG,PNG,GIF)

python微信数据解密-dat文件转图片(JPG,PNG,GIF,附可执行文件exe)

  1. dat文件路径 (确保有路径,或自己修改)
into_path = r'C:\image'  # 微信image.dat文件路径  
  1. 输出图片路径
out_path = r"C:\image\jpg\\"
  1. 直接上代码
# weixin_Image.dat 破解
# JPG 16进制 FF D8 FF
# PNG 16进制 89 50 4e 47
# GIF 16进制 47 49 46 38
# 微信.bat 16进制 a1 86----->jpg  ab 8c----jpg     dd 04 --->png
# 自动计算异或 值
import os
into_path = r'C:\image'  # 微信image.dat文件路径   
						#我这把路径写死了,运行可执行文件前 先创建这个路径把dat文件放在这
out_path = r"C:\image\jpg\\"
"""
    解码
    param f: 微信图片路径
    param fn:微信图片目录下的.dat
    return:
"""
def imageDecode(f, fn):
    dat_read = open(f, "rb")  						# 读取.dat 文件
    xo = Format(f)  								# 判断图片格式 并计算返回异或值 
    out = out_path + fn + ".jpg"  					# 图片输出路径
    print("文件输出路径{}".format(out), end='\n\n')
    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 findFile(f):
    """
    寻找文件
    param f:微信图片路径
    return:
    """
    fsinfo = os.listdir(f) 		 					# 把路径文件夹下的文件以列表呈现
    print(fsinfo)
    for fn in fsinfo:  								# 逐步读取文件
        temp_path = os.path.join(f, fn)  			# 拼接路径:微信图片路径+图片名
        if os.path.isfile(temp_path):  				# 判断目录还是.dat  #temp_path需为绝对路径,判断是否为文件,也可 if not os.path.isdir(temp_path):
            print('找到文件路径{}'.format(temp_path))
            fn = fn[:-4]  							# 截取字符串 去掉后缀.dat
            imageDecode(temp_path, fn)  			# 转码函数
        else:
            pass




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

    try:
        a = [(0x89, 0x50, 0x4e), (0x47, 0x49, 0x46), (0xff, 0xd8, 0xff)]
        for now in dat_r:
            for xor in a:
                i = 0
                res = []
                nowg = now[:3]						#取前三个 数据信息
                for nowByte in nowg:
                    res.append(nowByte ^ xor[i])	#进行判断
                    i += 1
                if res[0] == res[1] == res[2]:		#三次异或值想等 说明就是那种格式
                    return res[0]					#返回异或值
    except:
        pass
    finally:
        dat_r.close()


# 运行
if __name__ == '__main__':
    findFile(into_path)

小白也 可以直接使用打包好的exe软件

注意:

dat文件路径:C:\image\	  没有先创建好 将要转换的微信dat文件 放到此处
图片输出路径:C:\image\jpg\

**

微信dat文件转图片.exe

**
https://download.csdn.net/download/qq_37673902/16063100



#***********************************************

闲于时间,回过头来看看,发现有一些bug,可以优化一下(2021.7.14)
bug:
1.路径文件夹下,存在非dat格式的文件 会报错。
优化:只寻找dat格式文件,没有输出提示信息,并结束程序。
2.虽然可以处理jpg,png等的格式。但只保存了jpg的,修改成对应格式转换

#***********************************************

优化后代码

具体代码如下:

# weixin_Image.dat 破解
# JPG 16进制 FF D8 FF
# PNG 16进制 89 50 4e 47
# GIF 16进制 47 49 46 38
# 微信.bat 16进制 a1 86----->jpg  ab 8c----jpg     dd 04 --->png
# 自动计算异或 值
import os

into_path = r'C:/image'  # 微信image文件路径
out_path = r"C:/image/jpg"

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)             # 显示进度
        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 = '.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([newByte]))  # 转码后重新写入

    dat_read.close()
    png_write.close()


def Format(f):
    """
    计算异或值
    各图片头部信息
    png:89 50 4e 47
    gif: 47 49 46 38
    jpeg:ff d8 ff
    """
    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  # 记录是第几个格式 1:png 2:gif 3:jpeg
                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)

谢谢阅读,感谢支持!如有错误,请多多指教
在这里插入图片描述

  • 26
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 34
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

洛星尘pro

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

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

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

打赏作者

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

抵扣说明:

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

余额充值