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

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

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

DOS вирусы

141

 

 

Далее последовали простейшие эксперименты с графикой. Для примера я приведу простую программу на Ассемблере, которая отрисовывает анимированное серое море. Данный эффект в вирусах я не встречал, но как пример для данной части повествования он идеален.

Вот листинг:

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

 

 

 

 

 

.model

tiny

 

 

.code

 

 

 

org

100h

 

 

start:

 

 

 

 

 

push

ax

 

; Положим в стек 0a000h

 

push

bp

 

; = VGA дисплей сегмент

 

mov

bp,sp

 

;

 

mov

word ptr [bp+2],0A000h

;

 

pop

bp

 

;

 

pop

es

 

 

 

push

es

 

 

 

pop

ds

 

 

 

mov

al,13h

; Устанавливаем видеодисплей в al

 

int

10h

 

; (320x200x256)

 

mov

dx,3C8h

; Порт 3C8h, VGA адрес

 

xor

ax,ax

 

; ax = 0

 

out

dx,al

 

 

 

inc

dx

 

 

 

mov

ch,1

 

 

 

mov

bl,15h

; 256/(4*3) = цвет = серый

dac:

 

out

dx,al

; Порт 3C9h, VGA регистр данных

 

add

bh,bl

 

 

 

adc

al,ah

 

 

 

loop

dac

 

 

main:

mov

si,320

 

 

mov

ch,7Dh

 

 

push

si

 

 

 

push

cx

 

 

 

xor

bx,bx

 

; Получение эффекта без этой линии

disp:

lodsb

 

 

; Строка [si] в al

 

mov

bl,[si]

 

 

add

ax,bx

 

 

 

mov

bl,ds:[si+100]

 

 

add

ax,bx

 

 

 

mov

bl,[si-2]

 

 

add

ax,bx

 

 

 

shr

ax,1

 

; Сдвиг с заполнением нулями

 

shr

ax,1

 

 

 

mov

ds:[si-102],al

 

 

loop

disp

 

 

 

pop

di

 

;

 

pop

cx

 

 

rnd:

142

 

DOS вирусы

 

 

 

mul

word ptr [di]

; ax = данные * ax (случайное число)

inc

ax

 

stosw

 

; Сохраним ax в es:[di]

dec

di

 

loop

rnd

 

mov

ah,1

; Если нажата клавиша, то на выход

int

16h

 

jz

main

 

mov

ax,3

 

int

10h

; Вернем обратно видеорежим

 

 

; (и очистим экран)

ret

 

; Завершаем программу

end start

 

 

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

 

 

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

Теперь переходим к звуковому сопровождению компьютерных вирусов. Представленный ниже фрагмент взят мной из вирусного журнала «Infected Voice».

Рассмотрим листинг:

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

PAUS = 1 END_MUSIC = 0

.model small

.8086

.code int_1C_handler:

mov

bx,cs:counter

 

shl

bx,1

 

mov

ax,word ptr cs:[bx][offset mus]

cmp

ax,END_MUSIC

 

jne

continue

 

mov cs:counter,0FFFFh

 

iret

 

 

continue: cmp ax,PAUS

 

jne not_pause

 

in al,97

 

and

al,0FCh

 

out

97,al

; Выключаем PC speaker

jmp

return

 

not_pause:

 

out 66,al

 

mov al,ah

 

out 66,al

 

in

al,97

 

or

al,3

 

out

97,al

return:

inc

cs:counter

DOS вирусы

143

 

 

iret

 

start:

 

mov ax,351Ch

; Получаем вектор прерывания 1C

int

21h

 

mov

cs:old1c,bx

 

mov

ax,es

 

mov

cs:old1ch,ax

; Сохраняем вектор прерывания 1C

push cs

 

pop ds

 

mov dx,offset int_1C_handler

mov ax,251ch

; Устанавливаем новый вектор

int

21h

 

wait_for: cmp cs:counter,0FFFFh

jne wait_for

 

in al,97

 

and

al,11111100b

 

out

97,al

