Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Delphi. Π’Ρ€ΡŽΠΊΠΈ ΠΈ эффСкты». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 46

Автор Π’Π°Π»Π΅Ρ€ΠΈΠΉ Борисок

);

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° (Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π΅Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… сообщСний Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ списки) производится ΠΎΡ‡Π΅Π½ΡŒ просто (листинг 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;