Delphi decompileren (1/3)

Delphi decompileren (1/3)

Eenvoudig gezegd is decompilatie het omgekeerde van compilatie: een uitvoerbaar bestand vertalen naar een taal van een hoger niveau.

Stel dat u de bron van uw Delphi-project verliest en u alleen het uitvoerbare bestand hebt: reverse engineering (decompilatie) is handig als de originele bronnen niet beschikbaar zijn.

Hm, "bronnen niet beschikbaar", betekent dit dat we de Delphi-projecten van anderen kunnen decompileren? Nou ja en nee ...

Is echte decompilatie mogelijk?

Nee natuurlijk niet. Volledig geautomatiseerde decompilatie is niet mogelijk - geen enkele decompiler kan de oorspronkelijke broncode exact reproduceren.

Wanneer een Delphi-project wordt gecompileerd en gekoppeld om een ​​zelfstandig uitvoerbaar bestand te produceren, worden de meeste namen die in het programma worden gebruikt, geconverteerd naar adressen. Dit verlies van namen betekent dat een decompiler unieke namen moet maken voor alle constanten, variabelen, functies en procedures. Zelfs als een bepaalde mate van succes wordt bereikt, mist de gegenereerde "broncode" betekenisvolle variabele en functienamen.
Het is duidelijk dat de syntaxis van de brontaal niet langer bestaat in het uitvoerbare bestand. Het zou heel moeilijk zijn voor een decompiler om de reeks machinetaalinstructies (ASM) in een uitvoerbaar bestand te interpreteren en te beslissen wat de oorspronkelijke broninstructie was.

Waarom en wanneer decompilatie gebruiken?

Reverse engineering kan om verschillende redenen worden gebruikt, waarvan enkele:

  • Herstel van verloren broncode
  • Migratie van applicaties naar een nieuw hardwareplatform
  • Bepaling van het bestaan ​​van virussen of schadelijke code in het programma
  • Foutcorrectie wanneer de eigenaar van de toepassing niet beschikbaar is om de correctie uit te voeren.
  • Herstel van de broncode van iemand anders (om bijvoorbeeld een algoritme te bepalen).

Is dit legaal?

Reverse engineering kraakt NIET, hoewel het soms moeilijk is om de dunne lijn tussen die twee te trekken. Computerprogramma's worden beschermd door auteursrechten en handelsmerken. Verschillende landen hebben verschillende uitzonderingen op de rechten van de auteursrechteigenaar. De meest voorkomende zijn dat het ok is om te decompileren: met het oog op interpreteerbaarheid wanneer de interfacespecificatie niet beschikbaar is gesteld, voor foutcorrectie waarbij de eigenaar van het auteursrecht niet beschikbaar is om de correctie te maken, om onderdelen te bepalen van het programma dat niet auteursrechtelijk is beschermd. Natuurlijk moet u heel voorzichtig zijn / contact opnemen met uw advocaat als u twijfelt of u het exe-bestand van een programma mag demonteren.

Notitie: als u op zoek bent naar Delphi-scheuren, sleutelgenerators of alleen serienummers: u bevindt zich op de verkeerde site. Houd er rekening mee dat alles wat je hier vindt alleen is geschreven / gepresenteerd voor exploratie / educatieve doeleinden.

Op dit moment biedt Borland geen producten die in staat zijn een uitvoerbaar bestand (.exe) of de "Delphi gecompileerde eenheid" (.dcu) te decompileren naar de oorspronkelijke broncode (.pas).

Delphi Compiled Unit (DCU)

Wanneer een Delphi-project wordt gecompileerd of uitgevoerd, wordt een gecompileerd eenheidsbestand (.pas) gemaakt. Standaard wordt de gecompileerde versie van elke eenheid opgeslagen in een afzonderlijk bestand in binaire indeling met dezelfde naam als het eenheidsbestand, maar met de extensie .DCU. Unit1.dcu bevat bijvoorbeeld de code en gegevens die zijn opgegeven in het bestand unit1.pas.

Dit betekent dat als je bijvoorbeeld iemand hebt die een component-gecompileerde bron is, je deze alleen hoeft om te keren en de code te krijgen. Mis. Het DCU-bestandsformaat is ongedocumenteerd (eigen formaat) en kan van versie naar versie veranderen.

Na de compiler: Delphi Reverse Engineering

Als u wilt proberen een uitvoerbaar Delphi-bestand te decompileren, zijn dit enkele dingen die u moet weten:

Bronbestanden van Delphi-programma's worden meestal in twee bestandstypen opgeslagen: ASCII-codebestanden (.pas, .dpr) en bronbestanden (.res, .rc, .dfm, .dcr). Dfm-bestanden bevatten de details (eigenschappen) van de objecten in een formulier. Bij het maken van een exe kopieert Delphi informatie in .dfm-bestanden naar het voltooide .exe-codebestand. Formulierbestanden beschrijven elke component in uw formulier, inclusief de waarden van alle permanente eigenschappen. Telkens wanneer we de positie van een formulier, het bijschrift van een knop wijzigen of een gebeurtenisprocedure aan een component toewijzen, schrijft Delphi die wijzigingen in een DFM-bestand (niet de code van de gebeurtenisprocedure - dit wordt opgeslagen in het pas / dcu-bestand). Om de "dfm" van het uitvoerbare bestand te krijgen, moeten we weten welk type bronnen zijn opgeslagen in een Win32-uitvoerbaar bestand.

