Przechwytywanie klawiszy - keyloger lokalny

0

Witam

Mam problem, korzystając ze wszystkiego co mogłem napisałem prostego keylogera, który ma działać na formie Delphi, ponieważ nie udało mi się znaleźć nic co łapie wszystko co się dzieje na formie (klawisze) napisałem klasycznego łapiącego wszystko i ograniczam go do działania w chwili gdy forma aktywna.


type
KeybdLLHookStruct = record
  vkCode      : cardinal;
  scanCode    : cardinal;
  flags       : cardinal;
  time        : cardinal;
  dwExtraInfo : cardinal;
end;

var
 hkHook: hHook;

function LowLevelKeyboardProc(code: Integer; WParam: WParam; LParam: LParam): LRESULT stdcall;
var
AChr: array[0..1] of WideChar;
ScanCode: integer;
Str: widestring;
kState : TKeyboardState;
lpChar : Word;
info : ^KeybdLLHookStruct absolute lParam;
begin

  try
  with info^ do
  case wParam of
      wm_keydown : begin
      GetKeyboardState(kState);
       if ToAscii(vkCode, scanCode, kState, @lpChar, 0) > 0 then
       begin

         if ((lpChar>=32) AND (lpChar<=126)) then
            begin
              str:=char(lpChar);
            end
         end;
    end;
  end;
  finally
    Result := CallNextHookEx(hkHook, code, WParam, LParam);
  end;
end;

procedure HookIt;
begin
  hkHook := SetWindowsHookEx(13, @LowLevelKeyboardProc, hInstance, 0);
end;

procedure UnHookIt;
begin
  UnHookWindowsHookEx(hkHook);
end;                              

Wszystko działa do momentu, aż dodam do projektu nową formę i zrobię Form2.ShowModal; wówczas nie mam pojęcia jak nadal korzystać z tego keylogera na drugiej formie, skopiowałem nawet cały kod na drugą formę i usunąłem z pierwszej i mimo to nie chce on działać na form2. Co zrobić, żeby keyloger łapał wszystko z głównej formy i form modalnych? Nie interesują mnie inne okna i programy tylko formy, które otwiera/pokazuje program w delphi.

Zauważyłem ciekawą rzecz, jak na formie modalnej uruchomię keylogera 2 razy (HookIt) to zaczyna działać ale gubi znaki, które są znakami przejściowymi czyli jak na przykład wcisnę SHIFT i X to nie wyświetli się nic po powtórzeniu wyświetli się X jak puszczę SHIFT i coś wcisnę to również nic się nie wyświetli dopiero kolejne wciśnięcie tego klawisza zadziała.

0

Forma może mieć swoje własne przetwarzanie znaków, zanim dotrą do konkretnych widgetów. Wiodący kod podam później. Jest to gotowa do u.życia funkcja (metoda), teraz nie pamiętam.
Keyloger to strzelanie z dubeltówki (albo obrzynka) do muchy.

0

Keyloger założony przez Ciebie hook działa co do zasady w obrębie aplikacji. I odwołuje się do formy głównej. Ja umieszczam kod w dll co z tego mam. Mam hooka , gdzie moja aplikacja zbiera dane niezależnie czy działasz na aplikacji bezpośrednio. Możesz pisać w notatniku. Klikać systemowy kalkulator pisać w word wszystko przechwytuje. Hook lokalny a hook globalny czy na mysz czy klawiaturę to co innego. Proponuję umieścić kod w dll. Nastepnie możesz za pomocą funkcji czy procedury odróżnić czy chcesz mieć dane z Twojej aplikacji czy globalnego klikania.

0

Tu masz przykład dll na mouse MouseHook.dll. Już nie będę taki :-) a na klawisze na priv :-)

// / Unit utworzono dnia 30-06-2009 r. Mariusz Bruniewski

library MouseHook;

uses
  Forms,
  Windows,
  Messages,
  Hook in 'Hook.pas';

{$J+}
const
  Hook: HHook = 0;
  Hook1: HHook = 0;
  Hook2: HHook = 0;
  WH_MOUSE_LL = 14;
{$J-}


{$R *.res}

