Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.26;
Скачать: CL | DM;

Вниз

Hookи   Найти похожие ветки 

 
Человек   (2006-02-06 11:06) [0]

Расскажите, пожалуйста, как писать различные хуки(как реализовать?), и вообще какие хуки вы знаете. А то я смотрю на сделанную кем-то программу и, вроде, все понимаю, а свою вряд ли напишу. Можно послать меня по какой-нибудь ссылке (только по теме :))


 
kaZaNoVa ©   (2006-02-06 11:21) [1]

// Example3;                               //
// @Aleksey Pavlov                        //
// Demo of WH_KEYBOARD hook - DLL module //

library keyhook;

uses
// SysUtils,
 Windows,
 Messages//,   Forms
 ;

const
 MMFName: PChar = "KeyMMF454545454"; // имя объекта файлового отображения

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

type
 PKeybdHookStruct = ^TKeybdHookStruct;
 TKeybdHookStruct = record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: PULONG;
 end;

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

function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
const
 CAltSet  : set of byte = [164,165];
 CCtrlSet : set of byte = [162,163];
 CDelSet  : set of byte = [46,110];

var
 MMFHandle: THandle;
 Kill: boolean;
 BlockSet: Set Of byte;
 lHkStruct: PKeybdHookStruct;
 lPressedCount: integer;

   AppWnd: HWND;  // дескриптор приложения, в котором произошло нажатие клавишы
begin
   if (Code < 0) or (wParam = PM_NOREMOVE) then
 begin
   Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
   Exit;
 end;

{ if (  ((lParam and KF_UP)=0) and (wParam>=65) and (wParam<=90)  ) OR (  ((lParam and KF_UP)=0) and (wParam=VK_SPACE)  )
then
  begin    }
    AppWnd:= GetForegroundWindow();
    SendMessage(GlobalData^.MyAppWnd, WM_MYKEYHOOK, wParam, AppWnd);
    {можно и так, что бы не сохранять дескриптор главного приложения}
  //SendMessage(HWND_BROADCAST, WM_MYKEYHOOK, wParam, AppWnd);
//   end;

   if Code = HC_ACTION then
     begin
       Kill := False;
       lHkStruct := Pointer(lParam);
       BlockSet := [];
      if {LockWIN}True then
        BlockSet := BlockSet + [91,92];
      if {LockCaps}True then
         BlockSet := BlockSet + [20];
       KILL := lHkStruct^.vkCode in BlockSet;
        if kill then
         result := 1
       else
    begin CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
      result:=0; end;
   end;
end;

{Процедура установки HOOK-а}
procedure hook(switch : Boolean; hMainProg: HWND) export; stdcall;
begin
 if switch=true then
 begin
   {Устанавливаю HOOK, если он не установлен (switch=true). }
   GlobalData^.SysHook := SetWindowsHookEx(13{WH_KEYBOARD}, @KeyboardProc, HInstance, 0);
   GlobalData^.MyAppWnd:= hMainProg;
   if GlobalData^.SysHook <> 0 then
       MessageBox(0, "KEYBOARD HOOK установлен !", "Message from keyhook.dll", 0)
     else
       MessageBox(0, "HOOK установить не удалось !", "Message from keyhook.dll", 0);

 end
 else
 begin

   {Удаляю функцию-фильтр, если она установлена (т.е. switch=false). }
   if UnhookWindowsHookEx(GlobalData^.SysHook) then
     MessageBox(0, "HOOK снят !", "Message from keyhook.dll", 0)
   else
     MessageBox(0, "HOOK снять не удалось !", "Message from keyhook.dll", 0);

 end;
end;

procedure OpenGlobalData();
begin
 {регестрируем свой тип сообщения в системе}
 WM_MYKEYHOOK:= RegisterWindowMessage("WM_MYKEYHOOK");

 {получаем объект файлового отображения}
//  MMFHandle:= CreateFileMapping(DWord(-1), nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName); // можно так, но лучше: см. след. строку
 MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);

 if MMFHandle = 0 then
   begin
     MessageBox(0, "Can""t create FileMapping", "Message from keyhook.dll", 0);
     Exit;
   end;

 {отображаем глобальные данные на АП вызывающего процесса и получаем указатель
  на начало выделенного пространства}
 GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
 if GlobalData = nil then
   begin
     CloseHandle(MMFHandle);
     MessageBox(0, "Can""t make MapViewOfFile", "Message from keyhook.dll", 0);
     Exit;
   end;

end;

procedure CloseGlobalData();
begin
 UnmapViewOfFile(GlobalData);
 CloseHandle(MMFHandle);
 MessageBox(0,"5","0",0);
end;

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

exports hook;

begin
//MessageBox(0, PChar(Application.ExeName), "Message from keyhook.dll", 0);
 {назначим поцедуру переменной DLLProc}
 DLLProc:= @DLLEntryPoint;
 {вызываем назначенную процедуру для отражения факта присоединения данной
  библиотеки к процессу}
 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


 
ZeroDivide ©   (2006-02-06 12:20) [2]

НООК - это механизм перехвата сообщений, предоставляемый системой Microsoft Windows. Программист пишет специального вида функцию (НООК-функция), которая затем при помощи функции SetWindowsHookEx вставляется на верх стека НООК-функций системы. Ваша НООК-функция сама решает, передать ли ей сообщение в следующую НООК-функцию при помощи CallNextHookEx или нет.

НООК бывают глобальные, контролирующие всю систему, так и локальные, ориентированные на какой-либо поток (Thread). Кроме того НООК различаются по типу перехватываемых сообщений.

НООК удаляется при помощи функции UnHookWindowsEx.

Более подробно смотри справку по этим функциям

PS: Локальные хуки не обязательно оформлять в виде dll.


 
Fay ©   (2006-02-07 03:44) [3]

2 [1] kaZaNoVa ©   (06.02.06 11:21)
1) Можно было просто дать ссылку на статью, благо она (была, как минимум) на этом же сервере.
2)
> function KeyboardProc(code : integer; wParam : word; lParam : longint)
Почему WORD, а не _SYSTEMTIME( к примеру)?



Страницы: 1 вся ветка

Текущий архив: 2006.02.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
3-1135865479
Igorioha
2005-12-29 17:11
2006.02.26
ODBC


11-1120661444
DemON_
2005-07-06 18:50
2006.02.26
Kol ГДЕ image??


15-1138827650
Fenik
2006-02-02 00:00
2006.02.26
Странная местная фобия - боязнь анонимов


4-1133942809
sax_ol
2005-12-07 11:06
2006.02.26
Сообщение о только что вставленном диске в CD-ROM


15-1138727472
suharew
2006-01-31 20:11
2006.02.26
Распаковка скомпилированных exe файлов