下面說明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代表密碼塊。
ewh.db密碼文件的第3個文件塊的數據內容是密碼文件對應的QQ號碼。就是最后的4個字節的內容。
大家可以隨便分析一下,看看文件結構是否符合。
二:QQ的加密算法
ewh.db里面保存了密碼加密后的結果。其中,第一個數據塊的數據是密碼進行MD5加密的輪次,第二個數據塊是加密后的結果。
其加密過程簡單的描述如下:
1)設密碼為m[],加密輪次為n;
2)for(i=0;i//上面文件中的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層指針)。
一點補充:
常常有人問怎么離線看本地電腦的聊天紀錄。
其實很簡單,把你QQ密碼文件的最后4字節修改成別人的QQ號碼,然后,拷貝這個文件到別人的號碼的目錄下覆蓋它的密碼文件就可以了。當然了,登陸的密碼就是你自己的QQ密碼了。

