Я не совсем знал куда написать. К вирусологии это впринципе имеет отдалённое отношение. Вобшем я написал код который по идеи должен создавать новый треад в експлоере и грузить длл откуда вызывать функцию. вот этот код. Код (Text): ;.... Всевозможные инклуды и вариаблы покусаны ....; jmp code_injection ;<<<<<<<<<<<<<<<<<<<<<<<<<<<< AHTUNG. HEARE CODE THA WILL BE INJECTED TO EXPLOER >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; start_inject_code : mov eax, offset end_importz sub eax, offset start_importz add eax, $+7 call eax ;-------- imports and data --------; start_importz : iExitThread DD 0 iGetProcAddress DD 0 iLoadLibrary DD 0 ProcName DB "MSGBLA", 0 LibName DB "mylib.dll", 0 end_importz : ;-------- the code =) pop ebx mov eax, ebx add eax, offset LibName - offset start_importz push eax mov eax, ebx add eax, offset iLoadLibrary - offset start_importz call dword ptr [eax] test eax, eax jz error_call mov ecx, eax mov eax, ebx add eax, offset ProcName - offset start_importz push eax push ecx mov eax, ebx add eax, offset iGetProcAddress - offset start_importz call dword ptr [eax] test eax, eax jz error_call call eax error_call : call dword ptr [ebx] end_inject_code : ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; ;------ inject our code to exploer code_injection : mov eax, ExitThread mov iExitThread, eax mov eax, LoadLibrary mov iLoadLibrary, eax mov eax, GetProcAddress mov iGetProcAddress, eax ;--- debug ; jmp start_inject_code ;-------- invoke FindWindowA,addr svchost_cls, 0 invoke GetWindowThreadProcessId, eax, addr pid invoke OpenProcess, PROCESS_ALL_ACCESS, 1, pid mov phdr, eax invoke VirtualAllocEx, phdr, 0, 1000H , MEM_COMMIT, PAGE_EXECUTE_READWRITE mov mbase, eax invoke WriteProcessMemory, phdr, mbase, offset start_inject_code, offset end_inject_code- offset start_inject_code, 0 invoke CreateRemoteThread, phdr,0, 1000H, mbase, 0, 0, 0 invoke CloseHandle, phdr invoke ExitProcess, 0 Это всё вылетает уже в експлоере. Я не могу его отладить даже. Когда эта радость вылетает олли пишет что там якобы была ошибка при вызове. Чтобы проверить правильно ли я посчитал адресса я там вставил джамп который вместо того чтобы тулить код в експлоер выполняет его. Посмотрите там под ;---- debug это джамп идёт. В длл примитивный месадж бокс. Так вот если разкоментировать дебаг то всё прекрасно работает. Ну всмысле что оффсеты посчитаны правильно. В чём проблема ?
Я ВОТ ТАК ВОТ ДЕЛАЛ! Код (Text): format PE GUI 4.0 entry start include '%include%\win32a.inc' section '.code' code readable writeable executable _title db 'Win32 program template',0 _class db 'FASMWIN32',0 _bt db 'BUTTON',0 _ed db 'EDIT',0 _ch db 'Do somethink',0 mainhwnd dd ? hinstance dd ? count dd 5 _ret dd 0 msg MSG wc WNDCLASS start: invoke GetModuleHandle,0 mov [hinstance],eax invoke LoadIcon,0,IDI_APPLICATION mov [wc.hIcon],eax invoke LoadCursor,0,IDC_ARROW mov [wc.hCursor],eax and [wc.style],0 mov [wc.lpfnWndProc],WindowProc and [wc.cbClsExtra],0 and [wc.cbWndExtra],0 push [hinstance] pop [wc.hInstance] mov [wc.hbrBackground],COLOR_BTNFACE+1 and [wc.lpszMenuName],0 mov [wc.lpszClassName],_class invoke RegisterClass,wc ; call g_err invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSME NU,128,128,192,192,NULL,NULL,[hinstance],NULL mov [mainhwnd],eax invoke CreateWindowEx,WS_EX_STATICEDGE,_bt,_ch,WS_VISIBLE+WS_CHILD,1, 1,120,23,[mainhwnd],1,0,NULL invoke CreateWindowEx,WS_EX_STATICEDGE,_ed,_ch,WS_VISIBLE+WS_CHILD+ES _AUTOHSCROLL,1,25,170,18,[mainhwnd],2,0,NULL ; ------- MessageBox ------ push [MessageBox] pop [_MessageBoxA] ; ------- DeleteFile ------ push [DeleteFile] pop [_DeleteFileA] ; ------- VirtualFree ----- push [VirtualFree] pop [_VirtualFree] mov ebx,2 @@: invoke GetStockObject,DEFAULT_GUI_FONT invoke SendDlgItemMessage,[mainhwnd],ebx,WM_SETFONT,eax,0 dec ebx jz @F jmp @B @@: msg_loop: invoke GetMessage,msg,NULL,0,0 or eax,eax jz end_loop invoke TranslateMessage,msg invoke DispatchMessage,msg jmp msg_loop end_loop: invoke ExitProcess,[msg.wParam] proc WindowProc, hwnd,wmsg,wparam,lparam enter push ebx esi edi cmp [wmsg],WM_DESTROY je wmdestroy cmp [wmsg],WM_COMMAND je wmcommand cmp [wmsg],WM_CTLCOLOREDIT je wmctlcoloredit defwndproc: invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam] jmp finish wmctlcoloredit: jmp finish wmdestroy: invoke PostQuitMessage,0 xor eax,eax jmp finish wmcommand: cmp [wparam],1 jne finish ; Код по нажатия кнопки!!! ; int 3 invoke FindWindow,aProgman,0 test eax,eax ; если окно не найдено что завершение процедуры. jz finish mov ebx,esp ; Так вот посмотрите для начало портатип GetWindowThreadProcessId ; DWORD GetWindowThreadProcessId( ; HWND hWnd, // Дескриптор(описатель) окна ; LPDWORD lpdwProcessId ); // адресс к переменной каторая описывает индификатор процесса ; Так вы наверное спросите а почему я указал 3 параметра? ; А патому что первый это рескриптор, 2 это указатель на стек, 3 - это просто мусор ; просто я это командой выделяю в стеке 4 байта, что бы туда запистаь ProcessID invoke GetWindowThreadProcessId,eax,esp,eax ; pop ebx ; А тут мы востонавливаем стек и переносим PID в ebx. ; push ebx ; один и тот же заин .. эти две строки можно востоновить если потом понадобится ebx(PID) invoke OpenProcess,PROCESS_CREATE_THREAD+PROCESS_VM_OPERATION+PROCESS _VM_WRITE,0 test eax,eax jz finish xchg eax,ebx push ebx ; ebx - Указатель HProcess invoke VirtualAllocEx,ebx,0,_Injected_end-Injected,MEM_COMMIT,PAGE_EX ECUTE_READWRITE test eax,eax jz @F xchg eax,edi ; edi - адресс где в explorer'e мы скопировали наш код. invoke WriteProcessMemory,ebx,edi,Injected,_Injected_end-Injected,esp ,eax test eax,eax jz @F invoke CreateRemoteThread,ebx,0,0,edi,edi,0,esp add esp,4 test eax,eax jz @F invoke CloseHandle,eax ; - закрытие описателя потока @@: invoke CloseHandle ; - Закрытие описателя процесса explorer'a ; stdcall _z,0 xor eax,eax finish: pop edi esi ebx return endp macro bcall proc { local label1 call $+5 label1: pop eax add eax,proc-label1 call dword[eax] } macro bpush args { local label1 call $+5 label1: add dword[esp],args-label1 } proc Injected,lpParam enter @@: int 3 push MB_SYSTEMMODAL+MB_ICONWARNING bpush aProgman bpush _Train push 0 bcall _MessageBoxA bpush _Train bcall _DeleteFileA test eax,eax ;jz @B ; - Начало отчистки выделеной памяти. pop edx ; - Удаляем параметр lpParam из стека pop edx ; - В edx - находится адрес от куда эту функцию вызвали! push MEM_RELEASE ; dwFreeType push 0 ; dwSize push [lpParam] ; lpAddress push edx ; - Этот параметр не имеет прямого отношения к VirtualFree. bpush _VirtualFree pop eax jmp dword[eax] ; Вызов VirtualFree ; - Конец функции. Дальше идут праметры каторые важны для дальнейшего использ. _MessageBoxA dd 0 _DeleteFileA dd 0 _VirtualFree dd 0 aProgman db 'Progman',0 _Train db 'C:\Fasm\EXAMPLES\Work\Test\Inject-explorer\test_to_delete.txt',0 _Injected_end: endp proc g_err tmp_str dd ? enter pushad invoke GetLastError test eax,eax jz @F lea ebx,[tmp_str] invoke FormatMessage, FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM,0,eax,0,ebx,0,0 invoke MessageBox,0,[ebx],0, MB_OK + MB_ICONSTOP invoke LocalFree,[ebx] @@: popad return endp section '.idata' import data readable writeable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL',\ gdi,'GDI32.DLL' import kernel,\ GetModuleHandle,'GetModuleHandleA',\ ExitProcess,'ExitProcess',\ GetLastError,'GetLastError',\ FormatMessage,'FormatMessageA',\ LocalFree,'LocalFree',\ SetLastError,'SetLastError',\ OpenProcess,'OpenProcess',\ CloseHandle,'CloseHandle',\ VirtualAllocEx,'VirtualAllocEx',\ WriteProcessMemory,'WriteProcessMemory',\ CreateRemoteThread,'CreateRemoteThread',\ DeleteFile,'DeleteFileA',\ VirtualFree,'VirtualFree' import user,\ RegisterClass,'RegisterClassA',\ CreateWindowEx,'CreateWindowExA',\ DefWindowProc,'DefWindowProcA',\ GetMessage,'GetMessageA',\ TranslateMessage,'TranslateMessage',\ DispatchMessage,'DispatchMessageA',\ LoadCursor,'LoadCursorA',\ LoadIcon,'LoadIconA',\ PostQuitMessage,'PostQuitMessage',\ wsprintf,'wsprintfA',\ MessageBox,'MessageBoxA',\ SendDlgItemMessage,'SendDlgItemMessageA',\ GetDesktopWindow,'GetDesktopWindow',\ FindWindow,'FindWindowA',\ GetWindowThreadProcessId,'GetWindowThreadProcessId' import gdi,\ GetStockObject,'GetStockObject',\ CreateSolidBrush,'CreateSolidBrush'
вот рабочий пример самоудаления через RemoteThread (здесь код в Оперу прописывается и удаляет исходный экзэ) Код (Text): .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib .data szTarget byte 'OpWindow', 0 szUser32 byte 'USER32.DLL', 0 szSharedData byte 261 dup (0) .data? hModule dword ? hNewModule dword ? hProcess dword ? dwSize dword ? dwPid dword ? dwBytesWritten dword ? dwTid dword ? .code HijackedThread proc invoke LoadLibrary, addr szUser32 invoke DeleteFile, addr szSharedData invoke MessageBox, 0, addr szTarget, addr szTarget, 0 invoke ExitThread, 0 ret HijackedThread endp _entrypoint: invoke GetModuleHandle, 0 mov hModule, eax mov edi, eax assume edi:ptr IMAGE_DOS_HEADER add edi, [edi].e_lfanew add edi, sizeof dword add edi, sizeof IMAGE_FILE_HEADER assume edi:ptr IMAGE_OPTIONAL_HEADER32 mov eax, [edi].SizeOfImage mov dwSize, eax assume edi:NOTHING invoke GetModuleFileName, 0, addr szSharedData, 261 invoke FindWindowEx, 0, 0, addr szTarget, 0 invoke GetWindowThreadProcessId, eax, addr dwPid invoke OpenProcess, PROCESS_ALL_ACCESS, FALSE, dwPid mov hProcess, eax invoke VirtualFreeEx, hProcess, hModule, 0, MEM_RELEASE invoke VirtualAllocEx, hProcess, hModule, dwSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE mov hNewModule, eax invoke WriteProcessMemory, hProcess, hNewModule, hModule, dwSize, addr dwBytesWritten invoke CreateRemoteThread, hProcess, 0, 0, addr HijackedThread, hModule, 0, addr dwTid invoke ExitProcess, 0 end _entrypoint у тебя скорее всего переход не туда происходит... смотри параметры CreateRemoteThread
Большое спасибо. Я уже разобрался. Всё дело было в том что переход происходил не туда. Я то делал mov eax, [LoadLibraryA] к примуру на что оно мне помешало в eax ссылку на код типа jmp KERNEL32!LoadLibraryA. Вобшем я всё поправил. Просто я смотрел сурс где 500мхз делал такой прикол с помошью фасма. Но фасм компилит по нормальному в то время как масм творит какието чудеса. Ну я не сильно разбираюсь поэтому мог чегото и напутать с тем что оно там творит. Если кому стало интересно то вот код : Код (Text): jmp code_injection ;<<<<<<<<<<<<<<<<<<<<<<<<<<<< AHTUNG. HEARE CODE THA WILL BE INJECTED TO EXPLOER >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; start_inject_code : call end_importz ;-------- imports and data --------; start_importz : iExitThread DD 0 iGetProcAddress DD 0 iLoadLibrary DD 0 ProcName DB "LibMain", 0 LibName DB "srv.dll", 0 end_importz : ;-------- the code =) pop ebx mov eax, ebx add eax, offset LibName - offset start_importz push eax mov eax, ebx add eax, offset iLoadLibrary - offset start_importz call dword ptr [eax] test eax, eax jz error_call mov ecx, eax mov eax, ebx add eax, offset ProcName - offset start_importz push eax push ecx mov eax, ebx add eax, offset iGetProcAddress - offset start_importz call dword ptr [eax] test eax, eax jz error_call call eax error_call : push 0 call dword ptr [ebx] end_inject_code : ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; ;------ inject our code to exploer code_injection : mov eax, [LoadLibraryA] mov eax, [eax+2] mov eax, [eax] mov iLoadLibrary, eax mov eax, [ExitThread] ;BLA mov eax, [eax+2] mov eax, [eax] mov iExitThread, eax mov eax, [GetProcAddress] mov eax, [eax+2] mov eax, [eax] mov iGetProcAddress, eax ;--- debug ; jmp start_inject_code ;-------- invoke FindWindowA,addr svchost_cls, 0 invoke GetWindowThreadProcessId, eax, addr pid invoke OpenProcess, PROCESS_ALL_ACCESS, 1, pid mov phdr, eax invoke VirtualAllocEx, phdr, 0, 1000H , MEM_COMMIT, PAGE_EXECUTE_READWRITE mov mbase, eax invoke WriteProcessMemory, phdr, mbase, offset start_inject_code, offset end_inject_code- offset start_inject_code, 0 invoke CreateRemoteThread, phdr,0, 1000H, mbase, 0, 0, 0 invoke CloseHandle, phdr invoke ExitProcess, 0 ;===================================================================== ======; End start