Ambrus
-7 °C
3 °C

Részből az egészet

2002.04.19. 09:28
Kész rendszerek kódjának elemzésével, megtalálhatók a bennük található rejtett hibák, rossz szándékú programrészek. Visszafejtésükkel olyan információkhoz lehet jutni, melyekkel velük kompatíbilis rendszereket lehet létrehozni, vagy éppen meg lehet tanulni egyféle technikai megközelítését egy adott problémának.
A biztonságtechnikai híradásokban egyre gyakrabban jelennek meg olyan hírek, melyek arról tudósítanak bennünket, hogy XY biztonsági szakértő ilyen és ilyen program elemzése során megállapította, hogy az - szemben a fejlesztő cég állításával - ezt és ezt teszi.

A visszafejtés kérdése egyrészt technikai, másrészt jogi természetű. Háromrészes cikkünkben az ezzel kapcsolatos kérdéseket szeretnénk vizsgálatunk tárgyává tenni.

A kódvisszafejtés nehézségei

A jelenlegi számítógépek bináris kódsorozatok feldolgozására alkalmasak. Ezek a kódsorozatok azt a folyamatot írják le, melyet az adott eszköz egyes elemeinek kell elvégezni. A problémák megfogalmazása azonban sokkal magasabb absztrakciós szinteket követel meg az informatikai eszközöktől. Ezek megvalósítására találták ki a programnyelveket, illetve ennél is magasabb szinteken a különféle tervezési eszközöket, ábrázolási módokat. Ezek olyan köztes leírási módok, melyek egyrészről olvashatóak ember által, másrészt lefordíthatóak a gép számára is.

Az egyes programnyelvekben készült kódrészek a fordítás során rengeteg apró elemi utasításra bomlanak fel. Az így elkészült kódból nem lehet egyértelműen visszakövetkeztetni az eredeti utasítássorra. Olyan ez, mintha egy ételreceptet elemi mozdulatokra fordítanánk le. A csipetnyi só hozzáadását például a következőkre fordítanánk le: fordítsuk el az alkarunkat 30 fokkal, engedjük lejjebb 111 mm-el a kezünket, zárjuk össze a mutató és a hüvelyk újunkat, emeljük fel a kezünket, 111 cm-el, fordítsuk el az alkarunkat 40 fokkal, nyissuk szét a hüvelyk és a mutató újunkat.

Egy ilyen gépi szintű programból csak a teljes kód, és az egyéb jellemzők, adatok figyelembevételével (hol a só, meddig van az edényben a só, stb.) lehet az eredeti szándékot visszakövetni.

A helyzet valójában még ennél is bonyolultabb, hiszen a fordítóprogramok optimalizálást is végeznek, azaz bizonyos kódrészeket összevonnak, szétbontanak, vagy átstrukturálnak a gyorsabb végrehajtás, a kisebb helyfoglalás vagy egyéb célok érdekében. Az előbbi analógiával élve a mondjuk a főzelék és a leves megsózását például egy műveletté vonja össze a fordító. Mivel a számítógép a programkódot és az adatokat egyaránt a memóriában tárolja, a visszafejtést megnehezítendő sok esetben létre lehet hozni olyan kódot is, melyben kódrészek adatnak, adatok kódnak látszanak, és csak a végrehajtás során derül ki igazi rendeltetésük. Ezt a technikát előszeretettel alkalmazzák a vírusírók.

Az interneten barangolva sok helyről letölthetnénk olyan programokat, amelyek képesek lefordított programokból valamilyen nyelvű forráskódot előállítani (decompiller). Ezek természetesen nem az eredeti forrásszöveget hozzák újra létre, hiszen látható, hogy a visszafejtés az esetek többségében eleve nem adhatja vissza az eredeti kódot.

A cikk következő részében a kódvisszafejtés és a technikai fejlődés kapcsolatáról lesz szó.