刷题的时候碰见一个dat文件解密的题
平时在微信的文件夹中也会碰到,但是没有关注过是什么东西
后来才知道是微信传输文件时进行加密以后的文件数据
查阅以后得知dat文件只是进行了简单的异或运算的加密存储,所以只需要很简单进行一次异或得到加密的密钥就可以解密这个文件
常见的文件头有:
由于异或运算的特殊性,a xor b=c。则:a xor c=b.
所以只需要取dat文件的前两个字节与常见文件头进行异或,如果得到的两个字节相同,则这个字节就是密码了(一般微信dat文件都只是用一个字节的密钥进行加密
上代码:
#微信dat文件解密
import base64
import struct,binascii
def getDat():
dic={0xFFD8:"JPG",0x8950:"PNG",0x424D:"BMP",0x4749:"GIF",0x504B:"ZIP",0x5261:"RAR",0x4156:"AVI"}
li=list(dic.keys())
with open("keli.dat","rb")as f:
data=f.read(2)
data=str(binascii.b2a_hex(data))[2:-1]
data=int(data,16)
for i in li:
j=hex(i ^data)
if(j[2:4]==j[4:6]):
key=j[0:4]
print("key:",key)
tail=dic[i]
print("文件格式为:",tail)
break
f.seek(0,0)
with open("result."+tail,'wb')as out:
for now in f:
for nowByte in now:
by=nowByte^int(key,16)
out.write(bytes([by]))
#主函数
if __name__ == '__main__':
print("/*Begin*\\")
getDat()
原本的文件:
解密以后的文件:
得到flag:
直接QQ识图
bugku{WeChatwithSteg0}