Программирование на C++ глазами хакера


Мониторинг исполняемых файлов


Часто в жизни возникают ситуации, когда необходимо определить, какие программы запускает пользователь и сколько времени он работает. Этот вопрос интересует не только хакеров, но и администраторов сетей, и руководителей предприятий.

Хакер может ожидать, когда запустится определенная программа, чтобы произвести с ней какие-нибудь манипуляции. Администратора сети интересует, что сделал пользователь, прежде чем завис компьютер. Начальника интересует использование рабочего времени.

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

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

  • HCBT_ACTIVATE — приложение активизировалось;
  • HCBT_CREATEWND — создано новое окно;
  • HCBT_DESTROYWND — уничтожено существующее окно;
  • HCBT_MINMAX — окно свернули или развернули на весь экран;
  • HCBT_MOVESIZE — окно переместили или изменили размер.

Таким образом, динамическая библиотека для мониторинга запускаемых программ должна соответствовать коду в листинге 3.9. Пока остановимся на поиске событий без их обработки. В реальном приложении может понадобиться сохранение полученных событий и названий окон, с которыми работал пользователь, в каком-нибудь файле. Впоследствии по этой информации можно легко узнать, с чем и сколько работал пользователь.

Листинг 3.9. Библиотека мониторинга запускных файлов
// FileMonitor.cpp : Defines the entry point for the DLL application. //

#include <windows.h> #include "stdafx.h" #include "FileMonitor.h"

HHOOK SysHook; HINSTANCE hInst;

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { hInst=(HINSTANCE)hModule; return TRUE; }




Начало  Назад  Вперед



Книжный магазин