0x00 定義
.dat文件不是標准的文件格式,很多應用都會使用這個后綴存儲數據。一般只能通過產生該文件的程序正確訪問,如QQ、微信都會產生.dat文件。
以微信為例。微信使用該后綴的文件存儲圖片(顯然是不如聊天記錄那么機密,沒有存儲為.db文件),文件保存於FileStorage文件夾。以十六進制方式查看這些文件,可以發現許多文件的頭部字節為8A AD
,也有17 CE
等。
實際上微信程序是將圖片的每個字節與某個值異或后進行存儲的(異或是對文件加解密的基本操作之一)。
0x01 提取
常見的后綴都有獨特的文件頭:
格式 | 頭部 |
---|---|
.jpg | FF D8 FF |
.png | 89 50 4E 47 |
.bmp | 42 4D |
.gif | 47 49 46 38 |
.zip | 50 4B 03 04 |
.rar | 52 61 72 21 |
.avi | 41 56 49 20 |
使用異或性質還原出常量(由於是逐字節操作,常量應當是由兩個相同的字節構成的):
很巧合,使用.jpg的頭部得到的常量就是正確的。
利用這個常量對原文件的每個字節按位異或即可還原出圖片了(還原成功就說明思路可行)。
0x02 試驗
基於一道實戰題目:
其頭部為17 CE
,使用.jpg頭部的計算結果顯然是有問題的:
但是使用.png的頭部似乎得到了正確的常量:
0x03 腳本
編寫一個腳本執行按位異或:
# -*- coding: utf-8 -*-
# 常量為9E9E
def decodeHack(fi, fo):
data_in = open(fi, 'rb')
out = './' + fo + '.png'
data_out = open(out, 'wb')
for i in data_in:
for byte in i:
new_byte = byte ^ 0x9E
data_out.write(bytes([new_byte]))
data_in.close()
data_out.close()
if __name__ == "__main__":
decodeHack('./keli.dat', 'hack_output')