Программирование на 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; }


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 находилась в каталоге, из которого запускается тестовый пример.

Содержание раздела