Вакцинатор Рувакцин.
(c) 1998 Ruwa
Идейные размышления
С легкой руки одного приятеля (А.Татуков) в мой башке засела мысль
написать вакцинатор.... Идея вакцинации сама по себе это очень
интересная идея, в плане борьбы с вирусами. К чему страдать от ожидания
дополнений к антивирусным средствам которые станут ловить и лечить
новые вирусы или их легкие изменения, достаточно просто подцепить
программку которая будет контролировать состояния основных
"стратегических" фрагментов файла. Вот и занялся я этой, кххммм,
ерундой.......
Идея достаточно проста, но от чего-то чайники не очень любят
вакцинироваться (впрочем как и ежедневно запускать прогаму Adinf ;)).
Цикл работы такой программы достаточно прост: она перехватыват
управление на себя и проверят начало программы-носителя с ее копией на
диске. Если вирус сел поверх вакцины, то естесно упраление первым
получит вирус, но (имеются в виду нормальные вирусы, которые
воостанавливают первоначальное состояние проги) после завершения работы
вируса управление получает вакцина и она сравнивает начало прогаммы
(jmp вакцина) в ___памяти___ с тем что находиться в этом же __файле__,
но на диске (а на диске будет jmp вирус).
Этот способ на будет работать при резидентных вирусах, которые
будут отслеживать открытие файла 3Dh и воостановливать файл !!!!!
Далее все просто, вакцина восстанавливает начальные байты (ставит
jmp вакцина) и корректирует длину файла !
Техническая реализация
Я не стал публиковать полностью рабочую версию вакцинатора (хи-хи,
по той простой причине что она еще не готова ;)). И представляю так
сказать рабочий скелет !!!! Итак вакцинатор для СОМ файлов -- Рувакцин
;)) Рувакцин прекрасно вел себя на всех вирусах которые имеются в моей
коллекции, он обнаруживал и воссанавливал оригинальную прогамму.
Рувакцин не проходил еще "мощной" проверки на предмет оптимизации
кода, так что не надо кидать в меня камнями, если кто-то увидит как что
-то можно сделать короче....
В вакцинаторе сделана антиэвристность ;)) Так что Паутиныч не орал
на него... "кажись вирус, кажись...". Осталные антивири вели себе
деликатно и не ругались.
На момент публикации оставлен ряд недоработок и технических
неточностей (ну дык, берете и сами пишите ;)):
- программа будет некорректно восстановлена, если вирус шифрует
фрагмент тела программы;
- не очень корректна инсталяция вакцины на программу, в смысле:
установка вакцины, последующее заражение вирусом, и опять установка
вакцины, том плане что возможно многократное повторение запуска
программы и она все будет лечиться, лечиться и лечиться.... до полного
излечения ;))
- "нарабочесть" вакцины если какой-то вирус стерет имя прогаммы в
переменной окружения, но этот ньюанс это вообще.... просто зло ;))
все замечания, пожелания, обругания, целования.... (нужное
подчеркнуть) жду на valery@ene.pcpes.elektra.ru
Вакцинатор Рувакцин (исходник) (c) 1998 Ruwa
;Cut - резать здесь
model tiny
locals
jumps
LenComBuffer EQU 15
LenBuffer EQU 30
FileExe EQU 1
FileCom EQU 2
Set EQU 0
ReSet EQU 1
dataseg
mode db ?
buffer db LenBuffer*2 dup(0)
fname db 13 dup (0)
err1 db 13,10,"Не могу открыть файл",13,10,24h
err2 db 13,10,"Вакцинация ЕХЕ файлов пока не реализована K",13,10,24h
err3 db 13,10,"Рувакцин _уже_ установлен",13,10,24h
err4 db 13,10,"Файл не защищен рувакцином",13,10,24h
msg1 db 13,10," Рувакцин установлен",13,10,24h
msg3 db 13,10," Рувакцин снят",13,10,24h
help db "RUVACCIN имя вакцинируемого файла",13,10
db " /U снять вакцину",13,10
db " (c)97 Ruwa Entertainment",13,10,24h
codeseg
startupcode
call CMDLine
jnc CMD_OK
lea dx, help
mov ah,9
int 21h
int 20h
CMD_OK:
; читаем атрубуты файла
mov ax,4300h
lea dx,fName
int 21h
jnc FileOK
lea dx, err1
mov ah,9
int 21h
int 20h
FileOK:
; сохраняем старые атрибуты
push cx
; и устанавливаем новые...
mov ax,4301h
lea dx,fName
mov cx,0
int 21h
; открывает для чтения и записи
mov ax,3D02h
lea dx, fname
int 21h
xchg ax,bx
; читаем начало файла
lea dx,buffer
mov cx,LenBuffer
mov ah,3Fh
int 21h
; запоминаем его время/дату
mov ax,5700h
int 21h
push cx
push dx
; проверка на ЕХЕшность
mov ax,word ptr[buffer]
not ax
mul ah
cmp ax,72BAh ; ну че ??? там стоит MZ или ZM
je GO_EXE ; точно ЕХЕ файл !
; ***********************************************
; ******* значит имеем дело с СОМ файлом ********
; ***********************************************
ComReSet: ;********* снимаем вакцину ************
cmp byte ptr[mode],ReSet
jne ComSet
lea dx,err4
; проверим ка, а стоит ли вакцинатор на файле
call ident
jnc exit ; если нет, то тогда чего снимать
; ************** снять вакцину ******************
mov si,word ptr[buffer+1] ; смещение для jmp'а
add si,5 ; попадем на область хранения старых байт и длины
mov dx,si
mov ax,4200h
xor cx,cx
int 21h
; считаем настоящее начало файла и его длину
mov ah,3Fh
mov cx,LenComBuffer+2
lea dx,buffer
int 21h
; сохраним длину файла в стеке
push word ptr[buffer+lenComBuffer]
call BOF
; и записываем оригинальные файты файла
mov ah,40h
lea dx,buffer
mov cx,LenComBuffer
int 21h
pop dx
mov ax,4200h
xor cx,cx
int 21h
; и отрезаем вакцину
mov ah,40h
mov cx,0
int 21h
lea dx,msg3
jmp exit
ComSet: ;********* ставим вакцину *************
lea dx,err3
; прoверим а может мы уже стоим ?
call ident
jc exit ; я так и знал уже стоим !!
; сохраним "настоящее" начало в вакцине
lea si,buffer
lea di,oldComByte
mov cx,LenComBuffer
rep movsb
; поскакали в конец файла
call EOF
; длина вакцинируемого файла
mov word ptr [oldComLen],ax
; формируем смещение для jmp'а
sub ax,3
mov word ptr [newComByte+1],ax
sub ax, offset BeginCom-103h
; записать смещение вакцины от начала проги
mov word ptr[StartCom+1],ax
; пишем свое бренное тело в хвост проги
mov cx,LenCom
lea dx,beginCom
mov ah,40h
int 21h
; будем менять начало файла..... скок
call BOF
; и запишем новый заголовок
mov cx,LenCombuffer
lea dx,newComByte
mov ah,40h
int 21h
lea dx,msg1
jmp exit
exit:
mov ah,9
int 21h
; восстановим время/дату
pop dx
pop cx
mov ax,5701h
int 21h
mov ah,3Eh
int 21h
; восстановим атрибуты
pop cx
mov ax,4301h
lea dx,fName
int 21h
ret
; ***********************************************
; ******* значит имеем дело с ЕХЕ файлом ********
; ***********************************************
GO_EXE:
lea dx,err2
jmp exit
;***********************************************
proc BOF
; прыг в начало файла
mov ax,4200h
xor cx,cx
xor dx,dx
int 21h
ret
endp
;***********************************************
proc EOF
; прыг в конец файла
mov ax,4202h
xor cx,cx
xor dx,dx
int 21h
ret
endp
;***********************************************
proc ident
; проверка на повторную установку
; CY - если вакцинатор установлен
cmp word ptr[buffer+3],'uR'
jne exit_ch
cmp word ptr[buffer+5],'aw'
jne exit_ch
stc
ret
exit_ch:
clc
ret
endp ident
;***********************************************
proc CMDLine
; помещает в переменную fName имя исследуемого файла
; если присутствует ключ /U то возвращает в переменной mode значение
lea di,fname
mov si,82h
or byte ptr[si-2],0
jnz cmd1
; если нет параметров, то сушим весла
stc
ret
cmd1:
lodsb
cmp al,32
je cmd3
cmd2:
cmp al,13
je cmd3
stosb
jmp cmd1
cmd3:
dec si
mov byte ptr[si],24h
cmd4:
lodsb
or al,al
je cmd_exit
cmp al,"/"
jnz cmd4
mov al, byte ptr[si]
or al,33
cmp al,'u'
jne cmd_exit
; режим работы - снять вакцину
mov byte ptr[mode],ReSet
cmd_exit:
ret
endp
;*************************************************************
;**************** Вакцинатор для СОМ файлов ******************
;*************************************************************
BeginCom EQU $
jmp StartCom
oldComByte db LenComBuffer dup('!')
oldComLen dw ?
exitCom:
ret
StartCom:
; в ВР смещение от начала проги
db 0BDh ; mov bp,
dw ?
mov si,[ds:2Ch]
mov ds,si
xor ax,ax
mov si,1
mov cx,2000
NextLoop:
dec si
lodsw
or ax,ax
jnz NextLoop
cmp word ptr[si],0001h
jnz ExitCom
mov dx,si
inc dx
inc dx
mov word ptr[cs:FileName+bp],dx
mov word ptr[cs:FileName+2+bp],ds
mov ax,3D00h
int 21h
push cs
pop ds
jc exitCom
xchg ax,bx
mov ah,3Fh
mov cx,LenComBuffer
mov dx,tempCombuffer
int 21h
mov ah,3Eh
int 21h
mov di,100h
mov si,dx
rep cmpsb
jnz mismatch
; все ОК и сдель передавать управление на прогу !!!
match:
mov di,100h
push di
; воостановить старые байты
lea si,oldComByte
add si,bp
mov cx,LenComBuffer
rep movsb
ret
mismatch:
lea dx,vComMes
add dx,bp
mov ah,9
int 21h
checkKey:
mov ah,10h
int 16h
cmp ah,03h ; Лечить
je k_cure
cmp ah,02h ; Игнорировать
je match
cmp ah,04h ; Завершить
jne not_key
int 20h
not_key:
mov ah,2
mov dl,7
int 21h
jmp checkKey
k_cure:
; загрузим в регистры имя файла в окружении программы
lds dx,dword ptr[FileName+bp]
; и прочитаем атрибуты
mov ax,4300h
int 21h
push cx ; сохраним их в стеке
mov ax,4301h ; и сбросим на файле
mov cx,0 ; к такой-то матери
int 21h
mov ax,3D02h
int 21h
xchg ax,bx
; запомним время/дату
mov ax,5700h
int 21h
push cx
push dx
push ds
push cs
pop ds
; запишем "вакцинированные" байты
mov ah,40h
mov cx,LenComBuffer
lea dx,newComByte
add dx,bp
int 21h
; прыг на длину проги с вакциной
mov ax,4200h
mov dx,[oldComLen+bp] ; настоящая длина файла
add dx,LenCom ; плюс длина вакцины
xor cx,cx
int 21h
pop ds
; обрезание
mov cx,0
mov ah,40h
int 21h
; восстанавливаем дату/время
mov ax,5701h
pop dx
pop cx
int 21h
; закрываем файл
mov ah,3Eh
int 21h
; восстанавливает атрибуты
pop cx ; сохраненные атрибуты
mov ax,4301h
int 21h
push cs
pop ds
ret
newComByte db 0E9h
dw 0
db "Ruwa"
FileName dd ?
vComMes db " Оба-на кажеться вирус !!",13,10
db "1 - игнорировать",13,10
db "2 - лечить",13,10
db "3 - завершить",13,10,24h
LenCom EQU $-BeginCom
tempCombuffer EQU 65235-LenCom
;*************************************************************
;**************** Вакцинатор для ЕХЕ файлов ******************
;*************************************************************
END
|