Yksinkertaisesti sanottuna dekompilaatio on käänteinen käännös: käännetään suoritettava tiedosto korkeamman tason kielelle.
Oletetaan, että kadotat Delphi-projektisi lähteen ja sinulla on vain suoritettava tiedosto: käänteinen suunnittelu (dekompilointi) on hyödyllinen, jos alkuperäisiä lähteitä ei ole saatavana.
Hm, "lähteitä ei ole saatavilla", tarkoittaako tämä, että voimme purkaa muiden ihmisten Delphi-hankkeet? No, kyllä ja ei ...
Onko tosi dekompilaatio mahdollista?
Ei tietenkään. Täysin automatisoitu dekompilaatio ei ole mahdollista - mikään dekompilaattori ei pystynyt toistamaan alkuperäistä lähdekoodia tarkasti.
Kun Delphi-projekti käännetään ja linkitetään tuottamaan itsenäinen suoritettava tiedosto, suurin osa ohjelmassa käytetyistä nimistä muunnetaan osoitteiksi. Tämä nimien menetys tarkoittaa, että purkajan olisi luotava yksilölliset nimet kaikille vakioille, muuttujille, funktioille ja menettelyille. Vaikka saavutetaan tietty menestysaste, generoidusta "lähdekoodista" puuttuu merkityksellisiä muuttuja- ja toiminimiä.
Lähtökielen syntaksia ei selvästikään ole olemassa suoritettavassa ohjelmassa. Dekompileerille olisi erittäin vaikeaa tulkita suoritettavassa tiedostossa olevia konekielinkäskyjen (ASM) sarjoja ja päättää, mikä alkuperäinen lähteen käsky oli.
Miksi ja milloin käyttää dekompilointia
Käänteistä suunnittelua voidaan käyttää monista syistä, joista jotkut ovat:
- Kadonneen lähdekoodin palauttaminen
- Sovellusten siirtäminen uuteen laitteistoalustaan
- Virusten tai haittaohjelmien olemassaolon määrittäminen ohjelmassa
- Virheenkorjaus, kun sovelluksen omistaja ei ole käytettävissä korjaamaan.
- Joku toisen lähdekoodin palauttaminen (esimerkiksi algoritmin määrittämiseksi).
Onko tämä laillista?
Käänteinen suunnittelu EI ole halkeilua, vaikka joskus on vaikeaa vetää hieno viiva näiden kahden välillä. Tietokoneohjelmat ovat suojattu tekijänoikeus- ja tavaramerkkilakeilla. Eri maissa on erilaisia poikkeuksia tekijänoikeuksien omistajien oikeuksiin. Yleisimmissä todetaan, että on mahdollista purkaa kokonaan: selkeyttämistä varten, jos rajapintamäärittelyä ei ole asetettu saataville, virheenkorjauksen tarkoitukset, jos tekijänoikeuden omistajalla ei ole mahdollisuutta tehdä korjausta, määrittää ohjelman osat, joita ei suojaa tekijänoikeus. Tietysti sinun tulee olla hyvin varovainen / ottaa yhteyttä asianajajaasi, jos olet epävarma siitä, saako sinun purkaa jonkin ohjelman exe-tiedoston.
Huomautus: Jos etsit Delphi-halkeamia, avaingeneraattoreita tai vain sarjanumeroita: olet väärällä sivustolla. Muista, että kaikki täältä löytyy on kirjoitettu / esitetty vain tutkimustarkoituksiin.
Toistaiseksi Borland ei tarjoa mitään tuotetta, joka kykenee purkamaan suoritettavan (.exe) tiedoston tai "Delphin käännetyn yksikön" (.dcu) takaisin alkuperäiseen lähdekoodiin (.pas).
Delphin kääntämä yksikkö (DCU)
Kun Delphi-projekti käännetään tai suoritetaan, luodaan käännetty yksikkö (.pas)-tiedosto. Oletuksena kunkin yksikön käännetty versio tallennetaan erilliseen binaarimuotoiseen tiedostoon, jolla on sama nimi kuin yksikötiedostolla, mutta laajennuksella .DCU. Esimerkiksi unit1.dcu sisältää yksikön1.pas-tiedostossa ilmoitetun koodin ja tiedot.
Tämä tarkoittaa, että jos sinulla on esimerkiksi joku, komponenttikokoonpanot lähde, sinun on vain käännettävä se ja haettava koodi. Väärä. DCU-tiedostomuoto ei ole dokumentoitu (oma muoto) ja se voi vaihdella versiosta toiseen.
Kääntäjän jälkeen: Delphi Reverse Engineering
Jos haluat yrittää purkaa Delphi-suoritetiedoston, nämä on joitain asioita, jotka sinun pitäisi tietää:
Delphi-ohjelmien lähdetiedostot tallennetaan yleensä kahteen tiedostotyyppiin: ASCII-kooditiedostot (.pas, .dpr) ja resurssitiedostot (.res, .rc, .dfm, .dcr). Dfm-tiedostot sisältävät lomakkeessa olevien kohteiden yksityiskohdat (ominaisuudet). Kun luot exe, Delphi kopioi .dfm-tiedostoina olevat tiedot valmiiksi .exe-kooditiedostoksi. Lomaketiedostot kuvaavat jokaisen lomakkeen komponentin, mukaan lukien kaikkien pysyvien ominaisuuksien arvot. Joka kerta, kun muutamme lomakkeen sijaintia, painikkeen kuvatekstiä tai osoitamme tapahtumomenettelyn komponentille, Delphille kirjoittaa nämä muutokset DFM-tiedostoon (ei tapahtumakoodin koodiin - tämä tallennetaan pas / dcu-tiedostoon tiedosto). Jotta "dfm" saadaan suoritettavasta tiedostosta, meidän on ymmärrettävä, millaisia resursseja Win32-suoritettavissa on.
Kaikilla Delphin laatimilla ohjelmilla on seuraavat osiot: CODE, DATA, BSS, .idata, tls, .rdata, .rsrc. Tärkeimmät purkamisen kannalta ovat CODE- ja .rsrc-osiot. Kohdassa "Toimintojen lisääminen Delphi-ohjelmaan"artikkeli näyttää joitain mielenkiintoisia faktoja Delphin suoritettavista tiedostomuodoista, luokan tiedoista ja DFM-resursseista: kuinka määritellä tapahtumia muille samassa muodossa määritettyjen tapahtumakäsittelijöiden käsittelemille. Vielä enemmän: kuinka voit lisätä oman tapahtumakäsittelijän lisäämällä koodin suoritettavaan tiedostoon, mikä muuttaa painikkeen kuvatekstiä.
Monien tyyppisten resurssien joukossa, jotka tallennetaan exe-tiedostoon, RT_RCDATA tai sovelluksen määrittelemä resurssi (raakadata) sisältää tiedot, jotka olivat DFM-tiedostossa ennen kokoamista. DFM-datan purkamiseksi exe-tiedostosta voidaan soittaa EnumResourceNames API-toiminto... Lisätietoja DFM: n purkamisesta suoritettavasta artikkelista: Koodataan Delphi DFM -selainta artikla.
Käänteistekniikan taito on perinteisesti ollut teknisten velhojen maa, joka tuntee kokoonpanokielen ja virheenkorjaimet. Useita Delphin purkajia on ilmestynyt, joiden avulla kuka tahansa voi, jopa rajoitetun teknisen tietämyksen mukaan, kääntää suurimman osan Delphin suoritettavista tiedostoista.
Jos olet kiinnostunut käänteissuunnittelu Delphi-ohjelmista, suosittelen teitä katsomaan seuraavia muutamia "purkajia":
Suoritettavien tiedostojen (EXE) ja dynaamiset kirjastot (DLL), kirjoitettu Delphissä ja suoritettu Windows32-ympäristössä. Projektin lopullinen päämäärä on ohjelman kehittäminen, joka pystyy palauttamaan suurimman osan alkuperäisestä Delphistä lähdekoodit kootusta tiedostosta, mutta IDR, samoin kuin muut Delphin purkajat, eivät voi vielä tehdä sitä. Tästä huolimatta IDR on selvästi sellaisen prosessin helpottamiseksi. Verrattuna muihin tunnettuihin Delphi-dekompiloijiin IDR-analyysin tulos on suurin täydellisyys ja luotettavuus.
Revendepro löytää melkein kaikki rakenteet (luokat, tyypit, proseduurit jne.) Ohjelmasta ja luo pascal-esityksen, proseduurit kirjoitetaan kokoonpanijassa. Kokoonpanijan rajoituksista johtuen tuotettua lähtöä ei voida kääntää uudelleen. Tämän dekompiloijan lähde on vapaasti saatavilla. Valitettavasti tämä on ainoa purkaja, jota en pystynyt käyttämään - se kehottaa poikkeustapauksessa, kun yrität purkaa joitain Delphi-suoritettavia tiedostoja.
EMS Source Rescuer on helppokäyttöinen ohjattu sovellus, jonka avulla voit palauttaa kadonneen lähdekoodin. Jos kadotat Delphi- tai C ++ Builder -projektilähteesi, mutta sinulla on suoritettava tiedosto, tämä työkalu voi pelastaa osan kadonneista lähteistä. Pelastaja tuottaa kaikki projektilomakkeet ja datamoduulit kaikilla määritetyillä ominaisuuksilla ja tapahtumilla. Tuotuissa tapahtumaprosesseissa ei ole runkoa (se ei ole purkaja), mutta niillä on koodin osoite suoritetussa tiedostossa. Useimmissa tapauksissa pelastaja säästää 50–90% ajasta projektin palauttamiseen.
DeDe on erittäin nopea ohjelma, joka pystyy analysoimaan Delphin kanssa koottuja suoritettavia tiedostoja. Dekompiloinnin jälkeen DeDe antaa sinulle seuraavan:
- Kaikki kohteen dfm-tiedostot. Voit avata ja muokata niitä Delphin avulla.
- Kaikki julkaistut menetelmät hyvin kommentoidussa ASM-koodissa viittauksilla merkkijonoihin, tuotuihin funktiokutsuihin, luokkamenetelmäpuheluihin, yksikön komponentteihin, Try-Except- ja Try-Final -lohkoihin. Oletusarvoisesti DeDe hakee vain julkaistut menetelmälähteet, mutta voit myös käsitellä toisen proseduurin suoritettavassa tiedossa, jos tiedät RVA-siirron Työkalut | Pura Proc-valikko.
- Paljon lisätietoja.
- Voit luoda Delphi-projekti-kansion kaikilla dfm-, pas-, dpr-tiedostoilla. Huomaa: pas-tiedostot sisältävät yllä mainitut hyvin kommentoidut ASM-koodit. Niitä ei voi kääntää uudelleen!