Технологии борьбы с компьютерными вирусами. Практическое пособие
.pdfDOS вирусы |
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 = Выключить внутренний динамик |