; Выключаем PC speaker

lds

dx,dword ptr cs:old1c

mov

ax,251ch

 

int

21h

; Восстанавливаем вектор прерывания 1C

mov

ax,4C00h

 

int

21h

; Завершение программы

EVEN

 

 

A =

5422

; Ноты и соответствующие им частоты

B =

5117

 

H =

4830

 

C =

4559

 

CIS

= 4303

 

D =

4061

 

DIS

= 3833

 

E =

3619

 

F =

3416

 

FIS

= 3224

 

G =

3042

 

GIS

= 2872

 

A2 = 2711

 

B2 = 2559

 

H2 = 2415

 

C2 = 2279

 

CIS2 = 2151

 

P =

PAUS

 

mus:

DW F,F,F,F,F,F,F, E,E,E,E,E,E,E, D,D,D,D,D,D,D, C,C,C,C,C,C DW G,G,G,G,G,G,G,G,G, P,P,P, G,G,G,G,G,G,G,G,G, P,P,P

DW F,F,F,F,F,F,F, E,E,E,E,E,E,E, D,D,D,D,D,D,D, C,C,C,C,C,C DW G,G,G,G,G,G,G,G,G,G, P,P,P,P, G,G,G,G,G,G,G,G,G,G, P,P,P

DW F,F,F,F,F,F,F, A2,A2,A2,A2,A2,A2, P,P, A2,A2,A2,A2,A2,A2, F,F,F,F,F,F,F DW E,E,E,E,E,E,E, G,G,G,G,G,G, P,P, G,G,G,G,G,G, E,E,E,E,E,E,E

DW D,D,D,D,D,D,D, E,E,E,E,E,E,E, F,F,F,F,F,F,F, D,D,D,D,D,D,D DW C,C,C,C,C,C,C,C,C, P,P,P,P, C,C,C,C,C,C,C,C,C

144

DOS вирусы

 

DW PAUS,END_MUSIC

old1c dw 00

 

old1ch

dw 00

counter dw 00

.stack end start

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

Данная программа проигрывает мелодию «Гуси» при помощи внутреннего динамика, а задержки между его писком сформированы при помощи таймера. В самой программе есть блок, где описываются ноты и соответствующие им частоты. И потом из этих нот формируется музыкальный буфер, который и будет впоследствии проигран. То есть для проигрывания новой мелодии вам достаточ- но изменить очередность нот в буфере и их количество. К примеру, берете любую песню, расписанную по нотам, и записываете ее в массив mus. После ассемблирования и компоновки эта программа будет играть уже другую музыку.

Наконец, финал всех развлечений разработчиков компьютерных вирусов — это соединение видеоэффектов и звуковых эффектов в анимационных роликах. Идущий далее ролик взят мной из того же вирусного журнала «Infected Voice», а в самом журнале написано, что этот ролик был взят из листинга компьютерного вируса «Crucifixion».

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

.model tiny

.code

.radix 16 org 100 start:

mov ah,09

;

mov dx,offset MyMsg

; Это вывод сообщения от авторов "Infected Voice"

int 21

;

mov ah,08

;

int 21

; И ожидание, пока не будет нажата клавиша

jmp CrucifixionActivation

;

MyMsg db 'Demo effect of (rucifiction Virus (C)Jesus/The Trinity',0dh,0a

db 'Mail to: SGWW, Box 15, Moscow 125080 for viruses and more...

',0dh,0a

db 0dh,0a

 

db 'Press any key to enjoy...','$'

 

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

 

 

CrucifixionActivation:

 

SetScreen:

 

 

mov

ax,13

 

int

10

 

push

cs cs

 

pop

es ds

 

SetColors:

 

 

mov

ax,1012

 

DOS вирусы

145

 

 

 

xor

bx,bx

 

mov

cx,08

 

mov

dx,offset ColorData

 

int

10

 

DoTitle:

 

 

mov

dx,09

 

call

setcurs

 

mov

si,offset Vname

 

call

WriteIt

 

mov

dx,0103

 

call

