0 / 0 / 0
Регистрация: 01.04.2014
Сообщений: 11
1

Глобальный хук апи функций - первый вызов всегда пропускается

23.08.2014, 22:02. Показов 931. Ответов 1
Метки нет (Все метки)

Нашел несколько кодов с установкой глобальной ловушки. Пытаюсь отловить вызов функции MessageBoxA, но почему-то первый вызов этой функции всегда пропускается.
Mouse_mes.dll
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
library Mouse_mes;
 
uses sysutils, windows, messages;
 
type
    TImageImportDescriptor=packed record
    OriginalFirstThunk: DWORD;
    TimeDateStamp: DWORD;
    ForwarderChain: DWORD;
    Name: DWORD;
    FirstThunk: DWORD;
    end;
    PImageImportDescriptor=^TImageImportDescriptor;
 
var
    hook: HHook = 0;
    PEHeader:PImageNtHeaders;
    ImageBase:cardinal;
 
function InterceptedMessageBoxA(Wnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
var
  S: AnsiString;
f:textfile;
begin
  result := MessageBoxA(HWND(nil), PChar('ffffff'), 'Bla-bla', MB_OK);
end;
 
procedure ProcessImports(PImports:PImageImportDescriptor);
var
    PImport:PImageImportDescriptor;
    PRVA_Import:LPDWORD;
    ProcAddress:pointer;
    Temp_Cardinal:cardinal;
begin
 ProcAddress := GetProcAddress(GetModuleHandle('user32.DLL'), 'MessageBoxA');
 PImport:=PImports;
 while PImport.Name <> 0 do
  begin
   PRVA_Import:=LPDWORD(pImport.FirstThunk+ImageBase);
   while PRVA_Import^ <> 0 do
    begin
     if PPointer(PRVA_Import) ^= ProcAddress then
      begin
       VirtualProtect(PPointer(PRVA_Import),4,PAGE_READWRITE,Temp_Cardinal);
       PPointer(PRVA_Import)^:=@InterceptedMessageBoxA;
       VirtualProtect(PPointer(PRVA_Import),4,Temp_Cardinal,Temp_Cardinal);
      end;
     Inc(PRVA_Import);
    end;
   Inc(PImport);
  end;
end;
 
procedure DllEntryPoint(reason:longint);stdcall;
begin
 case reason of
  DLL_PROCESS_ATTACH:
   begin
    DisableThreadLibraryCalls(hInstance);
    ImageBase := GetModuleHandle(nil);
    PEHeader := pointer(int64(ImageBase) + PImageDosHeader(ImageBase)._lfanew);//pe header
    ProcessImports(pointer(PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress+ImageBase));
   end;
 end;
end;
 
function nexthook(code:integer;wParam,lParam:longint):longint;stdcall;
begin
  result:=callnexthookex(hook,code,wParam,lParam);
end;
 
procedure sethook(flag:bool);export; stdcall;
begin
if flag then
begin
 hook:=setwindowshookex(wh_getmessage,@nexthook,hInstance,0);
end else
begin
  unhookwindowshookex(hook);
  hook:=0;
end;
end;
 
exports sethook;
begin
 DLLProc:=@DllEntryPoint;
 DllEntryPoint(DLL_PROCESS_ATTACH);
end.
MessageHook.exe

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
program FileDeleteHook;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, Windows;
var
   sethook:procedure(flag:bool)stdcall;
   hDll:hModule;
begin
 hDll:=LoadLibrary('Mouse_mes.dll');
 @sethook:=GetProcAddress(hDll, 'sethook');
 sethook(true);
 readln;
 sethook(false);
 FreeLibrary(hDll);
end.
test_console8.exe
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
program test_console8;
 
{$APPTYPE CONSOLE}
 
uses
  Windows;
 
const
  AnsiMsg1: AnsiString = 'First Message';
  AnsiMsg2: AnsiString = 'Second Message';
begin
  MessageBoxA(0, PAnsiChar(AnsiMsg1), '', 0);
  MessageBoxA(0, PAnsiChar(AnsiMsg2), '', 0);
  MessageBoxA(0, PAnsiChar(AnsiMsg2), '', 0);
end.
Запускаю MessageHook.exe, который должен отлавливать все вызовы MessageBoxA. Потом запускаю test_console8.exe, в которой 3 раза вызывается MessageBoxA. Первый вызов программа не отлавливает, а остальные успешно отлавливаются. При запуске любой программы в которой есть несколько MessageBoxA - первый вызов всегда не обрабатывается. С чем это может быть связано? Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2014, 22:02
Ответы с готовыми решениями:

Хук на Апи функцию CharToOem
Изучаю что такое хук. Написал программу конвертер из анси в оем и обратно Хочу научиться...

глобальный хук
помогите с программой(с какой стороны начинать) : нужно что бы работала как глобальный хук - в...

Глобальный хук
Всем доброго времени суток! Помогите написать глобальный хук и функцию для него, чтобы перехватывал...

Глобальный хук клавиатуры
Привет. Мне нужно сделать глобальный хук клавиатуры, но я не знаю как. В интернете примеров на C++...

1
2649 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,725
25.08.2014, 22:24 2
Цитата Сообщение от supacoder Посмотреть сообщение
С чем это может быть связано?
С тем что либа Mouse_mes будет загружена в адресное пространство процесса test_console8 лишь после того как тот впервые вызовет ф-цию GetMessage.

А вызовет он ее не раньше вызова MessageBoxA
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2014, 22:24
Помогаю со студенческими работами здесь

Глобальный хук мыши
Подскажите, пожалуйста, почему при таком способе перехвата событий мыши, курсор(не самой игры, а...

Не работает глобальный хук
Здравствуйте. Накопал на codeproject код глобального клавиатурного хука, встроил его в свою...

Глобальный хук клавиатуры
Я пишу программу с функцией воспроизведения. Мне нужно, что бы программа при нажатии на клавишу...

Глобальный хук на клавиатуру
unit HookForm; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru