QQ密码文件EWH.DB分析(一)

来源:互联网 发布:美发软件下载 编辑:程序博客网 时间:2024/05/16 08:11
 
QQ在登录时,需要输入密码,密码正确方能登陆成功。基本机制是:将输入的QQ密码进行加密,采用公开的MD5算法,通过N次循环以及异或后求反,最终计算出加密的结果,与用户的ewh.db文件中的密文比较后,发出“输入密码与上次成功登录的密码不一致,$0A是否到服务器验证?”(该信息在BasicCtrlDll.dll的资源中,$0A在C的格式化中为回车)。根据该机制,可以完成本地QQ密码的暴力破解。 拿到QQ2005贺岁版后,发现其加密原理并没有新的改变,经过跟踪和分析,编制出暴力破解本地QQ密码的程序。  在QQ系统中,“QD”标志代表QQData,例如,我们可以在文件User.db或ewh.db中找到这个以QD开头的数据结构。 下面介绍ewh.db的详细数据信息

一、 ewh.db原始数据

00 00 00 00h:  51 44 01 01 03 00 04 03 00 BD AF A8 04 00 00 00
00 00 00 10h:  00 2E 06 00 07 03 00 B9 AB B4 10 00 00 00 07 22
00 00 00 20h:  AA 96 56 19 A3 9E 82 19 B7 2B BD 2D 34 4A
04 03
00 00 00 30h:  00 A9 B5 B2 04 00 00 00 3C A8 93 06

其中,红色为AST循环次数,兰色为EWH加密字符串,绿色为UIN QQ号(110340156=0x0693A83C,Intel体系内存中排列顺序为:3CA89306)。

二、 ewh.db数据结构

HEX偏移 DEC偏移 数据  注释 变量 标志
0000 1   51 44    QD    QQ Data     数据标志 Flag
0002 3   01 01 保留的数据结构 Reserve
0004 5   03 00 总数据段(Data Sections)的个数 Sections
0006 7   04 第一个数据段(简称1S)的类型,可以从0x01到0x0F,04代表数据没经过加密处理 Type1S
0007 8   03 00   1S标志的长度。 LenFlag1S
0009 11 BD AF A8 1S标志(例如AST、UIN、EWH等),是经过简单的异或并求反计算处理的,此处是AST,可能是Algorithm Shift Times 或Axxx Switch Time,管他的呢! Flag1S
000C 15 04 00 00 00 1S数据的长度 LenData1S
0010  19 00 2E 06 00 = (404992) 1S数据,这里是进行MD5转换的次数。这个数据是同计算机的性能有关的,性能越高的计算机,在QQ注册成功后产生的这个循环控制变量就越大。 Data1S

0014 20 07       2S数据的类型,07代表使用MD5进行加密 Type2S
0015 22 03 00 2S标志的长度     LenFlag2S
0017 24 B9 AB B4 2S标志,此处是EWH,代表本数据段是EWH密码数据,可能是Encrypt With Hash的缩写 Flag2S
001A 27 10 00 00 00 2S数据的长度 LenData2S
001E 31 07 22 AA 96 56 19 A3 9E 82 19 B7 2B BD 2D 34 4A   2S数据,是经过MD5加密计算后产生的数据,当然还要经过异或并求反的计算处理,参考下面程序中的1000B858 行代码。 Data2S
002E 47 04 3S数据的类型       Type3S
002F 48 03 00 3S标志的长度 LenFlag3S
0031 50 A9 B5 B2 3S标志,此处是UIN,代表本数据段是QQ号码,可能是:User Identifier Number的缩写 Flag3S
0034 53 04 00 00 00 3S数据的长度 LenData3S
0038 57 3C A8 93 06 3S数据,3C A8 93 06 = 110340156 Data3S

三、 加密原理

下面VB伪代码的部分符号引自以上第二点《结构说明》中的变量标志,请注意理解:
Pwd = MD5(Pwd, Len(Pwd)) ' Pwd为用户输入的密码,第一轮MD5后,Pwd为16位字节长度的MD5串。
XorKey As Long = 0 'XorKey为用于解密的字节
For k = 1 To Data1S – 1 '因为前面已经做过一轮,所以此处要减一
Pwd = MD5(Pwd, 16)
Next k
XorKey = XorKey And &HFFFF
XorKey = (LenData2S And &HFF) Xor (LenData2S / 256)
XorKey = &HFF - XorKey '求反
For k = 1 To 16
Pwd(k) = Pwd(k) Xor XorKey
Next k
If Pwd <> Data2S Then
MsgBox "输入密码与上次成功登录的密码不一致," & vbcrlf & "是否到服务器验证?"
End If

通过以上的流程,我真的佩服QQ的设计者,如此巨大的循环量,加上循环次数的随机性,如果希望产生一个QQMD5词典简直不可能。虽然理论上,可以产生一个MD5字典,但是,这个字典将有1.15E+77*16个字节之巨,因此,只好根据ewh.db文件提供的数据暴力破解了,不知是不是有更好的方法呢? 不过我的感觉是,循环次数加多了,应该会产生更多的MD5碰撞,不见得是个好事。还有一种破解思路,也许更加直接,将在后面的文章中详细探讨。但是我只有在有时间做完实验后才有资格评述,不在本文章的讨论范围内。

四、 破解算法

重复进行数十万次MD5加密,会消耗计算机很多时间,如果使用传统的VB或VC,对于一个密码的等待时间也是很可观的(例如使用VB代码,消耗的时间可能是汇编的400倍),因此,我使用汇编语言来编制低层加密解密算法,通过MASM32编译连接,最后用高级语言调用。通过提供算法动态库的方式,方便其他有兴趣的读者自己增加丰富的功能。例如增加多线程等,这也将在以后的探讨中实现。在此不做深入讨论。附带的例子为VB和VC调用汇编语言动态库的例子,VB代码简单实现了通过密码字典进行单线程破解的功能,读者可以丰富其内容。增加更多的功能。
目前,山东大学的王小云教授已经破解了MD5算法,下一步打算弄清楚MD5算法和MD5解法,今天就到这里吧。
原创粉丝点击