setcurs

 

mov

si,offset credits

 

call

writeit

 

SetupPic:

 

 

push

cs

 

pop

ds

 

mov

si,offset StartCross

 

mov

di,0a000

 

mov

es,di

 

mov

di,3640

 

call

DrawIt

 

GetKey:

 

 

call

DoMusic

 

DoneGraphics:

 

mov

ax,3

 

int

10

 

call

Speaker_On

 

mov

cx,100

 

FallingSound:

 

mov

ax,cx

 

call

Out_Sound

 

call

delay

 

add

cx,200

 

cmp

cx,1a00

 

jb

FallingSound

 

call

Turn_Off_Speaker

 

RestoreStack:

 

ret

 

 

DrawIT:

 

 

mov

bp,di

 

DrawLoop:

 

 

lodsb

 

 

cmp

al,0ff

 

je

Line

 

cmp

al,0

 

je

Eol

 

stosb

 

 

jmp

DrawLoop

 

146

 

DOS вирусы

 

 

 

Line:

 

 

lodsb

 

; Получим цвет

xchg

cx,ax

; Сохраним в cl

xor

ah,ah

; Обнулим ah

lodsb

 

; Получим длину строки

xchg

cx,ax

; Положим цвет в al и длину в cx

repnz

stosb

 

jmp

DrawLoop

 

Eol:

 

 

cmp

byte ptr [si],0

je

DoneDraw

 

mov

di,bp

 

add

di,320d

 

jmp

Drawit

 

DoneDraw:

 

 

ret

 

 

WriteIt:

 

 

lodsb

 

 

or

al,al

 

jz

DoneWrite

 

mov

bx,4

 

mov

ah,0e

 

int

10

 

jmp

WriteIt

 

DoneWrite:

 

 

ret

 

 

setcurs:

 

 

mov

ah,02

 

mov

bh,0

; Устанавливаем курсор

int

10

 

ret

 

 

IfYourThe:

 

 

push

si

 

mov

si,offset Lyrics1

DoLyric:

 

 

mov

dx,1001

 

call

setcurs

 

call

WriteIt

 

pop

si

 

jmp

PlayMusic

 

ClapYour:

 

 

push

si

 

mov

si,offset Lyrics2

jmp

DoLyric

 

YourFace:

 

 

push

si

 

mov

si,offset Lyrics3

jmp

DoLyric

 

DOS вирусы

147

 

 

 

DoMusic:

 

 

push

cs

 

pop

ds

 

mov

si,offset MusicData

 

PlayMusic:

 

 

lodsw

 

 

cmp

ax,0

 

je

DoneMusic

 

cmp

ax,1

 

je

TurnItOn

 

cmp

ax,2

 

je

TurnItOff

 

cmp

ax,-1

 

je

WaitSome

 

cmp

ax,-2

 

je

Scree

 

cmp

ax,3

 

je

IfYourThe

 

cmp

ax,4

 

je

CLapYour

 

cmp

ax,5

 

je

YourFace

 

cmp

ax,6

 

je

TheClap

 

call

Out_Sound

 

jmp

PlayMusic

 

DoneMusic:

 

 

ret

 

 

TurnItOn:

 

 

call

Speaker_On

 

jmp

PlayMusic

 

TurnItOff:

 

 

call

Turn_Off_Speaker

 

jmp

PlayMusic

 

WaitSome:

 

 

mov

cx,3

 

WaitMore:

 

 

call

delay

 

loop

WaitMore

 

jmp

PlayMusic

 

TheClap:

 

 

push

es ds si di

 

mov

si,offset Arms3

 

je

DoArms3

 

Scree:

 

 

push

es ds si di

 

DoArms2:

 

 

mov

si,offset Arms2

 

148

DOS вирусы

 

 

DoArms3:

 

mov

di,0a000

mov

es,di

mov

di,3640+320d*10d

call

DrawIt

call

Speaker_On

mov

cx,400

cmp

si,offset Arms3

ja

MakeScreech

mov

cx,8000

MakeScreech:

