解wechat dat to jpg

2021-10-07

需要改入参地址和出参地址

import os
import binascii
import datetime

"""将目录下的文件按照最后修改时间顺序升序排列"""


def getFileList(path):
    dirLists = os.listdir(path)
    if not dirLists:
        return
    else:
        dirLists = sorted(
            dirLists, key=lambda f: os.path.getmtime(os.path.join(path, f)))
        print('文件数量:{}个\n最新文件名为<{}>'.format(len(dirLists), dirLists[-1]))
        return dirLists


"""获取文件的16进制前多少位,如4位、6位"""


def getFileHex(path, step):
    fileName = getFileList(path)[-1]
    fileData = open(path+'\\'+fileName, 'rb')
    hexstr = binascii.b2a_hex(fileData.read())
    hex = str(hexstr)[2:step+2]  # 获取16进制前多少位,4或6位
    print('dat十六进制文件头前{}位为:{}'.format(step, hex))
    return hex


"""
16进制异或运算
"""


def Xor(dir):
    hex2 = int(getFileHex(dir, 2), 16)
    """先取前四位,再取前两位,运算结果一致才算获得解密偏移量"""
    jpg = int('ff', 16)  # jpeg文件头16进制为ffd8ff
    png = int('89504E47', 16)  # png文件头16进制为89504E47
    gif = int('47494638', 16)  # gif文件头16进制为47494638
    return hex(hex2 ^ jpg)


def convertImg(file, fileName, step):
    dat = open(file, "rb")
    out = '游艇\\其他\\'+fileName+'.jpg'
    newFile = open(out, "wb")

    for cur in dat:
        for hex in cur:
            originHex = hex ^ step
            newFile.write(bytes([originHex]))

    dat.close()
    newFile.close()
    print('转换完成文件:{}'.format(out))


def main(dir, date1, date2):
    files = os.listdir(dir)
    format_ = '%Y-%m-%d %H:%M:%S'
    step = int(Xor(dir), 16)
    print('十进制偏移量为{}'.format(step))
    i = 0
    for fn in files:
        _path = os.path.join(dir, fn)
        _time = os.path.getmtime(_path)
        dt_time = datetime.datetime.fromtimestamp(_time).strftime(format_)

        if dt_time < date1 or dt_time > date2:
            continue

        if not os.path.isdir(_path):
            print('当前文件: {}' .format(_path))
            convertImg(_path, fn, step)
            i += 1

    print('总计转换图片文件{}个'.format(i))


"""
自动判断微信PC客户端加密文件dat后缀格式图片16进制文件头
自动计算图片文件解密偏移量并转换为可用的图片文件(jpg|png|gif)
可指定具体微信图片缓存本地的日期时间范围进行转换图片提取
JPG文件头16进制为FFD8FF
PNG文件头16进制为89504E47
GIF文件头16进制为47494638
ROCEYS.CN
2019-12-26 01:16:00
"""

if __name__ == "__main__":
    dir = r'\Image\2021-10'
    d1 = '2021-10-02 00:12:00'
    d2 = '2021-10-07 20:20:59'
    main(dir, d1, d2)

copyright ©2019-2024 shenzhen
粤ICP备20041170号-1