![]() |
Доброго времени суток, в данном блоге я буду высказывать свои мысли, рассказывать о том что познал в последнее время, выкладывать полезные на мой взгляд исходники программ и т.д.
Для начала немного обо мне: Зовут меня Александр(?), увлекаюсь программированием. Любимые языки delphi, fasm, php. Пишу небольшие проекты под заказ, курю маны на различных форумах итд итп |
Накотал небольшой пример отправки http хидеров и получение ответа от сервера, эдакий "Inet Crack",. по функционалу ему конечно уступает, но как "каркас" для чего-то большего вполне подойдёт
исходник на фасме code: format PE GUI 4.0 entry start include '..\..\inc\win32ax.inc' include '..\..\inc\api\wsock32.inc' include '..\..\inc\api\kernel32.inc' include '..\..\inc\api\user32.inc' include '..\..\inc\api\comctl32.inc' include 'strtodword.inc ' struct TIMEVAL tv_sec dd ? tv_usec dd ? ends tv TIMEVAL <> section '.code' code import writeable readable executable library kernel32,'KERNEL32.DLL', user32,'USER32.DLL', winsock,'WSOCK32.DLL',\ comctl32,'COMCTL32.DLL' import winsock,\ WSAStartup,'WSAStartup', recv,'recv', connect,'connect', ws_gethostbyname,'gethostbyname',\ closesocket,'closesocket', send,'send', socket,'socket', WSACleanup,'WSACleanup',\ htons,'htons',inet_addr,'inet_addr',setsockopt,'se tsockopt' start: invoke InitCommonControls invoke GetModuleHandle, 0 invoke DialogBoxParam, eax, 1, HWND_DESKTOP, DialogProc, 0 invoke ExitProcess,0 proc DialogProc hwnddlg,msg,wparam,lparam push ebx esi edi cmp [msg],WM_INITDIALOG je .wminitdialog cmp [msg],WM_COMMAND je .wmcommand cmp [msg],WM_CLOSE je .wmclose xor eax,eax jmp .finish .wminitdialog: invoke GetDlgItem, [hwnddlg], ID_MESSAGE jmp .processed .wmcommand: mov eax,[wparam] cmp ax,IDC_BUTTON jne .finish ;---------------------------WORK------------------------------------------------------------- invoke lstrlenA,sendbuf ; Это invoke RtlZeroMemory,sendbuf,eax ; очистка invoke lstrlenA,recvbuf ; памяти, выделенная под invoke RtlZeroMemory,recvbuf,eax ; буфер приёма и отправки хидеров. invoke GetDlgItemText,[hwnddlg],IDC_MEMO,sendbuf,4096 ; Получаем в переменную sendbuf наш сформированный хидер invoke GetDlgItemText,[hwnddlg],ID_MESSAGE,ip,100 ; Получаем в переменную ip хост или ип invoke GetDlgItemText,[hwnddlg],ID_COMMAND,port,10 ; Получаем в переменную port номер порта stdcall STR_to_DWORD,port ; процедура переводит строку в число, на воходе в eax - результат mov [port],eax ; помещаем полученные данные в переменную port invoke GetDlgItemText,[hwnddlg],ID_MESSAGE2,timeout,10 ; Получаем в переменную timeout данные stdcall STR_to_DWORD,timeout ; ..и переводим предыдущей процедуркой также.. mov [tv.tv_sec],eax ; и пихаем сюда результат..т.е. заполняем струк- mov [tv.tv_usec],0 ; ..туру TIMEVAL invoke WSAStartup,1012h,wsadata ; инициализируем библиотеку сокетов cmp eax,0 ; проверка.. jb .err ; ..на вшивость invoke ws_gethostbyname, ip ; получаем информаци по хосту cmp eax,0 ; проверка.. je .err3 ; ..на вшивость virtual at eax ;-- .host hostent ; Ассоциируем указатель на структуруа со структурой которая определенна у вас в инклудах end virtual ;-- mov eax, [.host.h_addr_list] ; производим некоторые манипуляции.. mov eax, [eax] ;..со структурой.. mov eax, [eax] ;.. HOSTENT а именно получаем айпи адресс ; заполняем структуру sockaddr_in которая необходима для корректной работы создоваемого сокета ; Коментить небуду, думаю и так всё понятно- указываем айпи адресс, тип сокета и т.д mov [saddr.sin_addr],eax ;--- invoke htons,[port] ;--- mov [saddr.sin_port],ax ;--- mov [saddr.sin_family],AF_INET ;--- invoke socket, AF_INET, SOCK_STREAM, 6 ;---Сокет создан.. xchg eax, esi ; ..сохроняем его дескриптор invoke setsockopt, esi, SOL_SOCKET, SO_RCVTIMEO, tv, sizeof.TIMEVAL ; указываем таймаут invoke connect, esi, saddr, sizesaddr ; коннект cmp eax,-1 ; проверка.. jz .err2 ; ..на вшивость ; Дальше идёт формирование хидера/Его отправка (invoke send)/приём (invoke recv) invoke lstrlenA, sendbuf ;--- mov [sendbuf+eax],10 ;--- mov [sendbuf+eax+2],13 ;--- invoke lstrlenA, sendbuf ;--- mov [sendbuf+eax],10 ;--- mov [sendbuf+eax+2],13 ;--- invoke lstrlenA,sendbuf ;--- invoke send, esi, sendbuf, eax, 0 ;--- invoke recv, esi, recvbuf, 1000, 0 ;--- invoke lstrlenA,recvbuf ;--- cmp eax,0 ; проверка.. je @f ; ..на вшивость invoke SetDlgItemText, [hwnddlg], IDC_MEMO2,recvbuf ; пишем данные которые пришли от удалённого сервера jmp .processed @@: invoke SetDlgItemText, [hwnddlg], IDC_MEMO2,'Неудалось получить данные от сервера' ; в случае если по каким-то причинам буфер пуст- уведомляем. pop ecx eax ret ;---------------------------------------------------------------------------------------------- ; Всё данные отправленны/полученны, конец..Ниже указанны метки, переход на которые возникают при проверке на вшивость .err: invoke MessageBox,0,'Ошибка при инициализации WSOCK32.DLL','[ Simple ] HEADER_HTTP sender- Fatal error',MB_ICONERROR jmp .processed .err2: invoke MessageBox,0,'Неудаёться подключиться к хосту','[ Simple ] HEADER_HTTP sender- Error',MB_ICONINFORMATION jmp .processed .err3: invoke MessageBox,0,'Проверьте правильность заполнения поля "HOST/IP"','[ Simple ] HEADER_HTTP sender- Information',MB_ICONINFORMATION jmp .processed ;---------------------------------------------------------------------------------------------- .wmclose: invoke closesocket,esi invoke WSACleanup invoke EndDialog,[hwnddlg],0 .processed: mov eax,1 .finish: xor eax,eax .ret: ret endp ;------Ниже обьявление некоторых данных и секция ресурсов------------------------------------ saddr sockaddr_in sizesaddr = sizeof.sockaddr_in wsadata WSADATA ID_STATIC = 99 ID_COMMAND = 100 ID_MESSAGE = 101 IDC_BUTTON = 102 IDC_MEMO = 103 IDC_MEMO2 = 104 ID_MESSAGE2 = 105 UDM_SETRANGE32 = 046Fh SO_RCVTIMEO = 1006h SOL_SOCKET = 0ffffh port rd 2 ip rd 4 timeout rd 2 sendbuf rd 5000 recvbuf rd 100000 section '.rsrc' resource data readable directory RT_DIALOG,dialogs resource dialogs,1,LANG_RUSSIAN+SUBLANG_DEFAULT,TestDialog dialog TestDialog,'[ Simple ] HEADER_HTTP sender..:Coded by Ancord:..',80,120,500,220,WS_SIZEBOX+WS_CAPTION+WS _POPUP+WS_SYSMENU+DS_MODALFRAME dialogitem 'STATIC','HOST/IP:', ID_STATIC ,5,5, 30, 11, WS_VISIBLE dialogitem 'edit', 'site.ru', ID_MESSAGE,5,15, 75, 11, WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_LOWERCASE dialogitem 'STATIC','Port:', ID_STATIC ,80,5, 20, 11, WS_VISIBLE dialogitem 'edit', '80', ID_COMMAND,80,15, 25, 11, ES_NUMBER+WS_VISIBLE+WS_BORDER+WS_TABSTOP dialogitem 'STATIC','Timeout(ms):',ID_STATIC ,5,30, 75, 11, WS_VISIBLE dialogitem 'edit', '2000', ID_MESSAGE2,5,40, 30, 11, ES_NUMBER+WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_LOWER CASE dialogitem 'BUTTON','Connect',IDC_BUTTON,5,55,75,13,WS_CHILD+ WS_VISIBLE+WS_TABSTOP dialogitem 'EDIT','',IDC_MEMO2, 200,70,300,150,WS_SIZEBOX+ES_LEFT+ES_WANTRETURN+ES _MULTILINE+ES_AUTOVSCROLL+ES_AUTOHSCROLL+WS_VISIBL E+WS_BORDER+WS_VSCROLL+WS_HSCROLL+WS_TABSTOP dialogitem 'EDIT',,\ IDC_MEMO, 0,70,200,150,+ES_NOHIDESEL+ES_WANTRETURN+WS_SIZEBO X+ES_LEFT+ES_MULTILINE+WS_VISIBLE+WS_BORDER+WS_VSC ROLL+WS_HSCROLL+WS_TABSTOP enddialog |
Глянул мельком пример,интересует вот что:
source: Код:
includeГде его взять?В стандартном пакете вроде как нету. |
strtodword.inc:
code: proc GetZSLength push ecx push esi cld xor al, al mov ecx, 0FFFFFFFFh mov esi, edi repne scasb sub edi, esi mov eax, edi dec eax pop esi pop ecx ret endp proc STR_to_DWORD strc mov esi,[strc] mov eax,10 push esi push ebx push edi push edx push ecx cmp eax, 16 ja .error cmp eax, 2 jb .error mov ecx, eax mov edi, esi call GetZSLength mov edi, eax add edi, esi ; edi point to end ZS xor eax, eax xor edx, edx inc edx .rep: dec edi xor ebx, ebx mov bl, [edi] cmp bl, 30h jb .error cmp bl, 39h jna .digit cmp bl, 41h jb .error @@: cmp bl, 46h jna .sim_upcase cmp bl, 61h jb .error @@: cmp bl, 66h jna .sim_lowcase ja .error .digit: sub bl, 30h jmp @f .sim_upcase: sub bl, 37h jmp @f .sim_lowcase: sub bl, 57h @@: cmp bl, cl ja .error imul ebx, edx add eax, ebx imul edx, ecx cmp edi, esi jnz .rep .endrep: jmp @f .error: xor eax, eax @@: pop ecx pop edx pop edi pop ebx pop esi ret endp |
TOHEX- написал небольшую утилиту для снятия дампа. Выбераем исходный файл-> выбераем файл для сохранения- и на выходе получаем HEX эквивалент, результат вида
(в данном случае файл PE формата) code: 4D5A80000100000004001000FFFF0000400100000000000040 0000000000000000000000000000000000000 000000000000000000000000000000000800000000E1FBA0E0 0B409CD21B8014CCD21546869732070726F6772616D..etc source: Код:
format pe guiFASM |
Меняем пароль у ICQ номера через оф.сайт icq.com. В memo3 лист вида uin;pass в edit3 новый пароль,..
code: for j:=0 to memo3.lines.Count-1 do begin uin:=copy(memo3.lines[j],1,pos(';',memo3.lines[j])-1); pass:=copy(memo3.lines[j],pos(';',memo3.lines[j])+1,length(memo3.lines[j])); /////////////////// Гетим и парсим карму //////////////////////////// memo3.lines[j]:=uin+';'+pass+' - Get session'; try memo1.lines.Text:=Utf8ToAnsi(idhttp1.get('https://www.icq.com/login/ru?dest=/change-password/ru')); except memo3.lines[j]:=uin+';'+pass+' - error'; continue; end; memo3.lines[j]:=uin+';'+pass+' - Ok'; application.ProcessMessages(); karma:=copy(memo1.Lines.text,pos('karmaSyncKey" value="',memo1.lines.text)+21,64); //////////// 1 POST запрос - авторизация /////////////////////////// memo3.lines[j]:=uin+';'+pass+' - Authorization'; ts:=tstringlist.Create(); ts.add('karmaSyncKey='+karma); ts.add('dest='); ts.add('emailuin='+uin); ts.add('password='+pass); ts.add('remember_me='); IdHTTP1.Request.ContentLength:=sizeof(ts.text); try memo1.lines.Text:=Utf8ToAnsi(idhttp1.post('https://www.icq.com/login/ru',ts)); except memo3.lines[j]:=uin+';'+pass+' - error'; continue; end; memo3.lines[j]:=uin+';'+pass+' - Ok'; application.ProcessMessages(); //////////////// 2 GET запрос - получаем карму //////////////////////// memo3.lines[j]:=uin+';'+pass+' - Change password'; try memo1.lines.Text:=Utf8ToAnsi(idhttp1.get('https://www.icq.com/change-password/ru')); except memo3.lines[j]:=uin+';'+pass+' - error'; continue; end; application.ProcessMessages(); karma:=copy(memo1.Lines.text,pos('karmaSyncKey" value="',memo1.lines.text)+21,64); ////////////// ПОСЛЕДНИЙ POST запрос- меняем пасс /////////////////////// ts.Clear; ts.add('karmaSyncKey='+karma); ts.add('first_name='); ts.add('last_name='); ts.add('email='); ts.add('current_password='+pass); ts.add('password='+edit3.text); ts.add('retype_password='+edit3.text); IdHTTP1.Request.ContentLength:=sizeof(ts.text); try memo1.lines.Text:=Utf8ToAnsi(idhttp1.post('https://www.icq.com/change-password/ru',ts)); if pos('Пароль был успешно изменен',memo1.lines.text) > 0 then begin memo3.lines[j]:=uin+';'+pass+' - Ok'; memo4.lines.add(uin+';'+edit3.text); continue; end else memo3.lines[j]:=uin+';'+pass+' - No'; except memo3.lines[j]:=uin+';'+pass+' - error'; continue; end; end; showmessage('Completed!'); код совсем сырой и не оптимизированный ) код на делфи.. p/s есть вариант с synapse* и более модифированный, выложу весь проект если это кому интересно ) Delphi 7 |
Ancord,пример снятия дампа на fasm не компелится.
Выдаёт ошибку на вот этих строчках: source: Код:
sdex |
Цитата:
Сообщение от ChernoHod Ancord,пример снятия дампа на fasm не компелится. Выдаёт ошибку на вот этих строчках: source: Код:
sdexwin32ax.inc code: sdex fix section '.data' data readable writeable scex fix section '.code' code readable writeable executable siex fix section '.import' import data readable srex fix section '.rsrc' resource data readable |
авторизация vb4 и получение страницы, мб кому ещё пригодиться, недавно попросили написать
code: var post:Tstringlist; begin post:=TStringList.Create; post.Add('vb_login_username='+edit1.text); post.Add('vb_login_password='+edit2.text); post.Add('vb_login_password_hint='); post.Add('s='); post.Add('securitytoken=guest'); post.Add('do=login'); post.Add('vb_login_md5password='+AnsiLowerCase(MD5 (edit2.text))); post.Add('vb_login_md5password_utf='+AnsiLowerCase (MD5(edit2.text))); memo1.lines.text:=idhttp1.Post('http://site.com/login.php',post); ... memo1.lines.text:=idhttp1.get('site.com/showthread.php?'); Delphi 7 |
Простейший пример внедрения в процесс (инжект) и сплайсинг функции (в данном примере- CreateThread)
Проще говоря, мы внедряемся в процесс и меняем адресс API функции на адресс своей процедуры. code: format pe gui 4.0 include '..\inc\win32ax.inc' IDC_BUTTON = 102 sdex hwnd dd ? pid dd ? did dd ? hInstance dd ? hmem dd ? InjectCode: call $+5 pop esi sub esi, $-InjectCode-1 ; заполняем структуру pare - push 11111111 ret mov [esi+fj.pushSt-InjectCode],$68 lea eax,[esi+lala-InjectCode] mov [esi+fj.pushAdd-InjectCode],eax mov [esi+fj.reteAdd-InjectCode],$C3 ; пишем в память lea eax,[esi+wrt-InjectCode] push eax push 6 lea eax,[esi+fj-InjectCode] push eax lea eax,[esi+p_CreateThread-InjectCode] push 7C8106D7h ; add createthread push INVALID_HANDLE_VALUE call [esi+p_WriteProcessMemory-InjectCode] cmp eax,0 ; если ошибка то прыгаем.. je err1 retn 4 ; наша процедура которая будет вызываться.. proc lala call $+5 pop esi sub esi, $-InjectCode-1 push 0 lea eax, [esi+capt-InjectCode] push eax lea eax, [esi+mess-InjectCode] push eax push 0 call [esi+p_MessageBox-InjectCode] ret endp err1: push 0 lea eax, [esi+text-InjectCode] push eax lea eax, [esi+text-InjectCode] push eax push 0 call [esi+p_MessageBox-InjectCode] retn 4 p_MessageBox dd ? p_WriteProcessMemory dd ? wrt dd ? text db 'error write', 0 capt db 'Splice =*',0 mess db 'Данной действие запрещенно системой о.0',0 struct pare pushSt db 1 pushAdd dd 1 reteAdd db 1 ends fj pare <> InjectSize = $-InjectCode scex entry $ invoke InitCommonControls invoke GetModuleHandle, 0 mov [hInstance],eax invoke DialogBoxParam, [hInstance], 1, HWND_DESKTOP, DialogProc, 0 invoke ExitProcess,0 proc DialogProc hwnddlg,umsg,wparam,lparam push ebx esi edi cmp [umsg],WM_COMMAND je .WMCOMMAND cmp [umsg],WM_CLOSE je .WMCLOSE jmp .FINISH jmp @f .WMCOMMAND: cmp [wparam],IDC_BUTTON jnz .FINISH mov eax, [MessageBox] mov [p_MessageBox], eax ; Собсна- стандартный инжект. Выделяем некоторую область памяти, пишем наши данные и запускаем нить invoke FindWindow,NULL,'CAPTION PROCESS' cmp eax,0 je @f mov [hwnd],eax invoke GetWindowThreadProcessId,[hwnd],pid invoke OpenProcess, PROCESS_ALL_ACCESS, 0, [pid] test eax, eax jz @F mov [did],eax invoke VirtualAllocEx,eax,NULL,InjectSize,MEM_COMMIT,PAGE _READWRITE mov [hmem],eax invoke WriteProcessMemory,[did],[hmem], InjectCode, InjectSize, 0 invoke CreateRemoteThread,[did],0,0,[hmem],0,CREATE_SUSPENDED, 0 invoke ResumeThread,eax invoke CloseHandle,[pid] jmp .FINISH @@: invoke MessageBox,0,'err','err',0 jmp .FINISH .WMCLOSE: invoke EndDialog,[hwnddlg],0 .FINISH: mov eax,1 pop ebx esi edi xor eax,eax .ret: ret endp siex library kernel32, 'kernel32.dll', \ advapi32, 'advapi32.dll', \ user32, 'user32.dll', \ gdi,'GDI32.DLL', \ comctl32,'COMCTL32.DLL',\ winsock,'WSOCK32.DLL' include '..\inc\api\kernel32.inc' include '..\inc\api\advapi32.inc' include '..\inc\api\user32.inc' include '..\inc\api\GDI32.inc' include '..\inc\api\COMCTL32.inc' include '..\inc\api\wsock32.inc' srex directory RT_DIALOG,dialogs resource dialogs,1,LANG_RUSSIAN+SUBLANG_DEFAULT,TestDialog dialog TestDialog,'attack',80,120,90,62, WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME+WS_MI NIMIZEBOX dialogitem 'BUTTON','attach', IDC_BUTTON, 15, 15, 55, 13, WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON enddialog FASM |
| Время: 11:58 |