木马编程DIY (Delphi版) - 第3篇 星号密码查看工具

注:《木马编程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实现还是值得大家一看的。^__^

posted @ 2008-08-13 16:01  可乐罐  阅读(1060)  评论(1编辑  收藏  举报