Vienna 648

På 1980-talet, långt innan Internet fanns, piratkopierade vi datorprogram och datorspel genom att dela 3½-tums disketter med varandra. En bunt disketter med program lämnades till en datorintresserad kompis i utbyte mot en annan bunt disketter med andra program. Den bunt disketter som min pappas läkarkollega Göran Grip en gång lämnade till mig för att jag skulle fylla dem med program (jag minns idag inte vad det kan ha varit) blev aldrig återlämnade. Det skaver fortfarande i mitt samvete, även om det rimligen borde vara preskriberat vid det här laget.

Det var i samband med detta piratkopierande och delande som jag första gången stötte på ett datorvirus. Det började med att datorn helt oväntat startade om när jag gav ett kommando vid DOS-prompten. När samma sak hände nästa gång jag försökte mig på samma kommando började jag ana oråd, och jag fann snart att någonting inte stod rätt till med själva programfilen.

IBM PC baserades på Intels 8086-processor som var en mycket enkel processor. Den saknade, bland annat, skyddat läge och det var därför fullt möjligt för vilket program som helst att adressera hela internminnet (1024 kb). När det gällde program, fanns det två typer av exekverbara filer, dels EXE-filer som bestod av relokerbar objektkod som först lästes in i minnet varefter alla relativa referenser fick absoluta adresser i internminnet, dels en enklare COM-fil som helt enkelt bestod av en avbild av maskinkoden som lästes in direkt i ett segment internminnet och exekverades. COM-filer kunde dock inte vara större än att de rymdes i 8086-processorns minnessegment och de var därför begränsade till 16384 bytes.

Det kommando jag hade försökt använda och som nu bara fick datorn att starta om var en COM-fil. När jag inspekterade den närmare fann jag att den började med följande hexadecimala kod:

1
EA F0 FF 00 F0

När COM-filen lästes in i ett minnessegment och exekverades var det alltså ovanstående maskinkod som exekverades. Men vad var då det för kod? Det hexadecimala värdet EA är Intel 8086-processorns instruktion att utföra ett hopp till en angiven 32-bitarsadress, och maskinkoden kan således utläsas:

1
JMP F000:FFF0

Det första som hände när COM-filen lästes in i internminnet och exekverades var alltså att processorn hoppade till adressen F000:FFF0 och fortsatte att exekvera kod där. Vad är det för adress? Det är den kod som körs när datorn startar upp. Instruktionen fick helt enkelt datorn att starta om sin egen uppstartssekvens.

Intel 8086-processorn var en 16-bitars processor med 20-bitars minnesadressering. För att kunna adressera 20 bitar användes två 16-bitars pekare, ett segment och en position inom segmentet; segmentet skiftades fyra bitar varefter positionen adderades, vilket resulterade i en 20-bitars minnesposition. När Intel 8086-processorn startade upp började den att exekvera kod från segment FFFF och position 0000, alltså minnesposition FFFF:0000, eller, uttryckt som en 20-bitars adress, FFFF0. Men det är precis samma adress som F000:FFF0 – så vad COM-filen gjorde var helt enkelt att börja exekvera samma kod som 8086-processorn exekverade när den först slogs på.

Detta var inte någon slump. Jag förstod att jag hade drabbats av ett datorvirus. Jag sökte vidare, och fann programkod i början på andra COM-filer som inte borde vara där. Den programkoden sökte rätt på andra COM-filer, flyttade 648 bytes från början av filen till slutet av den och lade till en kopia av sig själv i början. Under vissa omständigheter skrev den bara över början av filen med instruktionen ovan som alltså startade om datorn. Den ändrade sekunderna i datumstämpeln på den smittade filen till 62 så att den inte smittade samma fil två gånger. Eftersom kommandot DIR för att lista filer i DOS endast visade timmar och minuter syntes det inte.

Det tog någon dag att skriva ett program som sökte rätt på alla infekterade COM-filer och återställde dem. De COM-filer som förstörts med reboot-koden fick jag återställa från disketter. Men efter det hade jag på egen hand rensat datorn från det datorvirus som jag så småningom fick veta gick under kodbeteckningen Vienna.

Mitt specialarbete på gymnasiet kom att handla om datorvirus, och där visade jag hur man kunde utnyttja den totala avsaknaden av minnesskydd i 8086-processorn till att dölja skadlig kod dels i BIOS dataområde, dels i bildminnet. Detta fungerade dock bara på PC-datorer med monokrom grafik (ingen färggrafik) eftersom det då fanns flera sammanhängande minnespositioner i BIOS dataområdet som aldrig användes. Att dirigera om DOS standardavbrott INT 21 till BIOS dataområde var det dock en smula vanskligt, vill jag minnas. Det var långt ifrån alltid det fungerade i praktiken och ett och annat antivirusprogram protesterade högljutt.

Datorviruset jag konstruerade för specialarbetet förblev en prototyp. Däremot knåpade min kusin Mats Gefvert och jag ihop en datorvirus som vi kallade för Peebrain (stavningen var avsiktlig). Det byggde på samma princip som Vienna, men hade ingen skadlig kod och återställde dessutom den ursprungliga COM-filen när den smittade en annan så att viruset, åtminstone i teorin, alltid bara skulle finnas i endast en kopia. Varje gång det smittade – eller snarare flyttade sig – till en ny COM-fil skrev det »You won’t get rid of me, peebrain!« på skärmen.

Vi kopierade datorviruset till en diskett och skickade den till en annan bekant, Magnus Axelsson. Han fattade dock misstankar och satte aldrig in disketten i sin dator. Tråkigt. Peebrain var trots allt ett ganska harmlöst datorvirus.

Jag minns också att jag någonstans i assemblerkoden skrev ned ett replikskifte från filmen The Naked Gun:

1
2
; - Sex, Frank?
; - No, not now, we've got work to do.

Vill minnas att kusin Mats skrattade en hel del åt det.

Kommentarer