QQ2004 sp1加密檔案結構和加密演算法分析
作者:衝出宇宙(lotusroots)
完成時間:2004.12.3
型別:作者原創
我的本意是寫個暴力破解QQ本地密碼的程式,不過,現在才發現QQ好惡心,迴圈加密了n(n>60000)次。東西還是能寫出來的,不過,可能需要很長時間才能算出一個短密碼了。唉!回去再看看自己寫的MD5演算法,看看什麼地方可以大幅度改進的。再不行的話,就看看能不能寫成萬臺機器聯機的形式,這個可能需要從解密演算法上入手了。
好了,不講什麼廢話了,下面說明QQ本地檔案加密的問題。QQ本地密碼檔案儲存在檔案ewh.db中,加密方式是MD5和簡單位變換的結合。
一:密碼檔案結構。
密碼檔案結構可以表示如下:
struct file_ewh.db
{
FileHeader *header; //檔案頭
FileBlock *blocks; //檔案塊陣列
}
檔案的圖形結構如下:
___________________________________
| | | | |
|檔案頭|檔案塊一|檔案塊二|....... |
| | | | |
-----------------------------------
下面我們就分別分析檔案頭和檔案塊的結構。
1.檔案頭。
檔案頭共6位元組,第一位元組固定為51('Q'),第二位元組固定為44('D'),第三、四位元組都為01。第5個位元組開始的16位資料表示檔案塊的個數。
2.檔案塊。
檔案塊的結構如下:
struct FileBlock
{
int8 type; //塊的型別(QQ裡面只使用了4和7兩種)
int16 nameLen; //塊名字的長度
int8 name[nameLen];//塊的名字
int32 dataLen; //塊資料長度
int8 data[dataLen];//塊資料
}
為了方便,這裡的int8代表一個位元組,餘者類推。
實際例子:
我自己的QQ的密碼檔案(不要破解我的啊!),其資料如下:
00000000: 51 44 01 01 03 00 04 03 00 bd af a8 04 00 00 00
00000010: c9 6a 09 00 07 03 00 b9 ab b4 10 00 00 00 0f c5
00000020: e9 d4 31 15 2f 12 c4 1c 0a 46 95 90 db 98 04 03
00000030: 00 a9 b5 b2 04 00 00 00 69 f4 aa 02
總共60個位元組。
看的出來,檔案中有3塊,型別分別為4,7,4。後面要說的,7代表密碼塊。
大家可以隨便分析一下,看看檔案結構是否符合。
二:QQ的加密演算法
ewh.db裡面儲存了密碼加密後的結果。其中,第一個資料塊的資料是密碼進行MD5加密的輪次,第二個資料塊是加密後的結果。
其加密過程簡單的描述如下:
1)設密碼為m[],加密輪次為n;
2)for(i=0;i<n;i++) //第2個資料塊中的資料(int32)就是加密輪次
//上面檔案中的n=0x96ac9;
{
m=MD5(m);
}
3)for(i=0;i<16;i++)
{
m[i]=(!m[i])^al;//al在這裡指的是密碼塊資料的長度
//上面的檔案中al=10h;
}
後記,QQ的加密演算法和加密檔案其實就這麼簡單。由於本人第一次實際分析程式(以前只有理論水平),所以,花了3到4天才分析清楚,分析的彙編函式可能有30-40多個吧,反正寫的筆記都有20多頁了(A4的紙張),還列印了16張程式碼。
另外,資料塊的名字也是加密過的(演算法類上),上面的例子中的3個塊的名字分別為:“AST”、“EWH”和“UIN”。其實我還分析出了一些QQ的記憶體裡面類的結構,只是沒有什麼大用處,但我還是明白了加深類的層次將給解密者帶來極大的痛苦(QQ檔案在記憶體中表示的有4層指標)。