Грабим формы! Ms-Rem (Ms-Rem@yandex.ru) Хакер, номер #082, стр. 082-110-2 Каждый элемент имеет строку, идентифицирующую его назначение (Content-Disposition) и одну или несколько строк собственно с данными. Так выглядит запрос, отправленный методом POST. Но содержимое форм может еще передаваться методом GET, при этом параметры передаются прямо в URL запроса. Подобный URL может выглядеть так: http://www.yandex.ru/yandsearch?rpt=rad&text=FormData. Я думаю, ты и сам сможешь понять, что этот запрос значит. Рассмотрим теперь, что происходит при посылке запроса весьма популярным браузером Internel Explorer. Сначала данные вводятся в поля ввода браузера, при нажатии кнопки Submit происходит отправка этих данных в COM-объект Internet Explorer’а, который является движком браузера. Дальше в COM-объекте происходит формирование запроса и передача его в функциям HttpOpenRequest и HttpSendRequest (WinInet API). Эти функции собирают запрос окончательно и отправляют его через сокеты (send и recv в ws2_32.dll). Далее данные направленные на сокеты отправляются в ядро системы, где после обработки в стеке протоколов TCP/IP они отсылаются через сеть. С другими браузерами дело может обстоять несколько иначе, например они могут не пользоваться функциями WinInet API, а формировать запрос вручную. В любом случае они отправляют данные через сокеты. Вернемся теперь к нашим баранам (точнее, к формграбберам). Для перехвата данных формы нам нужно вклиниться в описанный выше процесс на любой его стадии. Например, можно получить хэндл окна Internet Explorer, перечислить все дочерние окна, отобрать среди них те, которые нам нужны, и с помощью GetWindowText снять с каждого из них введенный текст. Этот метод применяется в некоторых троянах. Можно вклиниться и на уровне COM-объекта, через его интерфейсы можно не только снифать посылаемые данные, но даже посылать свои. Этот метод используется в трояне Pinch для обхода файрволов. Недостаток тут только в громоздкости и неудобстве программирования COM-объектов. Гораздо более перспективным мне кажется метод перехвата функций HttpOpenRequest и HttpSendRequest, так как он позволяет легко получать данные форф. Причем не просто получать, но и сразу же отправлять их, куда надо в обход файрволов. Функция HttpOpenRequest осуществляет открытие соединения, а HttpSendRequest - отсылку самого запроса. Рассмотрим их прототипы: HINTERNET HttpOpenRequest( HINTERNET hConnect, LPCTSTR lpszVerb, LPCTSTR lpszObjectName, LPCTSTR lpszVersion, LPCTSTR lpszReferer, LPCTSTR* lpszAcceptTypes, DWORD dwFlags, DWORD_PTR dwContext ); hConnect - хэндл открытого соединения. lpszVerb - строка метода запроса (GET, POST, HEAD etc). lpszObjectName – URL, к которому направляется запрос. В нем могут передаваться данные формы. Я думаю, ты уже разобрался с форматом этих данных из предыдущего описания. |