);
ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΡΠΈΠ»ΡΡΡΠ° (Π²ΡΠ±ΡΠ°Π½Π½ΡΡ ΠΈ Π½Π΅Π²ΡΠ±ΡΠ°Π½Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠΏΠΈΡΠΊΠΈ) ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ (Π»ΠΈΡΡΠΈΠ½Π³ 10.14).
...ΠΠΈΡΡΠΈΠ½Π³ 10.14.
ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΡΠΈΠ»ΡΡΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
procedure TfrmMessages.LoadFilter();
var
i: Integer;
begin
//ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΡΠΈΠ»ΡΡΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
lstAvailMessages.Clear();
lstSelMessages.Clear();
for i := mess_first to mess_last do
if messages_list[i].used then
//Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅ΡΡΡ
lstSelMessages.Items.Add(messages_list[i].name)
else
lstAvailMessages.Items.Add(messages_list[i].name);
end;
ΠΡΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΊ ΡΠΎΡΠΌΠ΅ f rmMessages, ΠΊΡΠΎΠΌΠ΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠΈΠ»ΡΡΡΠ°, Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ ΡΠ°Π±ΠΎΡΠ° Ρ ΡΡΠΎΠΉ ΡΠΎΡΠΌΠΎΠΉ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ ΡΠΎΡΠΌΡ ΡΠ²ΠΎΠΉΡΡΠ² ΠΎΠΊΠ½Π°, Ρ Π²ΡΠ·ΠΎΠ²Π° Π΅Π΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° (Π»ΠΈΡΡΠΈΠ½Π³ 10.15).
...ΠΠΈΡΡΠΈΠ½Π³ 10.15.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΎΡΠΌΡ
procedure TfrmMessages.ShowMessages(wnd: HWND);
begin
self.wnd := wnd;
LoadFilter();
ShowModal();
end;
ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ > (Π²ΡΠ±ΡΠ°ΡΡ) ΠΈ < (ΠΎΡΠΌΠ΅Π½ΠΈΡΡ Π²ΡΠ±ΠΎΡ) ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΏΠΈΡΠΊΠ°ΠΌΠΈ ΡΠΈΠ»ΡΡΡΠ° (Π»ΠΈΡΡΠΈΠ½Π³ 10.16).
...ΠΠΈΡΡΠΈΠ½Π³ 10.16.
ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΏΠΈΡΠΊΠ°ΠΌΠΈ Π²ΡΠ±ΡΠ°Π½Π½ΡΡ ΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
procedure TfrmMessages.cmbAddMessageClick(Sender: TObject);
var
i: Integer;
begin
if lstAvailMessages.SelCount = 0 then Exit;
//ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°Π½Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΡΠΏΠΈΡΠΎΠΊ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅ΠΌΡΡ
for i := lstAvailMessages.Count β 1 downto 0 do
if lstAvailMessages.Selected[i] then
messages_list[GetMessageIndex(i, False)].used := True;
//ΠΡΠΎΠ±ΡΠ°Π·ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠΏΠΈΡΠΊΠ°Ρ
LoadFilter();
end;
procedure TfrmMessages.cmDelMessageClick(Sender: TObject);
var
i: Integer;
begin
if lstSelMessages.SelCount = 0 then Exit;
//ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°Π½Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅ΠΌΡΡ
for i := lstSelMessages.Count β 1 downto 0 do
if lstSelMessages.Selected[i] then
messages_list[GetMessageIndex(i, True)].used := False;
//ΠΡΠΎΠ±ΡΠ°Π·ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠΏΠΈΡΠΊΠ°Ρ
LoadFilter();
end;
Π€ΡΠ½ΠΊΡΠΈΡ GetMessagelndex, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.16, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (Π»ΠΈΡΡΠΈΠ½Π³ 10.17).
...ΠΠΈΡΡΠΈΠ½Π³ 10.17.
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΠΏΠΈΡΠΊΠ΅ Π² Π½ΠΎΠΌΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ messages_list
function TfrmMessages.GetMessageIndex(listIndex: Integer;
used: Boolean):Integer;
var
i, count: Integer;
begin
count := 0;
for i := mess_first to mess_last do
if messages_list[i].used = used then
begin
if count = listIndex then
begin
//ΠΠ°ΡΠ»ΠΈ
GetMessageIndex := i;
Exit;
end;
Inc(count);
end;
GetMessageIndex := 0;
end;
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΠ±ΡΠ°ΡΠΈΠΌΡΡ ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π³Π»Π°Π²Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΉ ΡΠΎΡΠΌΠΎΠΉ: ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π»ΠΎΠ²ΡΡΠΊΠΈ. ΠΡΠ°ΠΊ, ΡΠ»Π΅ΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Π²ΡΠ±ΡΠ°Π½Π½ΡΠΌ Π² Π΄Π΅ΡΠ΅Π²Π΅ ΠΎΠΊΠ½ΠΎΠΌ (Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΅Π³ΠΎ ΡΠΎΡ ΡΠ°Π½Π΅Π½ Π² ΠΏΠΎΠ»Π΅ wnd ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎΡΠΌΡ) Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΠΈ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ cmbStart. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π°ΠΆΠ°ΡΠΈΡ ΡΡΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.18.
...ΠΠΈΡΡΠΈΠ½Π³ 10.18.
ΠΠ°ΠΏΡΡΠΊ/ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
procedure TfrmMessages.cmbStartClick(Sender: TObject);
begin
if cmbStart.Caption <> \'ΠΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ\' then
begin
//ΠΠ°ΡΠΈΠ½Π°Π΅ΠΌ ΡΠ»Π΅ΠΆΠ΅Π½ΠΈΠ΅
lvwMessages.Clear;
//Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ ΡΠ°ΠΉΠ»Π°
hFile := CreateFileMapping(INVALID_HANDLE_VALUE, nil,
PAGE_READWRITE,
0, SizeOf(THookInfo),
strFileMapName);
hook_info := MapViewOfFile(hFile, FILE_MAP_WRITE, 0, 0,
SizeOf(THookInfo));
//Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π»ΠΎΠ²ΡΡΠΊΠΈ
if InstallHook(wnd, frmMessages.Handle) then
cmbStart.Caption := \'ΠΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ\'
else
begin
//ΠΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅ ΡΠ΄Π°Π»ΠΈΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ ΡΠ°ΠΉΠ»Π°
UnmapViewOfFile(hook_info);
hook_info := nil;
CloseHandle(hFile);
hFile := 0;
MessageBox(Handle, \'ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π»ΠΎΠ²ΡΡΠΊΠΈ\',
PAnsiChar(Application.Title), MB_ICONEXCLAMATION);
end;
end
else
begin
//ΠΠ°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΠΌ ΡΠ»Π΅ΠΆΠ΅Π½ΠΈΠ΅ (ΡΠ΄Π°Π»ΡΠ΅ΠΌ Π»ΠΎΠ²ΡΡΠΊΡ ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ ΡΠ°ΠΉΠ»Π°)
RemoveHook();
UnmapViewOfFile(hook_info);
hook_info := nil;
CloseHandle(hFile);
hFile := 0;
cmbStart.Caption := \'ΠΠ°ΡΠ°ΡΡ ΡΠ»Π΅ΠΆΠ΅Π½ΠΈΠ΅\
end;
end;
ΠΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, Π²ΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ-ΡΠΏΠΈΠΎΠ½Π° ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ/ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈΠΈ ΡΠ°ΠΉΠ»Π° ΠΈ Π² Π²ΡΠ·ΠΎΠ²Π΅ Π΄Π²ΡΡ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΡΡ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ hook, dll ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠ½ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ:
...function InstallHook(wnd: HWND; spy: HWND): Boolean stdcall;
external \'hook\hook.dll\' name \'InstallHook\
function RemoveHook(): Boolean stdcall;
external \'hook\hook.dll\' name \'RemoveHook\
ΠΠ»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ WM_SPY_NOTIFY, ΠΏΠΎΡΡΠ»Π°Π΅ΠΌΠΎΠ³ΠΎ Π»ΠΎΠ²ΡΡΠΊΠΎΠΉ, ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΠΎΠΊΠΎΠ½Π½Π°Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° ΡΠΎΡΠΌΡ f rmMessages (Π»ΠΈΡΡΠΈΠ½Π³ 10.19).
...ΠΠΈΡΡΠΈΠ½Π³ 10.19.
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ WM_SPY_NOTIFY
procedure TfrmMessages.WndProc(var Message: TMessage);
var
item: TListItem;
i: Integer;
begin
if (Message.Msg = WM_SPY_NOTIFY) and (hook_info <> nil) then
begin
//ΠΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ ΠΏΡΠΈΡ ΠΎΠ΄Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² Π½Π°Π±Π»ΡΠ΄Π°Π΅-
ΠΌΠΎΠ΅ ΠΎΠΊΠ½ΠΎ
for i := mess_first to mess_last do
if (messages_list[i].value = hook_info^.mess) and
messages_list[i].used then
begin
//Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°Π½ΠΎ Π² ΡΠΈΠ»ΡΡΡΠ΅ β Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π·Π°ΠΏΠΈΡΡ Π² ΡΠΏΠΈΡΠΎΠΊ
item := lvwMessages.Items.Add();
item.Caption := messages_list[i].name;
item.SubItems.Add(IntToStr(hook_info^.wParam));
item.SubItems.Add(IntToStr(hook_info^.lParam));
end;
end
else
inherited WndProc(Message);
end;
ΠΠΎΠ²ΡΡΠΊΠ°
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΠ±ΡΠ°ΡΠΈΠΌΡΡ ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°ΠΌΠΎΠΉ Π»ΠΎΠ²ΡΡΠΊΠΈ. ΠΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠΌ ΡΠ°Π½Π΅Π΅ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ Π»ΠΎΠ²ΡΡΠΊΠ° ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π° Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ DLL (hook\hook.dll Π½Π° ΠΏΡΠΈΠ»Π°Π³Π°Π΅ΠΌΠΎΠΌ ΠΊ ΠΊΠ½ΠΈΠ³Π΅ Π΄ΠΈΡΠΊΠ΅ Π² ΠΏΠ°ΠΏΠΊΠ΅ Ρ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ Π³Π»Π°Π²Ρ). ΠΠ° ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ Π²Ρ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ DLL ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ Delphi, ΠΏΡΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΊΡΠ°ΡΠΊΠΈΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ.
Π‘ΡΠ΅Π΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Delphi Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½Π° ΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π²Π΅ΡΠΈ. Π₯ΠΎΡΡ ΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠ΅Π΄ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, ΡΠΊΡΡΠ²Π°ΡΡΠΈΡ ΠΌΠ΅Π½ΡΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ»ΠΎΠΆΠ½ΡΡ Π΄Π΅ΡΠ°Π»Π΅ΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Visual C++, ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ DLL Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠ΅Π½Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ. ΠΡΠ°ΠΊ, Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ DLL Π² ΠΏΡΠΎΡΡΠ΅ΠΉΡΠ΅ΠΌ, ΡΠΎ Π΅ΡΡΡ Π½Π°ΡΠ΅ΠΌ, ΡΠ»ΡΡΠ°Π΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ.
1. Π‘ΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΏΡΠΎΠ΅ΠΊΡ (Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΌΠ΅Π½Ρ FiLe β New β Other, ΡΠΈΠΏ ΠΏΡΠΎΠ΅ΠΊΡΠ° β DLL Wizard) (ΡΠΈΡ. 10.6).
2. Π DPR-ΡΠ°ΠΉΠ»Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ.
3. ΠΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½ΡΠΆΠ½ΠΎ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° exports (Π»ΠΈΡΡΠΈΠ½Π³ 10.20).
Π ΠΈΡ. 10.6. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° DLL
Π‘ΡΡΡΠΊΡΡΡΠ° DLL Π»ΠΎΠ²ΡΡΠΊΠΈ, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.20.
...ΠΠΈΡΡΠΈΠ½Π³ 10.20.
DLL Π»ΠΎΠ²ΡΡΠΊΠΈ Π±Π΅Π· ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ
library hook;
uses
Windows,
HookData;
//****************************************************
//ΠΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
function InstallHook(wnd: HWND; spy: HWND): Boolean stdcall;
forward;
function RemoveHook(): Boolean stdcall; forward;
exports
InstallHook,
RemoveHook;
//****************************************************
β¦
begin
hook_info := nil;
hFile := 0;
end.
ΠΠΎΠ΄ ΠΏΠΎΡΠ»Π΅ begin ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ΄ΠΎΠΌ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ (Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ DLL Π² ΠΏΠ°ΠΌΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°). ΠΡΠ°Π²Π΄Π°, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΡ, ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π»ΠΎΠ²ΡΡΠΊΠΈ, ΠΊΠΎΠ΄ ΡΡΠΎΡ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ DLL Π»ΠΎΠ²ΡΡΠΊΠΈ Π² Π°Π΄ΡΠ΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°.
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΠ±ΡΠ°ΡΠΈΠΌΡΡ ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ InstallHook, Π° ΡΠ°ΠΊΠΆΠ΅ RemoveHook. ΠΠ°ΠΊ Π²Ρ ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΈ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ-ΡΠΏΠΈΠΎΠ½Π°. ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π»ΠΎΠ²ΡΡΠΊΠΈ (Π»ΠΈΡΡΠΈΠ½Π³ 10.21).
...ΠΠΈΡΡΠΈΠ½Π³ 10.21.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° (ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅) Π»ΠΎΠ²ΡΡΠΊΠΈ
function InstallHook(wnd: HWND; spy: HWND): Boolean stdcall;
begin
//ΠΡΠΊΡΡΠ²Π°Π΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ ΡΠ°ΠΉΠ»Π° (ΠΎΠ±Π»Π°ΡΡΠΈ ΡΠ°ΠΉΠ»Π° ΠΏΠΎΠ΄ΠΊΠ°ΡΠΊΠΈ)
if not GetFileMapping() then
begin
//ΠΠ΅ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠΏΡΠΎΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ» Π² ΠΏΠ°ΠΌΡΡΡ
InstallHook := False;
Exit;
end;
//Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΠ΅, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Π»ΠΎΠ²ΡΡΠΊΠΈ
hook_info^.wnd := wnd;
hook_info^.spy_wnd := spy;
//Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π»ΠΎΠ²ΡΡΠΊΡ
if (GetWindowThreadProcessId(wnd) <> 0)
then
hook_info^.hook_handle :=
SetWindowsHookEx(WH_CALLWNDPROC, WndProcHook,
hInstance, GetWindowThreadProcessId(wnd))
else
//Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π»ΠΎΠ²ΡΡΠΊΠΈ Π΄Π»Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
//Π±ΡΠ»ΠΎ Π±Ρ ΡΠ°ΡΠ°Π»ΡΠ½ΡΠΌ
hook_info^.hook_handle := 0;
InstallHook := hook_info^.hook_handle <> 0;
//ΠΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ ΡΠ°ΠΉΠ»Π°
ReleaseFileMapping();
end;
Π€ΡΠ½ΠΊΡΠΈΡ InstallHook ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ-ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ hook_inf ΠΎ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π° Π² ΠΌΠΎΠ΄ΡΠ»Π΅ HookData. Π€ΡΠ½ΠΊΡΠΈΡ GetFileMapping, ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.21, ΡΠ²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ hookinf ΠΎ Ρ ΠΎΠ±Π»Π°ΡΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΎΠ΅ΡΠΈΡΡΠ΅ΡΡΡ ΡΠ°ΠΉΠ». Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° ReleaseFileMapping ΠΎΡΠΌΠ΅Π½ΡΠ΅Ρ ΠΏΡΠΎΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡΡ (ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ hookinf ΠΎ Π½Π΅Π»ΡΠ·Ρ).
API-ΡΡΠ½ΠΊΡΠΈΡ GetWindowThreadProcessId ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΏΠΎΡΠΎΠΊΠ°, ΡΠΎΠ·Π΄Π°Π²ΡΠ΅Π³ΠΎ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΠΎΠ΅ ΠΎΠΊΠ½ΠΎ. ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ, Π½ΡΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π² ΡΠ»ΡΡΠ°Π΅ Π·Π°ΠΊΡΡΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΠ΅Π³ΠΎ Π½Π°Ρ ΠΎΠΊΠ½Π° Π΄ΠΎ Π·Π°ΠΏΡΡΠΊΠ° Π»ΠΎΠ²ΡΡΠΊΠΈ ΠΌΡ Π½Π΅ Π½Π°ΡΠ°Π»ΠΈ ΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° ΠΎΠΊΠ½Π°ΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ-ΡΠΏΠΈΠΎΠ½Π°.
Π Π°Π±ΠΎΡΡ Ρ ΠΏΡΠΎΠ΅ΡΠΈΡΡΠ΅ΠΌΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ Π² Π»ΠΎΠ²ΡΡΠΊΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅. Π‘Π΅ΠΉΡΠ°Ρ ΠΆΠ΅ ΠΎΠ±ΡΠ°ΡΠΈΠΌΡΡ ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π»ΠΎΠ²ΡΡΠΊΠΈ, ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.22.
...ΠΠΈΡΡΠΈΠ½Π³ 10.22.
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π»ΠΎΠ²ΡΡΠΊΠΈ
function RemoveHook(): Boolean stdcall;
begin
if GetFileMapping() then
begin
if hook_info^.hook_handle <> 0 then
//Π£Π΄Π°Π»ΡΠ΅ΠΌ Π»ΠΎΠ²ΡΡΠΊΡ
UnhookWindowsHookEx(hook_info^.hook_handle);
//ΠΠ°ΠΊΡΡΠ²Π°Π΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ ΡΠ°ΠΉΠ»Π°
ReleaseFileMapping();
RemoveHook := True;
end
else
RemoveHook := False;
end;
Π’ΡΡ Π²ΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΈ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΡ. Π’Π΅ΠΏΠ΅ΡΡ ΠΆΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ°ΠΊ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΈΠ΅ΠΉ ΡΠ°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡΡ. Π€ΡΠ½ΠΊΡΠΈΡ GetFileMapping, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.23, ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ ΡΠ°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡΡ ΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ hookinf ΠΎ Ρ ΠΎΠ±Π»Π°ΡΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ, ΠΎΡΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π΄Π»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΈΠΈ ΡΠ°ΠΉΠ»Π°.
...ΠΠΈΡΡΠΈΠ½Π³ 10.23.
ΠΡΠΊΡΡΡΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈΠΈ ΡΠ°ΠΉΠ»Π°
function GetFileMapping(): Boolean;
begin
//ΠΡΡΠ°Π΅ΠΌΡΡ ΠΎΡΠΊΡΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ ΡΠ°ΠΉΠ»Π°
hFile := OpenFileMapping(FILE_MAP_WRITE, False, PAnsiChar(strFileMapName));
//ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π°Π΄ΡΠ΅Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ
hook_info := MapViewOfFile(hFile, FILE_MAP_WRITE, 0, 0, SizeOf(THookInfo));
GetFileMapping := hook_info <> nil;