电脑端微信用户图片DAT格式解码为图片

 电脑硬盘空间被大量占用发现是微信自己账号下的Image文件夹引起的,因不清楚里面的图片有些是否有用。想逐一整理清理。

 

 进去后发现都是dat格式,无法打开。修改后缀后仍无法打开,被加密了。

 二进制方式打开文件后发现是这样的规律。通过异或运算加密了。


jpg:
ff d8 ff e0 20 10 4a 46 49 46 20 01 01 
加密后:
17 30 17 08 e8 f8 a2 ae a1 ae e8 e9 e9


png:
89 50 4e 47 0d 0a 1a 0a 20 20 20 0d
加密后:  
61 b8 a6 af e5 e2 f2 e2 e8 e8 e8 e5

 解码代码如下(批量操作):

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
    功能:电脑端微信用户图片DAT格式转化为图片
    环境:python3.7
    日期:2019/12/31 22:28
    作者:指尖魔法师
    版本:1.0
"""
import os

def main():
    indir = r'G:\wx\2019-06'
    outdir = r'G:\wx\out2019-06'

    # 获取文件夹下所有文件
    infiles = os.listdir(indir)

    # 计数成功的文件个数
    count = 0

    # 循环每个文件进行判断、转换
    for infile in infiles:
        # 获取文件名
        filename = infile[0:infile.find('.')]

        # 二进制读取文件
        f1 = open(os.path.join(indir, infile), 'rb')
        infilebytes = f1.read()
        newfile = []

        # 判断图片类型JPG,通过异或判定
        if (infilebytes[0] ^ 0xFF) == (infilebytes[1] ^ 0xD8):
            y1 = infilebytes[0] ^ 0xFF
            print('%s,文件是JPG图片,每个字节是根据0x%X异或进行加密' % (infile, y1))

            # 字节进行异或转换,组合成新的文件
            for i in infilebytes:
                newbyte = i ^ y1
                newfile.append(newbyte)
            newfile2 = bytes(newfile)

            # 写入新文件
            f2 = open(os.path.join(outdir, filename+'.jpg'), 'wb')
            f2.write(newfile2)
            count += 1

        # 判断图片类型PNG,通过异或判定
        elif (infilebytes[0] ^ 0x89) == (infilebytes[1] ^ 0x50):
            y1 = infilebytes[0] ^ 0x89
            print('%s,文件是PNG图片,每个字节是根据0x%X异或进行加密' % (infile, y1))
            for i in infilebytes:
                newbyte = i ^ y1
                newfile.append(newbyte)
            newfile2 = bytes(newfile)
            f2 = open(os.path.join(outdir, filename+'.png'), 'wb')
            f2.write(newfile2)
            count += 1

        # 判断图片类型GIF,通过异或判定
        elif (infilebytes[0] ^ 0x47) == (infilebytes[1] ^ 0x49):
            y1 = infilebytes[0] ^ 0x47
            print('%s,文件是GIF图片,每个字节是根据0x%X异或进行加密' % (infile, y1))
            for i in infilebytes:
                newbyte = i ^ y1
                newfile.append(newbyte)
            newfile2 = bytes(newfile)
            f2 = open(os.path.join(outdir, filename+'.gif'), 'wb')
            f2.write(newfile2)
            count += 1
        else:
            print('%s无法识别的类型!' % infile)
    print('识别出图片%d张' % count)


if __name__ == '__main__':
    main()

运行结果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章