80 lines
2.3 KiB
Python
80 lines
2.3 KiB
Python
"""
|
||
dat文件和源图片文件就是用某个数按字节异或了一下,异或回来就可以了,
|
||
A ^ B = C
|
||
B ^ C = A
|
||
A ^ C = B
|
||
假设png文件头是A,dat文件是C,用A和C文件头的字节异或就可以得出B,因
|
||
为图片的格式以png,jpg,gif为主,通过这三种文件格式的头两个字节和待
|
||
转换文件的头两个字节一一异或的结果相等就找到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") |