完全解析QQ2004 sp1的本地加密策略!(原創)

看雪資料發表於2004-12-04

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層指標)。

相關文章