Igazán jó disassemblerhez szerintem külön projekt kéne, rendes ablakos programmal
Míg egy BASIC vagy WP fájl teljesen egyértelmű, jól kezelhető parancssoros programból (vagy ilyen feltöltős formában!), addig a gépi kód visszafejtésénél számos ponton emberi segítségre van szükség, ahogy azt a readme-ben is említed. Ezt éppen úgy is meg lehetne tenni, hogy újabb bemenő paraméterekkel futtatjuk a parancssoros dolgot, de elég kellemetlen újra kezdeni az egészet, amikor már több száz sornyi komment meg van
Szóval valami olyan interaktív program kéne mint az IDA, csak EP-s dolgokra fejlesztve.
Ettől még megmaradhatna a disassembler "motor" a parancssorosban is, pláne ebben a feltöltős formában! Egyszerű dolgokra mint pl egy betöltő visszafejtése már remeknek látszik!
Jöjjön tehát az álmom
alap az IDA működése.
A fált betölti a 64K címtartományban a megadott címre, amelyet az ismert típusoknál lehet a fejléc vagy típus alapján felajánlani.
A háttérben egy adatbázis dolgozik, amiben nyilván lesz tartva minden egyes bájtról, hogy kód, adat (DB), 16 bites adat, ASCII karakter, stb, valamint a bájtokhoz tartozó kommentsorokról is.
Minden egyes bájtra rá lehet bökni, megadva annak a típusát.
Alapból tehát egy rakás DB látszik, amíg rá nem bökünk egy adott helyre, hogy na ez kód. Ismert típusokhoz fel is lehet ajánlani a kezdőcímet kezdetnek.
Elsőként nyilván a program kezdetére bökünk, de később még számos alkalommal szükség lesz rá, ahogy felfedezünk pl. a JP (HL)-lel hívott szubrutinokat.
A megadott ponttól kezdve elindul az analízis, minden lehetséges elágazást bejárva, a feltárt kód bájtokat kóddá változtatva. Ezt már elég ügyesen tudja is a program, pár még kezelendő trükkről később írok még.
Ezután neki lát az ember a felderített kódot megérteni, kommentelni.
Szükség van arra, hogy az utasítások paramétereit módosítani, hogy az nem egy puszta szám, hanem a program egy pontja, ahova címkét kell tenni. Ez lehet adatra vagy kódra mutató, kódra mutatás megadása esetén már futhat is az analízis az adott címtől, ha eddig nem volt kód.
A címke generálásnál legyen lehetőség offsetet megadni, pl 0FFEH-ból legyen L1000-2, és a címke az 1000H címre kerül.
Ugyanez kéne címtáblázatok definiálásánál is, ahol egy rakás bájtról mondjuk meg, hogy ez most 16 bites rutincímek, amikhez mehet a címke gyártás, kód analizis.
Analizisnél olyan trükköket kéne kezelni, hogy ha utasításba történik írás/olvasás, azt az utasítás cimkéje+offset módon dekódolni, pl:
LD (L1000+1),A
...
L1000 LD A,0
Töltelékbájtos módszert kezelni, amikor egy plusz utasítás beszúrásával érvénytelenítik a következő utasítást, pl egy felesleges értékadás paramétereivé változtatva az utasítás bájtokat, az EXDOS tele van ilyenekkel:
;csatorna megnyítása olvasásra, automatikus szabad csatornaszám kereséssel
lc336: RES 7,L ;itt belépve L 7-es bitje nullázva
DB 01H ;töltelék bájt, hogy az utána következő SET 7,L ne fusson le
;csatorna megnyítása írásra, automatikus szabad csatornaszám kereséssel
LC339: SET 7,L ;itt belépve pedig egyes
Innentől egy rutin az írás/olvasás, az itt beállított jelzőbitet használva.
Ez visszafejtésnél ellentmondásként fog jelentkezni, mivel egy több bájtos utasításba lesz újabb belépés. Az ilyet úgy kéne feloldani, hogy a hátrébb lévő rövidebb utasítás legyen a kód, a kimaradó bájt pedig DB (kommentbe mehet, hogy mi lett volna innen nézve az utasítás).
Nagyon fontos lenne MACRO utasítás definiálási lehetőség: gyakran használt módszer, hogy az RST vagy CALL utasítás után adatbájtok találhatóak, amelyeket nem szabad kódként értelmezni, mert a valódi visszatérés majd ezek után történik. Kéznél is van a példa, az EXOS hívás, ahol egy adatbájt van az RST hívás után felhasználva.
Kétféle ilyen lehetőség kéne, az egyiknél az lenne megmondva, hány adatbájt van, másiknál meg az, hogy milyen értékig kell adatbájtnak értelmezni.
Pl. megmondjuk, hogy a CALL 1234H hívásnak legyen SZORZAS a neve, amit két adat bájt követ.
Ekkor definiálja a SZORZAS macrot, majd az összes eddigi kódban kijavítja az előforduló hívásokat, ezutáni kód analizisnél meg eleve használja.
Kellene PHASE blokk kezelés, amikor egy adott kódszakaszról megmondjuk, hogy az egy másik címen fut, ennem megfelelően kell újraanalizálni, címkézni. Ebből kétféle lehet, egyik amikor fix más kezdőcím (átmásolt kódrészlet, pl PHASE 0100H), ill a más lapra lapozás, amikor pl. PHASE $+8000H féle formában történik a módosulás, azaz +/- 4000h,8000h,C000h értékkel változnak az eredeti címek.