首页 网络安全 安全学院 查看内容

星号密码查看器完整版

2009-10-9 10:15 983 0

摘要: 上次简单介绍了获取星号密码的几个函数,但是在实际应用中,要通过本程序获取其他程序的的信息,而其他程序可能是VC编写,也可能是Delphi或者VB编写,因此不能像以前那样简单的获取edit11.hand...
关键词: nbsp hMappingFile pShMem 钩子 end 内存 句柄 NextHook begin 消息

上次简单介绍了获取星号密码的几个函数,但是在实际应用中,要通过本程序获取其他程序的的信息,而其他程序可能是VC编写,也可能是Delphi或者VB编写,因此不能像以前那样简单的获取edit11.handle取得密码框的句柄了。那么怎么办了,常见的方法就是通过鼠标钩子获取鼠标所在控件的句柄,再取其内容。下面就来制作一个完整的星号密码查看器,原理就是钩子,还是钩子! 首先,写一个dll和应用程序共用的单元,命名为HookConst(个人随便),这里面声明一个内存共享的结构,dll和应用程序都得用到,当然你不怕麻烦也可以在dll和exe中都声明,其内容如下,做了注释, unit HookConst; interface    uses windows;const  MappingFileName='_MyDllMouse';       //内存共享区的名称标识,dll和主程序里都得相同 type  TShareMem=record    data1:array [1..2] of DWORD; //data1[1]存放的程序handle,data1[2]存放的是消息    data2:TMOUSEHOOKSTRUCT;  //鼠标结构    buffer:array[0..1024]of char;    //缓冲区  end;  PShareMem=^TShareMem; implementation end.//简单介绍下  TMOUSEHOOKSTRUCT 结构{ TMouseHookStruct = packed record  pt:Tpoint;  hwnd:HWND;  wHitTestCode:UINT;  dwExtraInfo:DWORD; end; 其中 pt 包含鼠标的x,y坐标,hwnd 指定接收鼠标消息的窗口,wHitTestCode指定鼠标所在窗口区域  dwExtraInfo是附加信息 } 好了,下一步准备dll的代码,在其uses里加上HookConst,dll代码见下: unit HookDll; interface uses Windows, Messages, Dialogs, SysUtils,HookConst; var  hMappingFile : THandle;  pShMem : PShareMem;  FirstProcess : boolean;  NextHook: HHook; function StartHook(sender : HWND;MessageID : WORD) : BOOL; stdcall; function StopHook: BOOL; stdcall;implementation//钩子回调函数function HookHandler(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; export;begin  Result := 0;  If iCode < 0 Then Result := CallNextHookEx(NextHook, iCode, wParam, lParam);//以下是处理鼠标事件,这里我只处理鼠标移动事件,如果愿意,自行添加其他事件  case wparam of  WM_LBUTTONDOWN:    begin    end;  WM_LBUTTONUP:    begin    end;  WM_LBUTTONDBLCLK:    begin    end;  WM_RBUTTONDOWN:    begin    end;  WM_RBUTTONUP:    begin    end;  WM_RBUTTONDBLCLK:    begin    end;  WM_MBUTTONDOWN:    begin    end;  WM_MBUTTONUP:    begin    end;  WM_MBUTTONDBLCLK:    begin    end;  WM_NCMouseMove, WM_MOUSEMOVE:     //鼠标移动事件    begin      pShMem^.data2:=pMOUSEHOOKSTRUCT(lparam)^;      getwindowtext(pShMem^.data2.hwnd,pShMem^.buffer,1024);   //取其内容      SendMessage(pShMem^.data1[1],pShMem^.data1[2],wParam,integer(@(pShMem^.data2)) );      //             窗口                   消息                        坐标    end;  end;end; function StartHook(sender : HWND;MessageID : WORD) : BOOL;begin  Result := False;  if NextHook <> 0 then Exit;  pShMem^.data1[1]:=sender;   //主程序窗口句柄  pShMem^.data1[2]:=messageid;   //消息  NextHook :=     SetWindowsHookEx(WH_mouse, HookHandler, HInstance, 0);  //全局挂在WH_mouse上,钩子处理函数HookHandler  Result := NextHook <> 0;end; function StopHook: BOOL;begin  if NextHook <> 0 then  begin    UnhookWindowshookEx(NextHook);    NextHook := 0;   end;  Result := NextHook = 0;end;initialization        hMappingFile := OpenFileMapping(FILE_MAP_WRITE,False,MappingFileName);        if hMappingFile=0 then        begin                   //打开共享内存,如果不存在,则创建           hMappingFile := CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,SizeOf(TShareMem),MappingFileName);           FirstProcess:=true;        end        else FirstProcess:=false;        if hMappingFile=0 then Exception.Create('不能建立共享内存!');         pShMem :=  MapViewOfFile(hMappingFile,FILE_MAP_WRITE or FILE_MAP_READ,0,0,0);        if pShMem = nil then        begin           CloseHandle(hMappingFile);           Exception.Create('不能映射共享内存!');        end;               NextHook:=0;finalization        UnMapViewOfFile(pShMem);        CloseHandle(hMappingFile); end. dll工程文件 library DllMouse; uses  SysUtils,  Windows,  UnitHookDLL in 'UnitHookDLL.pas',  UnitHookConst in 'UnitHookConst.pas'; exports  StartHook,StopHook; beginend. 下来是exe的, unit main; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs,HookConst,ExtCtrls,StdCtrls; type  TForm1 = class(TForm)    Panel1: TPanel;    Edit1: TEdit;    Edit2: TEdit;    Edit3: TEdit;    Label1: TLabel;    Label2: TLabel;    Label3: TLabel;    Label4: TLabel;    procedure FormCreate(Sender: TObject);    procedure FormClose(Sender: TObject; var Action: TCloseAction);  private    { Private declarations }  public    { Public declarations }     procedure WndProc(var Messages: TMessage); override;  end; var  Form1: TForm1;  hMappingFile : THandle;  pShMem : PShareMem;const MessageID = WM_User + 100;   //用户自定义消息 implementation {$R *.dfm} function StartHook(sender : HWND;MessageID : WORD) : BOOL;stdcall; external 'DllMouse.DLL'; function StopHook: BOOL;stdcall; external 'DllMouse.DLL'; procedure TForm1.WndProc(var Messages: TMessage);var   x,y:integer;   s:array[0..255]of char;begin   if pShMem = nil then      //自定义消息的处理   begin        hMappingFile := OpenFileMapping(FILE_MAP_WRITE,False,MappingFileName);//打开由dll创建的共享内存,名称是MappingFileName        if hMappingFile=0 then Exception.Create('不能建立共享内存!');        pShMem :=  MapViewOfFile(hMappingFile,FILE_MAP_WRITE or FILE_MAP_READ,0,0,0);    //映射共享内存        if pShMem = nil then        begin           CloseHandle(hMappingFile);           Exception.Create('不能映射共享内存!');        end;   end;   if pShMem = nil then exit;     if Messages.Msg = MessageID then   //如果是钩子发来的消息  begin    x:=pShMem^.data2.pt.x;      // 鼠标坐标    y:=pShMem^.data2.pt.y;    edit3.text:=inttostr(pShMem^.data2.hwnd);    //句柄    panel1.caption:='x='+inttostr(x)+' y='+inttostr(y);    edit2.text:=string(pShMem^.buffer);       //内容    getClassName(pShMem^.data2.hwnd,s,255);    edit1.text:=string(s);       //类名  end   else Inherited;end; procedure TForm1.FormCreate(Sender: TObject);begin   StartHook(Form1.Handle,MessageID);//开始挂钩,并传递本窗口句柄及自定义消息编号。系统钩子                       //dll文件向本程序(form1.handle)发送此消息(MessageID)    pShMem := nil;end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);beginStopHook;end; end. 最后看下效果,如图: 源码我传上来吧,自己可以修改版权,欢迎大家篡改!
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部