function HookProc(nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall;
var
  MouseDetection : TClickDetection;
begin
case MsgID of

  WM_LBUTTONDOWN     :    MouseDetection := K_WM_LBUTTONDOWN;
  WM_LBUTTONUP       :    MouseDetection := K_WM_LBUTTONUP;
  WM_LBUTTONDBLCLK   :    MouseDetection := K_WM_LBUTTONDBLCLK;
  WM_NCLBUTTONDOWN   :    MouseDetection := K_WM_NCLBUTTONDOWN;
  WM_NCLBUTTONUP     :    MouseDetection := K_WM_NCLBUTTONUP;
  WM_NCLBUTTONDBLCLK :    MouseDetection := K_WM_NCLBUTTONDBLCLK;

  WM_RBUTTONDOWN     :    MouseDetection := K_WM_RBUTTONDOWN;
  WM_RBUTTONUP       :    MouseDetection := K_WM_RBUTTONUP;
  WM_RBUTTONDBLCLK   :    MouseDetection := K_WM_RBUTTONDBLCLK;
  WM_NCRBUTTONDOWN   :    MouseDetection := K_WM_NCRBUTTONDOWN;
  WM_NCRBUTTONUP     :    MouseDetection := K_WM_NCRBUTTONUP;
  WM_NCRBUTTONDBLCLK :    MouseDetection := K_WM_NCRBUTTONDBLCLK;

  WM_MBUTTONDOWN     :    MouseDetection := K_WM_MBUTTONDOWN;
  WM_MBUTTONUP       :    MouseDetection := K_WM_MBUTTONUP;
  WM_MBUTTONDBLCLK   :    MouseDetection := K_WM_MBUTTONDBLCLK;
  WM_NCMBUTTONDOWN   :    MouseDetection := K_WM_NCMBUTTONDOWN;
  WM_NCMBUTTONUP     :    MouseDetection := K_WM_NCMBUTTONUP;
  WM_NCMBUTTONDBLCLK :    MouseDetection := K_WM_NCMBUTTONDBLCLK;

  WM_MOUSEWHEEL      :    MouseDetection := K_WM_MOUSEWHEEL;
end;

  PostMessage(FindWindow('Forma Twojego program głównego', nil), MouseHookMessage, MsgID, Integer(MouseDetection));

  Result := CallNextHookEx(Hook,nCode,MsgID,Data);
end;

function HookProc1(nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall;
var
  MouseDetection1 : TClickDetection;
begin
case MsgID of

  WM_MOUSEMOVE       :    MouseDetection1 := K_WM_MOUSEMOVE;
  WM_NCMOUSEMOVE     :    MouseDetection1 := K_WM_NCMOUSEMOVE;
end;

  PostMessage(FindWindow('Forma Twojego program głównego', nil), MouseHookMessage1, MsgID, Integer(MouseDetection1));

  Result := CallNextHookEx(Hook1,nCode,MsgID,Data);
end;

function HookProc2(nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall;
var
  MouseDetection2 : TClickDetection;
begin
case MsgID of

  WM_LBUTTONDOWN     :    MouseDetection2 := K_WM_LBUTTONDOWN;
  WM_LBUTTONUP       :    MouseDetection2 := K_WM_LBUTTONUP;
  WM_LBUTTONDBLCLK   :    MouseDetection2 := K_WM_LBUTTONDBLCLK;
  WM_NCLBUTTONDOWN   :    MouseDetection2 := K_WM_NCLBUTTONDOWN;
  WM_NCLBUTTONUP     :    MouseDetection2 := K_WM_NCLBUTTONUP;
  WM_NCLBUTTONDBLCLK :    MouseDetection2 := K_WM_NCLBUTTONDBLCLK;

  WM_RBUTTONDOWN     :    MouseDetection2 := K_WM_RBUTTONDOWN;
  WM_RBUTTONUP       :    MouseDetection2 := K_WM_RBUTTONUP;
  WM_RBUTTONDBLCLK   :    MouseDetection2 := K_WM_RBUTTONDBLCLK;
  WM_NCRBUTTONDOWN   :    MouseDetection2 := K_WM_NCRBUTTONDOWN;
  WM_NCRBUTTONUP     :    MouseDetection2 := K_WM_NCRBUTTONUP;
  WM_NCRBUTTONDBLCLK :    MouseDetection2 := K_WM_NCRBUTTONDBLCLK;

  WM_MBUTTONDOWN     :    MouseDetection2 := K_WM_MBUTTONDOWN;
  WM_MBUTTONUP       :    MouseDetection2 := K_WM_MBUTTONUP;
  WM_MBUTTONDBLCLK   :    MouseDetection2 := K_WM_MBUTTONDBLCLK;
  WM_NCMBUTTONDOWN   :    MouseDetection2 := K_WM_NCMBUTTONDOWN;
  WM_NCMBUTTONUP     :    MouseDetection2 := K_WM_NCMBUTTONUP;
  WM_NCMBUTTONDBLCLK :    MouseDetection2 := K_WM_NCMBUTTONDBLCLK;

  WM_MOUSEMOVE       :    MouseDetection2 := K_WM_MOUSEMOVE;
  WM_NCMOUSEMOVE     :    MouseDetection2 := K_WM_NCMOUSEMOVE;
  WM_MOUSEWHEEL      :    MouseDetection2 := K_WM_MOUSEWHEEL;
end;

  PostMessage(FindWindow('Forma Twojego program głównego', nil), MouseHookMessage2, MsgID, Integer(MouseDetection2));

  Result := CallNextHookEx(Hook2,nCode,MsgID,Data);
end;

procedure HookMouse; stdcall;
begin
  if Hook = 0 then Hook:=SetWindowsHookEx(WH_MOUSE,@HookProc,HInstance,0);
end;

procedure HookMouse1; stdcall;
begin
  if Hook1 = 0 then Hook1:=SetWindowsHookEx(WH_MOUSE_LL,@HookProc1,HInstance,0);
end;

procedure HookMouse2; stdcall;
begin
  if Hook2 = 0 then Hook2:=SetWindowsHookEx(WH_MOUSE,@HookProc2,HInstance,0);
end;

procedure UnHookMouse; stdcall;
begin
  UnhookWindowsHookEx(Hook);
  Hook:=0;
end;

procedure UnHookMouse1; stdcall;
begin
  UnhookWindowsHookEx(Hook1);
  Hook1:=0;
end;

procedure UnHookMouse2; stdcall;
begin
  UnhookWindowsHookEx(Hook2);
  Hook2:=0;
end;

exports
  HookMouse, UnHookMouse, HookMouse1, UnHookMouse1, HookMouse2, UnHookMouse2;

begin

end
0

adydan ? mam nadzieję, że potrafisz wykorzystywać pliki dll. Jeśli nie napiszę jak wykorzystać ją.

0

Kiedyś https://4programmers.net/ w demo miało załącznik KeySpyXP.zip

1 użytkowników online, w tym zalogowanych: 0, gości: 1