Alle programma's samengesteld door Delphi hebben de volgende secties: CODE, DATA, BSS, .idata, tls, .rdata, .rsrc. De belangrijkste vanuit het oogpunt van decompilatie zijn de secties CODE en .rsrc. In het artikel "Functionaliteit toevoegen aan een Delphi-programma" worden enkele interessante feiten over het uitvoerbare formaat van Delphi, klasse-informatie en DFM-bronnen getoond: hoe gebeurtenissen opnieuw toe te wijzen om te worden afgehandeld door andere gebeurtenishandlers die in dezelfde vorm zijn gedefinieerd. Meer nog: hoe u uw eigen gebeurtenishandler toevoegt, de code toevoegt aan het uitvoerbare bestand, dat het bijschrift van een knop verandert.

Onder vele soorten bronnen die zijn opgeslagen in een exe-bestand, bevat de RT_RCDATA of de door de toepassing gedefinieerde bron (onbewerkte gegevens) de informatie die zich vóór de compilatie in het DFM-bestand bevond. Om de DFM-gegevens uit een exe-bestand te extraheren, kunnen we de EnumResourceNames API-functie ... Zie voor meer informatie over het extraheren van DFM uit een uitvoerbaar bestand: Een Delphi DFM-verkennerartikel coderen.

De kunst van reverse engineering is van oudsher het land van technische tovenaars, bekend met assemblagetaal en debuggers. Er zijn verschillende Delphi-decompilers verschenen waarmee iedereen, zelfs met beperkte technische kennis, de meeste uitvoerbare bestanden van Delphi kan reverse-engineeren.

Als u geïnteresseerd bent in reverse engineering Delphi-programma's, raad ik u aan de volgende paar "decompilers" te bekijken:

IDR (Interactive Delphi Reconstructor)

Een decompiler van uitvoerbare bestanden (EXE) en dynamische bibliotheken (DLL), geschreven in Delphi en uitgevoerd in Windows32-omgeving. Het uiteindelijke projectdoel is de ontwikkeling van het programma dat in staat is om het grootste deel van de oorspronkelijke Delphi-broncodes uit het gecompileerde bestand te herstellen, maar IDR, evenals andere Delphi-decompilers, kunnen dit nog niet doen. Desalniettemin bevindt IDR zich aanzienlijk in een dergelijk proces. In vergelijking met andere bekende Delphi-decompilers heeft het resultaat van IDR-analyse de grootste volledigheid en betrouwbaarheid.

Revendepro

Revendepro vindt bijna alle structuren (klassen, types, procedures, enz.) In het programma en genereert de pascal-representatie, procedures worden in assembler geschreven. Vanwege enige beperking in de assembler kan de gegenereerde uitvoer niet opnieuw worden gecompileerd. De bron voor deze decompiler is gratis beschikbaar. Helaas is dit de enige decompiler die ik niet kon gebruiken - het geeft een uitzondering wanneer u probeert een uitvoerbaar bestand van Delphi te decompileren.

EMS-bronredder

EMS Source Rescuer is een eenvoudig te gebruiken wizard-toepassing die u kan helpen om uw verloren broncode te herstellen. Als u uw Delphi of C ++ Builder projectbronnen verliest, maar een uitvoerbaar bestand hebt, dan kan deze tool een deel van verloren bronnen redden. Redder produceert alle projectformulieren en gegevensmodules met alle toegewezen eigenschappen en gebeurtenissen. Geproduceerde gebeurtenisprocedures hebben geen body (het is geen decompiler), maar hebben een codeadres in een uitvoerbaar bestand. In de meeste gevallen bespaart Redder 50-90% van uw tijd om te projecteren.

DeDe

DeDe is een zeer snel programma dat uitvoerbare bestanden kan analyseren die zijn gecompileerd met Delphi. Na decompilatie geeft DeDe u het volgende:

  • Alle dfm-bestanden van het doel. Je kunt ze openen en bewerken met Delphi.
  • Alle gepubliceerde methoden in goed becommentarieerde ASM-code met verwijzingen naar tekenreeksen, geïmporteerde functieaanroepen, klassenmethodeaanroepen, componenten in de eenheid, Try-Except en Try-Uiteindelijk-blokken. Standaard haalt DeDe alleen de gepubliceerde methoden op, maar u kunt ook een andere procedure in een uitvoerbaar bestand verwerken als u de RVA-offset kent met behulp van het menu Tools | Demontage Proc.
  • Veel extra informatie.
  • U kunt een Delphi-projectmap maken met alle dfm-, pas-, dpr-bestanden. Opmerking: pas-bestanden bevatten de hierboven vermelde goed becommentarieerde ASM-code. Ze kunnen niet opnieuw worden gecompileerd!