Мониторинг исполняемых файлов
Часто в жизни возникают ситуации, когда необходимо определить, какие программы запускает пользователь и сколько времени он работает. Этот вопрос интересует не только хакеров, но и администраторов сетей, и руководителей предприятий.
Хакер может ожидать, когда запустится определенная программа, чтобы произвести с ней какие-нибудь манипуляции. Администратора сети интересует, что сделал пользователь, прежде чем завис компьютер. Начальника интересует использование рабочего времени.
Именно на этих задачах мне пришлось разобраться, как отследить, какие программы запускаются и сколько времени находятся в рабочем состоянии.
Данная проблема решается достаточно просто, и программа будет похожа на разгадывание паролей: также необходимо создать ловушку, которая будет отслеживать определенные системные сообщения. В предыдущем примере ловушка устанавливалась с помощью API-функции SetWindowsHookEx и регистрировались сообщения типа WH_GETMESSAGE. Если этот параметр изменить на WH_CBT, то такая ловушка сможет фиксировать следующие сообщения:
HCBT_ACTIVATE — приложение активизировалось;
HCBT_CREATEWND — создано новое окно;
HCBT_DESTROYWND — уничтожено существующее окно;
HCBT_MINMAX — окно свернули или развернули на весь экран;
HCBT_MOVESIZE — окно переместили или изменили размер.
Таким образом, динамическая библиотека для мониторинга запускаемых программ должна соответствовать коду в листинге 3.9. Пока остановимся на поиске событий без их обработки. В реальном приложении может понадобиться сохранение полученных событий и названий окон, с которыми работал пользователь, в каком-нибудь файле. Впоследствии по этой информации можно легко узнать, с чем и сколько работал пользователь.
Листинг 3.9. Библиотека мониторинга запускных файлов |
#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; }
LRESULT CALLBACK SysMsgProc(
int code, // hook code WPARAM wParam, // removal flag LPARAM lParam // address of structure with message ) { //Передать сообщение другим ловушкам в системе CallNextHookEx(SysHook, code, wParam, lParam);
if (code == HCBT_ACTIVATE) { char windtext[255]; HWND Wnd=((tagMSG*)lParam)-hwnd; GetWindowText(Wnd, windtext, 255);
// Here you can save active window title // (Здесь можно сохранить заголовок активного окна) }
if (code == HCBT_CREATEWND) { char windtext[255]; HWND Wnd=((tagMSG*)lParam)-hwnd; GetWindowText(Wnd, windtext, 255);
// Here you can save New file title // (Здесь можно сохранить заголовок нового окна) } return 0; }
///////////////////////////////////////////////////////////////////
DllExport void RunStopHook(bool State, HINSTANCE hInstance) { if (true) SysHook = SetWindowsHookEx(WH_CBT, SysMsgProc, hInst, 0); else UnhookWindowsHookEx(SysHook); }
Когда создано новое окно или активировано уже существующее, то вызывается наша ловушка с добавленным кодом определения названия окна, которое сгенерировало событие. Дальше вы можете добавить свой код, который будет выполнять необходимые действия (например, сохранять в файле дату и время создания или активации окна). А я в целях экономии места в книге опущу этот момент и оставлю на ваше усмотрение, потому что дальнейшие действия зависят от поставленной цели.
Вот таким нехитрым способом можно получить доступ к сообщениям о событиях, произошедших с окнами, и тем самым контролировать, что происходит с программами на компьютере пользователя. Вот так мы.
Примечание |
Исходный код библиотеки, описанный в этом разделе, вы можете найти на компакт - диске в каталоге \Demo\Chapter3\FileMonitor, а исходный код примера для тестирования этой библиотеки — в каталоге \Demo\Chapter3\FileMonitorTest. Для запуска программы необходимо, чтобы библиотека FileMonitor.dll находилась в каталоге, из которого запускается тестовый пример. |