最近在整理磁盤文件,因為經過一段時間的蹂躪后,磁盤實在是太多東西了,不整理一下,簡直對不住我的SSD好嘛。
偶然發現磁盤中某公司的文件夾占用空間簡直不能再大,那可是我的C盤啊,合計才119GB的SSD空間,你給我占了差不多10個G,說的就是你Tencent。
但是也不能怪人家,畢竟人家只是負責將數據保存下來方便給我們展示而已。
所以,就冒着好奇的心,看看文件夾里面有什么。
因為這次的主題說的是Dat文件的解密,我就不扯那么遠。
大家假裝知道我點完文件夾,看到很多歷史圖片緩存圖片眾多*.db就好了哈。(PS:不得不提的是騰訊將近給我緩存了6個G的表情包,未來可以收集這個內容做一個隨機表情包網頁出來樂呵樂呵呀。咳咳這些都是后話啦)
然后我們便來到了微信PC版的文件夾,找到自己的賬號所在文件夾。比如我的是CBR-1997。找到后,如下所示
這個時候,我便猜測,這些dat文件都是什么內容呢?聊天內容?不可能呀,聊天內容這么機密,肯定是放到db里面加密處理的。聊天文件?也不至於有1700+個文件吧。所以,綜上,猜測這些個dat文件都是一些聊天時接收到的“表情包”或者“圖片”。嗯,平時那些群聊斗圖這么凶,估計沒錯了的。
接下來,嘗試直接改后綴試試。不出意外的得到了“圖片錯誤”,我就知道不會這么簡單。
那接下來怎么辦嘛。思來想去,便想着拿16進制編輯器看一下下,里面數據長啥樣。
打開了多個文件看到里面文件頭是8A AD ,但是一般jpg文件的文件頭為FF D8 開頭的。
又記得之前看過說文通過異或對文件進行簡單的加解密的很常規的做法。所以,打開計算器。一頓操作猛如虎,哈哈哈,結果一看沒錯遼,
將計算器調整到程序員模式,然后使用FFD8與8AAD進行異或處理。結果為7575,顯然可以知道,這個dat就是微信將收取到的文件對嗎,每個字節進行異或0x75進行加密,保存為dat文件。
這個時候,只要用Python寫個腳本,不就可以輕松解碼了嘛。
跑出來的結果如下圖,沒錯吧,以往的表情包,發過收過的圖片都出現在了里面。
至此微信dat文件的復原解碼到此就完成了。補充一下,每個賬號或者客戶端對那個異或值都是不一樣的,所以,小伙伴們如果需要還原dat文件的話,還是要自己用計算器異或處理一波哦。看看這個值是多少哈。
//修改圖片 //修改圖片 let fs = require('fs'); let path = require('path'); let async = require('async'); //值是多少自己算。 let base = 0xFF; let next = 0xD8; let gifA = 0x47; let gifB = 0x49; let pngA = 0x89; let pngB = 0x50; let scanDir = 'd:/ttt/load/'; let imgDir = 'd:/ttt/load1/'; let files = fs.readdirSync(scanDir); var arr = []; files.forEach(function(item){ if(path.extname(item) == '.dat'){ arr.push(item); } }) async.mapLimit(arr,50,function(item,cb){ convert(item,cb); },function(){ process.exit(0); }) //convert function convert(item,cb){ let absPath =path.join(scanDir,item); let imgPath = path.join(imgDir,item+'.jpg'); fs.readFile(absPath,(err,content)=>{ if(err){ console.log(err); cb(err); } let firstV = content[0], nextV = content[1], jT = firstV ^ base, jB = nextV ^ next, gT = firstV ^ gifA, gB = nextV ^ gifB, pT = firstV ^ pngA, pB = nextV ^ pngB; var v = firstV ^ base; if(jT == jB){ v = jT; }else if(gT == gB){ v = gT; }else if(pT == pB){ v = pT; } let bb = content.map(br=>{ return br ^ v }) fs.writeFileSync(imgPath,bb) cb(null); }) }
同時提供了一個在線服務,可以直接免費解碼哦。
如果有代碼基礎,可以直接根據代碼實現解碼。