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

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


str:String;

begin

Result := CallNextHookEx(SysHook, Code, wParam, lParam);

case code of

HCBT_CREATEWND:

begin

Str:=TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;

if Str='' then exit;

if TCBTCreateWnd(Pointer(lParam)^).lpcs.hwndParent<>0 then exit;

Wnd := wParam;

GetWindowText(Wnd, windtext, 255);

SaveToLog(FormatDateTime('dd/mm/yyyy hh:nn:ss', Date+Time)+

'#OPEN#'+windtext+ '#'+

TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName+

'#'+IntToStr(Wnd));

end;

HCBT_DESTROYWND:

begin

Str:='';

Wnd := wParam;

if Wnd<>0 then

GetWindowText(Wnd, windtext, 255);

str:=windtext;

if windtext='' then exit;

if Str='' then exit;

SaveToLog(FormatDateTime('dd/mm/yyyy hh:nn:ss', Date+Time)+

'#CLOSE#'+Str+'#'+IntToStr(Wnd));

end;

end;

end;

Первая строка уже должна быть тебе знакома. Затем идет проверка переменной code, которую мы получили в качестве первого параметра в функции SysMsgProc. В этом параметре хранится тип пойманного сообщения. Если он равен HCBT_CREATEWND, значит только что было создано новое окно.

Имя окна мы можем определить по последнему полученному параметру вот таким образом:

TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName.

Я проверяю, если оно пустое, то мне нет смысла связываться с этим окном.

Затем я проверяю, является ли это окно главным. Если следующая конструкция не равна нулю, значит это дочернее окно:

TCBTCreateWnd(Pointer(lParam)^).lpcs.hwndParent

С дочерними окнами я тоже не хочу связываться, потому что это чаще всего простые диалоговые окна, которые показывают разные программы. Меня интересует только запуск новых программ, поэтому такую ерунду я буду игнорировать.

Далее я вызываю функцию GetWindowText(Wnd, windtext, 255), чтобы получить заголовок окна. После этого всю полученную информацию форматирую в строку и сохраняю в log файл с помощью вызова процедуры SaveToLog (эту процедуру ты увидишь чуть ниже).

Код по событию HCBT_DESTROYWND (окно разрушено) идентичен тому, что написан на создание окна. Здесь я точно так же определяю заголовок разрушаемого окна и сохраняю все в log файл. Единственное, что я тут не делаю, - нет проверки на главное окно. То есть разрушаемые окна будут сохраняться в log файл абсолютно все. Это не есть хорошо, и можешь добавить проверку. Я же этого уже не стал делать в целях экономии места в твоем любимом ][.

Запись log файла

Лог файл я назвал scanbisk.log (чтобы не сильно вызывал подозрения у ламера) и буду создавать в системной директории Windows.

procedure SaveToLog(Str:String);

var

f: TextFile;

Filedir:String;

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

begin

//Получаем директорию, где живет Windows

GetWindowsDirectory(windir, 255);

Filedir:=windir+'\scanbisk.log';

//Соединяюсь с log файлом

AssignFile(f, Filedir);

//Если он не существовал, то создаю

if not FileExists(Filedir) then

begin

//Создать и сразу закрываю файл

Rewrite(f);

CloseFile(f);

end;

//Открываю файл

Append(f);

//Записываю строку

Writeln(f, Str);

//Закрываю log файл

Flush(f);

CloseFile(f);

Назад на стр. 046-072-1  Содержание  Вперед на стр. 046-072-3