Impulzus

 
A Budapesti Műszaki és Gazdaságtudományi Egyetem Villamosmérnöki és Informatikai Kar Hallgatói Képviseletének lapja

10 éves a vírus

Harmadik cikkéhez érkezett a sorozat, itt az ideje, hogy a történeti háttér és az általános elvek bemutatása után egy konkrét vírus kerüljön terítékre. A One Half éppen alkalmas e célra: néhány éve nagyon elterjedt volt honi viszonylatban, könnyen beszerezhető, és elég érdekes ahhoz, hogy érdemes legyen foglalkozni vele. Ha alaposan ki akarunk elemezni egy vírust, célszerű teljes assembly listát készíteni belőle, debuggert csak a kikódoláshoz használjunk. A One Half esetében ez nagyon egyszerű, a kikódoló ciklus kilépő utasítása után le lehet rakni egy töréspontot. Futtatás, töréspont, és máris előttünk hever a csupasz kód, és a hírhedt szövegüzenet: "Dis is one half. Press any key to continue". Ha már tudjuk, hogy kell kikódolni, akkor a DOS-os debug.exe kimenetének átirányításával kiírhatjuk a teljes listát egy asm fájlba.

	CMC 	PUSH	SS 	JMP	a1 	..... a1:	STC 	POP	DS	MOV	SI, 04C0 	JMP	a2	.....a2:	XOR	[SI],BX

A kikódoló ciklus látszólag feleslegesen ugrál ide-oda, és tele van hatástalan utasításokkal. Ez egy szokványos módszer, minden fertőzésnél más kitöltő utasítások kerülnek bele a kódba, nehezebb keresőt írni az ilyen vírusra. Ráadásul a foszlány utasítások a fertőzött program kódja közé keverednek (persze a One Half később precízen visszaállít mindent), ennek annyi haszna van, hogy egy kezdetleges keresőt meg tud téveszteni vele (a kereső nem kódolja ki a vírust, mert azt hiszi, hogy már a gazdaprogram fut), valamint nehezebbé teszi az irtást.

Szokványos teendők következnek, ellenőrzi, hogy rezidens-e:

	MOV	AX, 4B53	INT	21	CMP	AX,454B

Így persze egy kereső is leellenőrizheti, hogy aktív-e a One Half, a vírus "elárulja magát". Többek között az egyszerű ellenőrizhetőség miatt van, hogy a vírusok a memóriában nem szokták kódolni magukat (ha semmi ellenőrzés nem lenne, akkor mindig annyiszor íródna a vírus kódja a gazda kódjához, ahány fertőzött program futott le a boot óta :) ).

A következő lépés az INT 13 rutin (amely a közvetlen lemezfunkciókért felelős) futtatása utasításonként. A One Half folyamatosan figyeli, hogy hol jár a memóriában a rutin, és ha a kódszegmens kisebb egy adott értéknél, konstatálja, hogy ott az igazi belépési pont, ezután INT 13 helyett ezt a címet fogja hívogatni. (Ezzel kicselez egy esetleges aktív vírusvédelmet.) Egyből ki is használja a lehetőséget, megfertőzi a master boot rekordot, és egy nem használt lemezterületre kiírja magát (ez a terület a fájlrendszeren kívül esik, a bootoláskor így egyszerűbben be tud töltődni). Ilyen formán a One Half "kettős életet" él, bootszektorból és fájlokból is aktivizálódhat.

Ami miatt érdekes a One Half, az a merevlemez bekódolása. Minden újraindításnál kódol 2 sávot, emellett menet közben figyeli a lemezolvasási műveleteket, és a programoknak a kikódolt szektorokat adja vissza. Így a felhasználó semmit nem vesz észre abból, ami történik, rossz esetben csak akkor eszmél, ha valami amatőr program körültekintés nélkül írtja ki a master boot rekordból a One Half-ot. Ekkor ugyanis már fölöttébb feltűnő, hogy a merevlemez be van kódolva... Ha zavartalan a környezet, egyszer csak kiírja a vírus azt a bizonyos "Dis is one half" bölcsességet, amely korántsem jelenti a vinyó felének kódolt állapotát, hanem csak egy vinyómérettől függő, előre kiszámolt konstanst.

Egyébként az a "globális változó", amelyik megmutatja, hogy meddig van bekódolva a vinyó, szintén a boot-szektorban van, ezt állandóan frissíteni kell. Kissé kérdésessé teszi a technikát, hogy a BIOS bootszektor-védelme jelez, ettől azonban az akkori egységfelhasználónak nem kellett tartania, hiszen nem is tudta volna installálni a win95-öt a bekapcsolt bootvédelem mellett. :)

A One Half egyébként csak fájlokban juthat át más gépekre, a mérete (3.5 K) nem teszi lehetővé, hogy pici kis bootvírusként floppyk betöltő szektorát is megfertőzze. Van még egy érdekesség, amely a boot-fájl kettősséggel van összefüggésben. Bekapcsolás után betöltődik a master boot rekord, onnan egy kis rutin beolvas még 7 szektort (a teljes kódot), beindul a vírusgépezet. Rácsatlakozik a BIOS INT 13 megszakítására, hogy a lemezolvasásokat felügyelhesse, és szükség esetén kikódolgasson. Ezután a 21-es megszakításra is rá kell állnia, hogy fájlvírusként is működhessen, és felügyelje a futtatási, listázási stb. műveleteket. Ezt azonban nem teheti meg azonnal, mert a DOS még be sem töltődött (és amint betöltődik, felülírja az INT 21 vektorát). Módszer: beállítja a 21-es vektort egy nagy értékre, és az időzítő megszakításon aktivál egy rutint, amelyik állandóan figyeli azt. Amint a 21-es vektor szegmens értéke egy adott konstansnál kisebb, rá lehet állni, mert az azt jelenti, hogy a DOS betöltődött, és inicializálta az INT 21-et!

A vírusok fejtegetésének egyébként egy hasznos mellékterméke, hogy az ember igazán ráérez a DOS működésére, korlátaira, elhibázott tervezésére, programozására. Persze manapság a téma szinte csak elvi síkon érdekes, például felmerülhet a gondolkodó elmében, hogy vajon egy ilyen környezetben létezik-e "tökéletes" vírus, avagy "tökéletes" kereső. A sorozat következő cikkében erről lesz szó...

bereg