一、密码文件结构
密码文件结构可以表示
如下:
struct file_ewh.db
{
FileHeader *header; file://文件头
FileBlock *blocks; file://文件块数组
}
文件的图形结构如下:
___________________________________
文件头 文件块一 文件块二 .......
-----------------------------------
下面我们就分别分析文件头和文件块的结构。
1.文件头。
文件头共6字节,第一字节固定为51('Q'),第二字节固定为44('D'),第三、四字节都为01。第5个字节开始的16位数据表示文件块的个数。
2.文件块。
文件块的结构如下:
struct FileBlock
{
int8 type; file://块的类型(QQ里面只使用了4和7两种)
int16 nameLen; file://块名字的长度
int8 name[nameLen];//块的名字
int32 dataLen; file://块数据长度
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=(!m)"al;//al在这里指的是密码块数据的长度
file://上面的文件中al=10h;
}
密码文件结构可以表示
如下:
struct file_ewh.db
{
FileHeader *header; file://文件头
FileBlock *blocks; file://文件块数组
}
文件的图形结构如下:
___________________________________
文件头 文件块一 文件块二 .......
-----------------------------------
下面我们就分别分析文件头和文件块的结构。
1.文件头。
文件头共6字节,第一字节固定为51('Q'),第二字节固定为44('D'),第三、四字节都为01。第5个字节开始的16位数据表示文件块的个数。
2.文件块。
文件块的结构如下:
struct FileBlock
{
int8 type; file://块的类型(QQ里面只使用了4和7两种)
int16 nameLen; file://块名字的长度
int8 name[nameLen];//块的名字
int32 dataLen; file://块数据长度
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=(!m)"al;//al在这里指的是密码块数据的长度
file://上面的文件中al=10h;
}
回复Comments
{commenttime}{commentauthor}
{CommentUrl}
{commentcontent}