Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.039 c
2-1139159387
Apollon_604
2006-02-05 20:09
2006.02.26
Hide-Show


15-1138977095
Барлог(с)
2006-02-03 17:31
2006.02.26
Хард сгорел, *****


15-1139385787
Гаврила
2006-02-08 11:03
2006.02.26
Fast Report - некрасивое поведение


1-1138264389
Lucefer
2006-01-26 11:33
2006.02.26
Передать строку через PostMessage


15-1139147108
Вячеслав Бессонов
2006-02-05 16:45
2006.02.26
Begin end.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский