一、引言
随着计算机信息技术的发展,人们越来越重视信息的安全性,信息数据的安全保密已
经成为影响计算机发展的一个重要课题。机密文件、商业情报、银行账号、网络密码、科
技成果、包括私人信件等等,都成了用户为难以存放发愁的心病。密码可以说是他们的唯
一的精神寄托,通过密码,他们可以对这些信息进行加密,或者通过密码对用户存取信息
进行授权,非法用户禁止存取有关信息。
但是有了密码,用户也不能高枕无忧,因为密码都是人工键入的,都是由键盘的可见
字符组成(包括汉字),如果一个非法用户不幸猜中了你的密码,哪怕只有千万分之一的几
率,也会给你的数据安全带来潜在威胁,而不光会污染你的数据,丧心病狂的人甚至会在
瞬间摧毁你苦心经营多年的成果。更何况现在有了电脑作为工具,它可以在一分钟之间穷
举成千上万个密码,利用局域网分布式计算,一个小时内穷举十位以下的所有密码,更不
幸的是我们的用户所用的密码都是出奇的易记 (击),他们偏好单用数字和字母,这为他们
数据安全埋下了危机。
本文正是通过引用一个穷举密码的例子来提醒用户,在密码问题上不要大意,密码要
求尽可能长,而且不要鄙视非数字和非字母字符,密码要定期更换。动态密码,相对更为
安全。
二、实现原理:
我们的用户一般都过输入密码的经历,一般情况下系统都会显示一个对话框,提醒用
户输入密码,密码编辑框一般具有 ES_PASSWORD 风格,用户输入完成后,要求按《确
定》按钮确认,如果密码正确,系统就会开始工作,否则系统会提示你密码错误,要求按
《确定》按钮重新输入。无论我们运用鼠标的技能有多高,如果我们想在短时间内穷举所
有可能密码,根本不现实。但是高速运行的计算机可以做到。
我们可以通过编程,利用 Windows API 函数 EnumWindows 和 EnumChildWindows 对当
前运行的所有程序的所有窗口(包括子窗口即控件)进行遍历,通过窗口标题查找密码输入
和出错确认重新输入窗口,通过按钮标题查找我们应该单击的按钮,通过 ES_PASSWORD
查找我们需要键入的密码窗口。
我们可以通过向密码输入窗口发送 WM_SETTEXT 消息模拟输入密码,通过向按钮窗
口发送 WM_COMMAND 消息模拟单击。所有这一切我们可以把它放在一个线程内运行,
我们用户可以随时暂停、随时中断退出。我们可以在枚举密码的过程中,把密码保存在一
个文件中,以便下次接着下一个序列的密码再次穷举。直到找到密码为止。找到密码后,
由于不再出现密码输入窗口,程序虽然仍在继续枚举窗口,但由于找不到对应窗口,不会
发送任何消息。我们打开记录文件推算前一个序列的密码即可找到对应的密码。
枚举密码的方法有多种,这跟密码的组成有关,如果你忘记了你的 wps 2000 的文件密
码,而且你确切知道密码由数字组成,你就可以采用数字穷举,当然程序还提供了其它穷
举方法,包括大写字母、小写字母、大小写混合、字母数字、标点符号字母数字组合等等
每一种穷举方法都有进度记录保存,下次穷举不用从头开始,字符个数从一位到多位自动