Тотальный контроль браузера Кочубей Павел 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: |