Грабим формы! Ms-Rem (Ms-Rem@yandex.ru) Хакер, номер #082, стр. 082-110-3 lpszVersion - версия используемого протокола (HTTP/1.0 или HTTP/1.1). lpszReferer - содержимое заголовка Referer (адрес страницы с которой был послан запрос). lpszAcceptTypes - типы принимаемых браузером данных. dwFlags - комбинация управляющих флагов. Подробнее о них ты можешь почитать в MSDN. dwContext - дополнительные данные, которые приложение может передать с запросом. BOOL HttpSendRequest( HINTERNET hRequest, LPCTSTR lpszHeaders, DWORD dwHeadersLength, LPVOID lpOptional, DWORD dwOptionalLength ); hRequest - хэндл запроса, полученный функцией HttpOpenRequest. lpszHeaders - указатель на заголовки запроса. Формат заголовков HTTP-протокола мы рассмотрели выше. dwHeadersLength - размер заголовков. lpOptional - указатель на тело запроса. В нашем случае он будет содержать данные формы. С форматом этих данных мы уже тоже разобрались. dwOptionalLength - размер данных тела запроса. [перехватываем WinInet API] Теперь нам нужно научиться перехватывать функции HttpOpenRequest и HttpSendRequest и сохранять в лог проходящие через них данные. Для этого нам нужно сначала загрузить свою DLL во все процессы системы. Это можно сделать, например, прописав DLL в разделе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows в ключ AppInit_DLLs (или с помощью хуков или создания удаленных потоков, – прим. ред). Такая библиотека будет подгружена во все процессы, имеющие в своем адресном пространстве user32.dll (а это все GUI приложения). Для перехвата будем использовать метод сплайсинга. Заключается он в перезаписи начала кода перехватываемой функции 5 байтным jmp на свою функцию с предварительным копированием затертых байт в выделенный буфер и установкой после них jmp на продолжение функции. Главная проблема тут состоит в том, что нам нужно скопировать целое количество инструкций, а они могут иметь разный размер, следовательно, нам понадобиться дизассемблер длин. Все вышеописанное уже реализовано в моей библиотеке advApiHook, поэтому можно просто подключить ее и не париться. Сам же код DLL будет выглядеть приблизительно так: library FormGrab; uses windows, advApiHook; var TrueHttpSendRequest: function(hRequest: dword; lpszHeaders: PChar; dwHeadersLength: dword; lpOptional: pointer; dwOptionalLength: dword): boolean; stdcall; function NewHttpSendRequest(hRequest: dword; lpszHeaders: PChar; dwHeadersLength: dword; lpOptional: pointer; dwOptionalLength: dword): boolean; stdcall; begin MessageBoxA(0, lpszHeaders, lpOptional, 0); Result := TrueHttpSendRequest(hRequest, lpszHeaders, dwHeadersLength, lpOptional, dwOptionalLength); end; begin HookProc('wininet.dll', 'HttpSendRequestA', @NewHttpSendRequest, @TrueHttpSendRequest); end. Эта библиотека, будучи прописанной в реестре, будет выводить сообщение с содержимым посылаемого запроса. Реальный же формграббер должен, конечно, не выводить, а сохранять запрос. Причем целесообразнее будет не просто сохранять запрос в неизменном виде, а разбирать его структуру и вытаскивать из нее нужные данные. При достижении какого-либо размера лога, или по прошествии определенного времени результат работы формграббера должен высылаться на мыло, закачиваться на FTP, или любым другим способом передаваться хакеру. При этом будет очень кстати сжать и зашифровать передаваемые данные. |