Мониторинг запускных файлов
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; |