we-chat-dat/WeChat.py
2020-10-23 15:07:05 +08:00

80 lines
2.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
dat文件和源图片文件就是用某个数按字节异或了一下异或回来就可以了
A ^ B = C
B ^ C = A
A ^ C = B
假设png文件头是Adat文件是C用A和C文件头的字节异或就可以得出B
为图片的格式以pngjpggif为主通过这三种文件格式的头两个字节和待
转换文件的头两个字节一一异或的结果相等就找到B了同时也知道了文件的
格式
"""
import os
import binascii
from datetime import datetime
def get_top_2hex(path):
"""
获取文件的前两个16进制数
"""
data = open(path,'rb')
hexstr = binascii.b2a_hex(data.read(2))
return str(hexstr[:2], 'utf8'), str(hexstr[2:4], 'utf8')
"""
JPG文件头16进制为0xFFD8FF
PNG文件头16进制为0x89504E
GIF文件头16进制为0x474946
"""
def parse(dir):
firstV, nextV = get_top_2hex(dir)
firstV = int(firstV, 16)
nextV = int(nextV, 16)
coder = firstV ^ 0xFF
kind = 'jpg'
if firstV ^ 0xFF == nextV ^ 0xD8:
coder = firstV ^ 0xFF
kind = 'jpg'
elif firstV ^ 0x89 == nextV ^ 0x50:
coder = firstV ^ 0x89
kind = 'png'
elif firstV ^ 0x47 == nextV ^ 0x49:
coder = firstV ^ 0x47
kind = 'gif'
return coder, kind
def convert(path, file_name):
file_path = os.path.join(path, file_name)
mk_time = datetime.fromtimestamp(os.path.getmtime(file_path)).strftime('%Y-%m-%d %H.%M.%S')
coder, kind = parse(file_path)
dir_name = path.split('\\')[-1]
if not os.path.exists(dir_name):
os.mkdir(dir_name)
dat = open(file_path, "rb")
pic = open(dir_name + '\\' + mk_time + '-' + file_name[:10] + '.' + kind, "wb")
for cur in dat:
for item in cur:
pic.write(bytes([item ^ coder]))
dat.close()
pic.close()
def do(path):
files = os.listdir(path)
print('total files:{}'.format(len(files)))
i = 0
for file_name in files:
try:
print('{} ... {}'.format(i, file_name))
convert(path, file_name)
i+=1
except:
pass
if __name__=="__main__":
do(r"C:\Users\Administrator\Documents\WeChat Files\wxid_hyjv4sqk0uho22\FileStorage\Image\2020-04")