Мониторинг запускных файлов

Xakep, номер #046, стр. 046-072-1


Horrific aka Фленов Михаил smirnandr@mail.ru www.cydsoft.com/vr-online

В прошлый раз я начал рассказ о том, как написать собственную утилиту IP Config. Сегодня я должен был продолжить этот рассказ, но наша трансляция прерывается срочным сообщением. По многочисленным заявкам телезрителей я покажу, как написать программу, которая будет незаметно сидеть в системе и сохранять в log файл всю активность компьютера. Как сохранять абсолютно все, я показать не смогу, но в качестве примера буду ловить все события, когда запускается или закрывается какое-либо приложение.

Intro

Для понимания примера тебе нужно вспомнить статью "Создание и использование DLL" из октябрьского номера ][ за 2001 год. Если ты прогулял этот урок, то клади на стол свой дневник и получай двойку за прилежание :). Еще один такой прогул, и придется вызвать твоих родителей к директору :). Специально для таких, как ты, я выложил эту статью на своем сайте в разделе "Хакер". Иди читай и больше не прогуливай :).

Сегодняшний пример будет состоять из двух файлов - запускного и библиотеки DLL. Все функции мониторинга системы будут находиться в динамической библиотеке, а функция запускного файла только загрузит DLL файл и запустит его выполнение.

DLL

Вспомним октябрьскую библиотеку. Там у нас была функция SetHook, которая устанавливала в системе нашу ловушку. В качестве ловушки выступала функция SysMsgProc, в которую попадали все системные сообщения указанного типа. В сегодняшнем примере все будет так же, и ничего серьезного менять не буду:

function SetHook(Hook : Boolean) : Boolean; export; stdcall;

begin

Result := false;

if Hook then

begin

if SysHook = 0 then

SysHook := SetWindowsHookEx(WH_CBT{WH_CALLWNDPROC},

@SysMsgProc, HInstance, 0);

Result := (SysHook <> 0);

end

else

begin

if SysHook <> 0 then

begin

UnhookWindowsHookEx(SysHook);

SysHook := 0;

Result := true;

end;

end;

end;

Код функции SetHook тот же самый, за исключением функции установки ловушки. Теперь она выглядит так:

SysHook := SetWindowsHookEx(WH_CBT, @SysMsgProc, HInstance, 0);

В октябрьском номере я в качестве первого параметра функции SetWindowsHookEx указывал WH_GETMESSAGE, а теперь WH_CBT. Если установить ловушку этого типа, то она сможет ловить следующие сообщения:

HCBT_ACTIVATE - когда приложение активизировалось.

HCBT_CREATEWND - когда создано новое окно.

HCBT_DESTROYWND - когда уничтожено существующее окно.

HCBT_MINMAX - когда окно свернули или развернули на весь экран.

HCBT_MOVESIZE - когда окно переместили или изменили размер.

В общем, мы получаем доступ к сообщениям, связанным с окнами. Любое телодвижения окна мы сможем проследить с помощью нашей ловушки.

Ловушка для кота

Раз изменился тип ловушки, значит нужно менять и ее саму. Вот здесь у нас будет достаточно много нового, так что смотри полный код процедуры SysMsgProc.

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; export; stdcall;

var

windtext: array [0..255] of char;

Содержание  Вперед на стр. 046-072-2