mov

ax,cx

call

Out_Sound

call

delay

sub

cx,3f

cmp

si,offset Arms3

ja

LowCheck

cmp

cx,7f00

ja

MakeScreech

call

Turn_Off_Speaker

jmp

short DoArms1

LowCheck:

 

cmp

cx,300

ja

MakeScreech

call

Turn_Off_Speaker

DoArms1:

 

mov

si,offset Arms1

mov

di,0a000

mov

es,di

mov

di,3640+320d*10d

call

DrawIt

pop

di si ds es

jmp

PlayMusic

delay:

 

push

ax ds

xor

ax,ax

mov

ds,ax

mov

ax,word ptr ds:[46c]

waiter:

 

cmp

ax,word ptr ds:[46c]

je

waiter

pop

ds ax

ret

 

Turn_Off_Speaker:

in

al,61h

and

al,0FCh

out

61h,al

ret

 

DOS вирусы

149

 

 

 

Speaker_On:

 

 

in

al,61h

 

or

al,3

 

out

61h,al

; Включим внутренний динамик

mov

al,0B6h

 

out

43h,al

 

ret

 

 

Out_Sound:

 

 

out

42h,al

 

mov

al,ah

 

out

42h,al

 

ret

 

 

ColorData:

db 0,0,0,32,1f,13,1bh,12,9,12,0e,6,19,0,0,2a,1a,10,0,13,0,0,0,18

;Данные изображения

;Символ 0ff говорит о том, что это начало линии, а символ 0, что это конец

;Формат линии:

;0ffh, цвет, длина

;

; Двойной ноль говорит, что это конец файла

StartCross:

db 0ff,0,18d,0ff,3,0a,0 db 0ff,0,18d,0ff,3,0a,0

db 0ff,0,18d,3,3,3,0ff,2,5,3,3,0 db 0ff,0,18d,3,3,6,0ff,2,5,6,3,0 db 0ff,0,18d,3,3,2,6,2,6,2,6,2,3,0 db 0ff,0,18d,3,3,2,1,7,1,7,1,2,3,0 db 0ff,0,18d,3,3,2,0ff,1,5,2,3,0 db 0ff,0,18d,3,3,2,1,5,5,5,1,2,3,0 db 0ff,0,18d,3,3,2,2,1,1,1,2,2,3,0

db 0ff,3,20d,2,2,1,1,1,2,2,0ff,3,18d,0

db 3,3,3,5,0ff,3,13d,5,5,2,2,2,1,1,1,2,2,2,5,5,0ff,3,12d,5,3,3,0

db 3,3,5,5,5,0ff,3,7,0ff,5,6,1,2,2,2,1,1,1,2,2,2,1,0ff,5,6,0ff,3,6,5,5,5,3,0 db 3,5,4,3,4,0ff,5,7,0ff,1,7,2,2,2,1,1,1,2,2,2,0ff,1,7,0ff,5,6,4,3,4,5,0

db 3,3,5,4,5,0ff,1,15d,2,2,1,1,1,2,2,0ff,1,14d,5,4,5,3,0 db 3,3,3,0ff,5,17d,0ff,1,7,0ff,5,16d,3,3,0

db 0ff,3,20d,5,0ff,1,5,5,3,0ff,3,17d,0 db 0ff,0,18d,3,3,5,0ff,1,5,5,3,0

db 0ff,0,18d,3,3,5,0ff,1,5,5,3,0 db 0ff,0,18d,3,3,5,0ff,1,5,5,3,0 db 0ff,0,18d,3,3,5,0ff,1,5,5,3,0 db 0ff,0,18d,3,3,5,0ff,1,5,5,3,0 db 0ff,0,18d,3,3,5,0ff,1,5,5,3,0 db 0ff,0,18d,3,3,5,0ff,1,5,5,3,0 db 0ff,0,18d,3,2,5,0ff,1,5,5,2,0 db 0ff,0,18d,3,0ff,2,09,0

db 0ff,0,18d,0ff,2,0a,0 db 0ff,0,18d,0ff,2,0a,0

