Purkan pakatun 16-bittisen DOS MZ EXE: n.
Hämärtääksesi sen, olen asettanut DOSboxiin katkaisupisteen purkamisrutiinin lopussa, antanut sen käydä ja tehnyt muistin kaataa. Näin sain olennaisesti epämääräisen EXE-kuvan.
Ongelmat alkoivat, kun latain kuvan IDA: han. En ymmärrä IDA: n käsitystä segmenteistä. Ne ovat samanlaisia kuin x86-segmentit, mutta on olemassa lukuisia eroja, joita en voi ymmärtää. Kun IDA pyysi minua luomaan ainakin yhden segmentin, tein vain yhden valtavan segmentin, joka on 1 Mt, koska ohjelman osoitetilassa oleva koodi ja data ovat sekoitettuja, eikä ole järkevää ottaa käyttöön erillisiä segmenttejä, kuten CODE
, DATA
jne.
IDA: n syöttökohdan näyttämisen jälkeen kaikki toimi hyvin: IDA: n toiminnot, paikalliset muuttujat, argumentit jne. on onnistunut. Ainoa ongelma on, että jotkut puhelut on merkitty nimellä NONAME
, vaikka ne osoittavat oikeisiin aliohjelmiin. Oudoin on, että näillä aliohjelmilla on oikeat XREF-tiedostot "laittomiin" puheluihin. Tässä on esimerkki:
seg000: 188FF 004 puhelu 1AD9h: 1; Soittomenettely
Tämä rivi on punainen ja siihen liittyy ongelma-luettelossa oleva NONAME
-ongelma. Miksi?
1AD9h: 1
seg: offset-osoite vastaa lineaarista osoitetta 0x1ad91
, jolla on tämä:
seg000: 1AD91; =============== ALARUUTU ================================= ===== seg000: 1AD91seg000: 1AD91; Attribuutit: bp-pohjainen frameseg000: 1AD91seg000: 1AD91 sub_1AD91 proc far; KOODI XREF: sub_188F2 + DP
Huomaa XREF. Joten IDA todella käsittelee puhelun oikein! Miksi puhelu katsotaan kelpaamattomaksi? IDA-ohjetiedosto sanoo tämän:
Ongelma: Nimeä ei löydy
Description Kaksi syytä voi aiheuttaa tämän ongelman :
- Viittaus laittomaan osoitteeseen tehdään olemassa olevassa ohjelmassa purettu;
- IDA ei löytänyt osoitteelle nimeä, mutta sen on oltava olemassa.
Mitä tehdä
Jos tämän ongelman aiheuttaa viittaus laittomaan osoitteeseen
- Yritä syöttää operandi manuaalisesti
- Tai tee laiton osoite lailliseksi luomalla uusi segmentti .
Muuten tietokanta on vioittunut.
Joten, ongelmana on kai se, että minulla on yksi jättimäinen segmentti useiden pienten sijasta . Mutta miten voin jakaa osoitetilan oikein sopiviin segmentteihin?
Tiedän rekisteriarvot (mukaan lukien DS
, CS
, SS
, IP
, jne.) tulopaikassa. Oletetaan, että luon CODE
-segmentin lähtökohdasta CS-rekisteriarvoa vastaavasta segmentistä. Mutta minkä pituisen tämän segmentin tulisi olla?
Mikä on segmenttien tarkoitus IDA: ssa ollenkaan? Jos DATA-segmentit voivat sisältää ohjeita ja CODE-segmentit voidaan lukea ja kirjoittaa tiedoina?
Anteeksi tällaisessa aloittelijakysymyksessä, mutta virallinen IDA-käsikirja on tunnetusti niukka ja HexRays-foorumit ovat minulle suljettuja, koska olen käytä freeware-versiota.