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
|