下面說明QQ本地文件加密的問題。QQ本地密碼文件保存在文件ewh.db中,加密方式是MD5和簡單位變換的結(jié)合。
一:密碼文件結(jié)構(gòu)
密碼文件結(jié)構(gòu)可以表示如下:
struct file_ewh.db
{
FileHeader *header; //文件頭
FileBlock *blocks; //文件塊數(shù)組
}
文件的圖形結(jié)構(gòu)如下:
___________________________________
文件頭 文件塊一 文件塊二 .......
-----------------------------------
下面我們就分別分析文件頭和文件塊的結(jié)構(gòu)。
1.文件頭。
文件頭共6字節(jié),第一字節(jié)固定為51('Q'),第二字節(jié)固定為44('D'),第三、四字節(jié)都為01。第5個字節(jié)開始的16位數(shù)據(jù)表示文件塊的個數(shù)。
2.文件塊。
文件塊的結(jié)構(gòu)如下:
struct FileBlock
{
int8 type; //塊的類型(QQ里面只使用了4和7兩種)
int16 nameLen; //塊名字的長度
int8 name[nameLen];//塊的名字
int32 dataLen; //塊數(shù)據(jù)長度
int8 data[dataLen];//塊數(shù)據(jù)
}
為了方便,這里的int8代表一個字節(jié),余者類推。
實際例子:
我自己的QQ的密碼文件(不要破解我的。。鋽(shù)據(jù)如下:
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個字節(jié)。
看的出來,文件中有3塊,類型分別為4,7,4。后面要說的,7代表密碼塊。
ewh.db密碼文件的第3個文件塊的數(shù)據(jù)內(nèi)容是密碼文件對應的QQ號碼。就是最后的4個字節(jié)的內(nèi)容。
大家可以隨便分析一下,看看文件結(jié)構(gòu)是否符合。
二:QQ的加密算法
ewh.db里面保存了密碼加密后的結(jié)果。其中,第一個數(shù)據(jù)塊的數(shù)據(jù)是密碼進行MD5加密的輪次,第二個數(shù)據(jù)塊是加密后的結(jié)果。
其加密過程簡單的描述如下:
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在這里指的是密碼塊數(shù)據(jù)的長度
//上面的文件中al=10h;
}
后記,QQ的加密算法和加密文件其實就這么簡單。由于筆者第一次實際分析程序(以前只有理論水平),所以,花了3到4天才分析清楚,分析的匯編函數(shù)可能有30-40多個吧,反正寫的筆記都有20多頁了(A4的紙張),還打印了16張代碼。
另外,數(shù)據(jù)塊的名字也是加密過的(算法類上),上面的例子中的3個塊的名字分別為:"AST"、"EWH"和"UIN"。其實我還分析出了一些QQ的內(nèi)存里面類的結(jié)構(gòu),只是沒有什么大用處,但我還是明白了加深類的層次將給解密者帶來極大的痛苦(QQ文件在內(nèi)存中表示的有4層指針)。
一點補充:
常常有人問怎么離線看本地電腦的聊天紀錄。
其實很簡單,把你QQ密碼文件的最后4字節(jié)修改成別人的QQ號碼,然后,拷貝這個文件到別人的號碼的目錄下覆蓋它的密碼文件就可以了。當然了,登陸的密碼就是你自己的QQ密碼了。