注:《木马编程DIY》由冷风(chinafe)创作完成。本文在其基础上将原文中的C++源代码修改为Delphi源代码,并加以相关说明。 感谢冷风(chinafe)的无私奉献。
星号密码查看工具大家都用过吧,现在我们自己来写个超级简单的。其实密码框是一个Window子窗体,显示星号是因为密码框设置了EM_SETPASSWORDCHAR属性,只要我们把密码框的EM_SETPASSWORDCHAR属性给去掉了,那么密码就会以明文显示出来。我们可以给程序发送消息去掉EM_SETPASSWORDCHAR属性。通过安装鼠标钩子监视鼠标动作,如果用户单击的是密码框那么就发送一个去除密码属性的消息。
本文使用的编程工具为RAD Studio 2007,具体实现步骤和代码如下:
1. 创建一个VCL Application工程,打开Form1.pas文件,加入下面的全局变量和鼠标钩子函数。
var HookHandle: HHOOK; function HookProc(code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var MousePoint: TPoint; WindowHandle: THandle; WindowStyle: Longint; begin // 获取鼠标位置 GetCursorPos(MousePoint); // 获取包含鼠标的窗口句柄 WindowHandle := WindowFromPoint(MousePoint); // 获取窗口风格 WindowStyle := GetWindowLong(WindowHandle, GWL_STYLE); if TEventMsg(PEventMsg(lParam)^).message = WM_LBUTTONDOWN then begin // 是否为密码框 if WindowStyle and ES_PASSWORD <> 0 then begin // 去掉密码属性 PostMessage(WindowHandle, EM_SETPASSWORDCHAR, 0, 0); end; end; Result := CallNextHookEx(HookHandle, code, wParam, lParam); end;
需要注意的是,程序中PostMessage(WindowHandle, EM_SETPASSWORDCHAR, 0, 0);只能使用PostMessage,而不能使用SendMessage代替。
2. 在Form1窗体上放下两个Button控件。并在他的单击事件中加入如下代码:
procedure TForm1.Button1Click(Sender: TObject); begin HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, hInstance, 0); end; procedure TForm1.Button2Click(Sender: TObject); begin UnhookWindowsHookEx(HookHandle); end;
现在就完工了,打开我们的程序,按下"Button1",再打开需要输入密码的程序试试,是不是以明文显示了?用这个小程序可以搞定系统的密码设置,outlook或防范不严的程序密码,但对有专门防范的程序就不行了,比如新版QQ。
注:如果就“查看星号密码明文”来说,大可不必如此兴师动众。Visual Studio自带的Spy++就可以胜任这个工作。不过文中的HOOK实现还是值得大家一看的。^__^