QQ聊天記錄文件存儲方式解密

QQ聊天記錄文件存儲方式解密
  

最近花了幾天時間跟蹤了一下「QQ聊天記錄查看器 5.3 華軍版」,總算把聊天記錄的存儲方法弄清了。大家不要笑我,只是好奇而已,呵呵。

1.聊天記錄存儲方式

QQ聊天記錄保存在MsgEx.db文件中。以前很早的版本是保存在Msg.db中,文件結構也與現在不同,我們就不分析了。

MsgEx.db採用Storage結構化存儲。關於Storage復合文檔的知識請查閱Microsoft相關文檔,我們不做贅述。

大家可以用VC自帶的DocFile View工具查看該文件的內容,可以看到文件結構大致如下:


|----MsgEx.db
|    |----C2CMsg
|        |----QQ號碼
|            |----Data.msj
|            |----Index.msj
|    |----IMInfo
|        |----info.dat
|    |----Matrix
|        |----Matrix.db
|    |----SysMsg
|        |----10000
|            |----Data.msj
|            |----Index.msj
|    |----DiscMsg
|    |----GroupMsg
|    |----MobileMsg
|---------TempSessionMsg
 

消息內容都存儲在每個號碼下面的Data.msj中,通過Index.msj索引。消息內容是經過加密處理的,必須經過解密才能看到。

2.解密方法

消息內容採用BlowFish分組加密。每8個字節為一個分組。密鑰Key通過QQ號碼生成,具體算法稍後討論。

解密方法:

a.取前8個字節,通過BlowFish解密, 得到decryptKey;

b.decryptKey與後面8個字節XOR,對結果再進行一次BlowFish解密;

c.將decryptKey與前8個字節XOR,得到第一組結果;

d.decryptKey與後面8個字節XOR,重複b,c兩步;

e.最終全部數據解密完畢。

最後會剩下一組8字節無法解密,這個實際上是冗餘數據,似乎是用來作為校驗。

3.具體步驟

以上解密時,BlowFish的密鑰是一個全局公用密鑰Key。Key要通過QQ號碼生成,具體步驟是:

a.將QQ號碼進行MD5變換,得到Md5Key

b.取Matrix.db的數據,對其進行解碼。簡單說一下Matrix.db文件的結構:

Matrix.db採用分塊存儲,每個Record包含類型、名字長度、名字、內容長度、內容幾個字段組成。用數據結構表示就是:


struct Record{
  char rType;
  short nLen;
  char Name[nLen];
  int rLen;
  char Content[rLen];
};
 

初始內容也是通過加密存儲的。解密方法很簡單:將長度的低位字節和高位字節XOR,得到key;將內容逐個與key進行XOR,就得到結果。對名字和內容分別進行解密即可。解密後會看到STL, TIP, CRK, CPH, CAH等字段,不清楚具體的啥含義,感興趣的同學可以自己去研究研究。我們要用到的是CRK字段,長度為32字節(如果本地聊天記錄加密,可能會有變化,沒試過)。將得到的CRK字段作為pData。

c.用Md5Key對pData進行BlowFish解密,得到全局密鑰Key

4.結論

以上討論的都是本地聊天記錄沒有加密的情況。如果選擇了加密,沒有密碼是肯定解不出來滴,大伙就不用費心了。

共2頁 上一頁 1 2 下一頁
綜合資訊大全
金牌測算
免費起名
免費測名
個性網名
個性簽名
個性資料