db 0ff,0,18d,0ff,2,5,1,2,2,2,1,2,0 db 0ff,0,18d,2,2,2,2,1,2,2,2,1,2,2,0

150

DOS вирусы

 

 

db 0ff,0,18d,2,5,2,1,1,5,2,1,1,2,2,0 db 0ff,0,18d,2,5,1,1,1,5,1,1,1,5,0 db 0ff,0,18d,3,5,1,1,1,5,1,1,1,5,0 db 0ff,0,18d,3,5,1,1,1,5,1,1,1,5,0 db 0ff,0,18d,3,5,1,1,1,5,1,1,1,5,0 db 0ff,0,18d,3,5,1,1,1,5,1,1,1,5,0 db 0ff,0,18d,3,3,5,1,1,5,1,1,5,5,0 db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0 db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0 db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0 db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0 db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0 db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0 db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0 db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0 db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0 db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0 db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0 db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0 db 0ff,0,18d,3,3,4,3,4,5,4,3,4,3,0 db 0ff,0,18d,3,3,5,4,5,5,5,4,5,3,0 db 0ff,0,18d,3,3,3,0ff,5,5,3,3,0

db 0ff,0,18d,0ff,3,0a,0 db 0ff,0,18d,0ff,3,0a,0 db 0ff,0,18d,0ff,3,0a,0 db 0ff,0,18d,0ff,3,0a,0,0 endcross:

Arms1:

db 3,3,3,5,0ff,3,13d,5,5,2,2,2,1,1,1,2,2,2,5,5,0ff,3,12d,5,3,3,0

db 3,3,5,5,5,0ff,3,7,0ff,5,6,1,2,2,2,1,1,1,2,2,2,1,0ff,5,6,0ff,3,6,5,5,5,3,0 db 3,5,4,3,4,0ff,5,7,0ff,1,7,2,2,2,1,1,1,2,2,2,0ff,1,7,0ff,5,6,4,3,4,5,0

db 3,3,5,4,5,0ff,1,15d,2,2,1,1,1,2,2,0ff,1,14d,5,4,5,3,0 db 3,3,3,0ff,5,17d,0ff,1,7,0ff,5,16d,3,3,0,0

EndArms1:

Arms2:

db 3,3,3,3,0ff,3,13d,5,5,2,2,2,1,1,1,2,2,2,5,5,0ff,3,12d,3,3,3,0

db 3,3,3,5,5,0ff,3,7,0ff,5,6,1,2,2,2,1,1,1,2,2,2,1,0ff,5,6,0ff,3,6,5,3,3,3,0 db 3,3,3,5,4,0ff,5,7,0ff,1,7,2,2,2,1,1,1,2,2,2,0ff,1,7,0ff,5,6,4,5,3,3,0

db 3,3,3,5,5,0ff,1,15d,2,2,1,1,1,2,2,0ff,1,14d,5,5,3,3,0 db 3,3,3,0ff,5,17d,0ff,1,7,0ff,5,16d,3,3,0,0

EndArms2:

Arms3:

db 3,3,3,3,0ff,3,13d,5,5,2,2,2,1,1,1,2,2,2,5,5,0ff,3,12d,3,3,3,0

db 3,3,3,3,3,0ff,3,7,0ff,5,6,1,2,2,2,1,1,1,2,2,2,1,0ff,5,6,0ff,3,6,3,3,3,3,0 db 3,3,3,3,3,0ff,5,7,0ff,5,7,2,2,2,5,5,5,2,2,2,0ff,5,7,0ff,5,6,3,3,3,3,0

db 3,3,3,3,3,3,3,3,0ff,5,12d,2,2,4,4,4,2,2,0ff,5,12d,3,3,3,3,3,3,0 db 3,3,3,0ff,3,10d,0ff,5,10d,4,4,0ff,5,10d,0ff,3,0a,0,0

EndArms3:

;

Музыкальные данные

;

1 = Включить внутренний динамик 2 = Выключить внутренний динамик

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