简介
几年前我在CodeGuru 上下载了一个叫 Eureka的程序,如果你忘记了密码,你可以用程序把密码“取”回来。它不是密码破解程序,相反,它利用了一个Windows的安全漏洞来拷贝另外一个运行中的程序的密码。我对这个程序很感兴趣,决定写一个自己的版本。后来,Windows 2000 发布,我失望地发现,微软修补了那个漏洞,这样一来那个程序在Windows 2000上也就不灵了。经过一番尝试,我终于找到一个方法拷贝任何在32-位Windows 系统上运行程序的密码。
本文例子程序:
使用方法:
PasswordSpy程序的使用非常简单。你只要运行包含忘记了密码的程序,再运行PasswordSpy。然后将放大镜拖动到密码输入域上,PasswordSpy则会将密码显示出来。PasswordSpy程序并没有恶意,开发它的目的只是想把密码找回来,该程序在Win95/98 /ME and WinNT/2K/XP/Windows 2003 上测试通过。
功能说明:
除了PasswordSpy本身的用途之外,它还示范了一些有用和有趣的代码:
单实例应用——如果用户启动了PasswordSpy的第二个实例,系统会找到第一个实例,并在所有窗口的最前端显示出PasswordSpy界面;
Always on top——总是在最顶层,只用一行代码就可以在你的程序中启动和禁用这个功能;
进程间通讯——PasswordSpy 使用几种形式的IPC,包括WM_COPYDATA消息以及内存映射文件;
设置窗口钩子——为了在Windows 2000/Windows XP中吸取密码,你得使用在远程进程中置入一个钩子。
代码实现细节:
到目前为止,PasswordSpy 程序最有趣的部分其实是使用 SetWindowsHookEx API.函数设置Windows 钩子。利用该函数你可以将钩子安装到操作系统中或者某个特定的进程中。钩子的种类有很多种,每种钩子作用也不尽相同,用来监视特定的一组事件。当某一类事件发生时,钩子代码被调用。PasswordSpy使用WH_GETMESSAGE钩子,它监视对GetMessage 和PeekMessage 的调用。关于钩子更详细的信息请参考MSDN库的SetWindowsHookEx。
我在网上、书本以及MSDN上找到几个有关钩子的例子,每个都至少有一个Bug。本文我用自己的方案解决了这些问题。使用Windows钩子最难的部分是妥善存储钩子句柄。设置钩子之前,你需要做两件事情: