Delphi dekompilieren
Warum die Dekompilierung eine delphi-exe-Datei ist so einfach, im Vergleich zu anderen ausführbaren Dateien gebaut, die mit anderen Programmiersprachen/Compiler?
Warum denkst du es ist leicht?
Decompilers verschiedener Qualität gibt es für alle Programmiersprachen, die kompiliert werden, ich bin mir dessen bewusst. Meist ist die Qualität ziemlich schlecht.
Zu wissen, die Namen von visuellen Komponenten Klassen (zB.,
Das Programm, das Sie verknüpfen, schafft eine .pas-Datei, die mit
Wenn ich mich Recht erinnere, DeDe ist nur ein disassembler, der versteht ein bisschen von Delphi Metadaten. Nannte es ein decompiler ist irreführend.
Decompilers verschiedener Qualität gibt es für alle Programmiersprachen, die kompiliert werden, ich bin mir dessen bewusst. Meist ist die Qualität ziemlich schlecht.
Zu wissen, die Namen von visuellen Komponenten Klassen (zB.,
TMyForm
, TEdit1
usw.) nicht helfen, Sie wissen nichts über die Funktionalität der Anwendung. Ihre Behauptung, dass dies macht es einfacher, zu dekompilieren ist Unsinn, zu wissen, dass Delphi32 verwendet eine window-Klasse namens TAppBuilder
bedeutet nicht, Sie können schreiben, eine neue version der Delphi-IDE mit den gleichen Funktionen.Das Programm, das Sie verknüpfen, schafft eine .pas-Datei, die mit
assembler code
im inneren. nicht wirklich das, was ich nennen würde ein Programm dekompiliert, nur demontiert. Es tut nichts besonderes.Wenn ich mich Recht erinnere, DeDe ist nur ein disassembler, der versteht ein bisschen von Delphi Metadaten. Nannte es ein decompiler ist irreführend.
InformationsquelleAutor BlackShadow | 2011-05-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Dinge, die helfen, mit Umkehrung delphi-Programme:
published
Sichtbarkeit der Metadaten verwendet, die mit RTTIclasses
. Und für jede Instanz einer Klasse, die Sie passieren, um zu sehen, in den debugger, die Sie bekommen können Ihre VMT und damit seine Klasse name.Delphi verwendet Textdateien, die den Inhalt beschreiben Ihre form und Haken-event-Handler-name. Dieser Ansatz muss natürlich genug Metadaten zu Deserialisieren, die textuelle Darstellung eines aus und Haken Sie die Event-Handler mit Namen.
Alternative einige andere GUI-toolkits verwenden, ist die automatische Generierung von code initialisiert die form und die Haken, bis der event-handler mit code. Da dieser code direkt verwendet Verweise auf die Event-Handler direkt und weist auf Eigenschaften/ruft die setter es braucht keine Metadaten. Das hat den Nebeneffekt, dass die Umkehrung wird ein bisschen schwerer.
Sollte es nicht allzu schwer sein, erstellen Sie ein Programm, das verwandelt eine dfm Datei in eine Reihe von fest programmierte Anweisungen, die schafft die form statt. So ein tool wie DeDe wird nicht funktionieren, auch nicht mehr. Aber das bedeutet nicht, gewinnen Sie viel in der Praxis.
Aber herauszufinden, welche evenhandler entspricht, um die Kontrolle/die Veranstaltung ist noch Recht einfach. Zumal Sachen wie FLIRTEN, identifiziert die meisten library-Funktionen. Sie müssen also nur Haltepunkt, die Sie interessiert, und dann Schritt in der Benutzer-code.
Das ist keine Frage der Sprache, sondern, wie Ihre GUI-toolkit/GUI-designer arbeitet. Aber die Umkehrung der GUI Teil ist selten interessant. Es nur hilft, Sie zu erhalten, um die Teile des Codes, den Sie interessiert sind, schneller.
ok, verstanden. Vielen Dank 🙂
Im Fall der Gebäude mit Paketen, es ist wahrscheinlich sogar einfacher, eine vollständige Liste der RTL/VCL-entrypoints.
Ich denke, Pakete exportieren, alle öffentlichen Funktionen, die mit dll-Exporten mit einem entstellten Namen. Aber ich erwarte, dass FLIRTEN auf der Arbeit so gut, dass es nicht viel Unterschied in der Praxis.
InformationsquelleAutor CodesInChaos
Die Aussage, die Sie machen, ist falsch. Delphi ist nicht besonders leicht zu dekompilieren als code, die von anderen mainstream-Compiler.
Wenn Sie in der Lage waren, zu beweisen, dass die Ergebnisse der Dekompilierung eine Delphi ausführbare waren von deutlich höherer Qualität als in anderen weit verbreiteten Sprachen dann Ihre Frage würde mehr Gewicht geben.
Meine Antwort steht. Wo ist dein Beweis, dass Delphi ausführbare mehr erfolgreich dekompiliert, als MSVC? Wenn Ihre Frage war nur dazu gedacht, zu beziehen Compiler, emittieren native code, warum hast du das nicht so sagen?
Kein Grund, gemein zu werden. CodeInChaos beschreibt die Argumentation schön. Im Grunde, Delphi-Programme behalten viel mehr Metadaten als andere native-Compiler (auf jeden Fall mehr, als z.B. VC/MFC-Programme), die macht das Rückwärtsfahren einfacher.
Cosmin Geschichte ist nicht wirklich relevant. Er versuchte, Sie zum umkehren einer Funktion in einer einzigen DLL, die es nicht beinhalten Metadaten. Echte Delphi-apps haben viele Klassen, die für die meisten details sind in RTTI: name, Größe, Vererbungshierarchie, die Namen der Felder und Prozeduren für die UI-events und so weiter. Zum Beispiel, hier ist, was wiederhergestellt werden können aus der ausführbaren Datei für eine einzelne form: pastie.org/private/bexiwdctu7scsrafqqsw (mit einem IDC-Skript). So können Sie wieder fast die komplette layouts von vielen Klassen, die Geschwindigkeiten von bis Rückwärtsfahren erheblich.
Beim Rückwärtsfahren, jeder Schrott von Informationen kann nützlich sein, "fluff" oder nicht. Auch isolierte code-Funktionen für die Interaktion mit dem rest des Programms und der zusätzlichen Informationen, die Sie möglicherweise über die, die helfen.
InformationsquelleAutor David Heffernan
Geschichte aus den Schützengräben: die Dekompilierung eines kleinen Delphi-DLL
Habe ich seit über einer Delphi-Dekompilierung der Sitzung selbst. Es war einer dieser fake-klingende "ich verlor meine Quellen", was ich wirklich verlieren, die Quellen für eine winzigen Firebird UDF-Bibliothek. Nun weiß ich nicht besser, ich wollte nicht springen rechts in die Dekompilierung, weil die Bibliothek so klein war und ich wusste, dass ein umschreiben wäre viel schneller.
Diese DLL exportiert eine Funktion, die wie folgt aussieht:
Nachdem ich die vernünftige Sache und das umschreiben der Funktion und mache ein paar regression tests, die ich vor einigen obskuren Ecke-Fällen, in denen die neue Funktion das Ergebnis war nicht das gleiche wie die alte Funktion das Ergebnis! Das Problem war, das neue Funktion das Ergebnis war, das korrekte Ergebnis, die alte DLL enthielt einen FEHLER und ich hatte den FEHLER zu reproduzieren - mit dieser Funktion die Konsistenz ist wichtiger als Genauigkeit.
Wieder die vernünftige Sache und versucht, zu "erraten" am BUG. Ich wusste, es war eine Rundung Problem, aber konnte einfach nicht herausfinden, was es war. Schließlich entschied ich mich zu geben decompilers ich versuchen. Nach all diesem war eine kleine Bibliothek, der Eintrag-Punkt wurde geradlinig und ich habe nicht wirklich brauchen, re-kompilierbar code, noch 100% Dekompilierung: ich brauchte nur genug, um herauszufinden, die alten FEHLER, so kann ich es reproduzieren!
Dekompilierung fehlgeschlagen! Ich versuchte viele verschiedene decompilers, darunter ein paar "kommerzielle". Die meisten produziert, was auf der Oberfläche sah, wie gut die Daten, aber nicht genug, um herauszufinden, die alten Fehler. Der vielversprechendste, der mit version spezifische Kenntnisse der VCL-und RTL gab die schlimmsten Fehler: sicher, es herausgefunden die RTL anrufen, Ihnen Namen gegeben, aber konnte nicht suchen Sie die exportierte Funktion! Die eine Funktion, die ich war daran interessiert, nicht gezeigt int der Liste der Einstiegspunkte aus, und es sollte gerade nach vorne, da es ein exportiert Funktion.
Diese Dekompilierung der Versuch war einfach, denn:
Meine Lösung
Nach decompilers scheiterte mir, ich drehte mich zu meinem eigenen treuen Delphi-IDE zum Debuggen. Ich schrieb ein kleines Delphi-Programm, dass direkt Importe die Funktion aus der DLL erstellt eine gefälschte Firbird Speicher-manager DLL, so dass meine DLL laden kann, rief meine alte Funktion mit den Parametern, die ich kannte, hätte geben schlechte Ergebnisse, steped in den code mit dem debugger und beobachtete die FPU-Register. Nach ein paar Fehlversuchen habe ich endlich festgestellt, ein Wert war, tauchte aus dem FPU-stack as integer, wo es sollte nicht Integer, so hatte ich, mein FEHLER: ich habe fälschlicherweise definiert eine Integer-lokale variable, wo sollte ich haben, verwendet Währung. Bewaffnet mit diesem wissen war ich in der Lage, den Fehler zu reproduzieren.
Es wäre schön zu wissen, ob die Ziel-Delphi-Versionen des decompilers Sie verwendet werden, übereinstimmen, wird die version der DLL war eigentlich zusammengestellt.
perfect match: die DLL wurde mit Delphi 7.
InformationsquelleAutor Cosmin Prund
Einzige Sache, die leichter ist, in Delphi ist das abrufen von VCLs.
Nach der Verwendung von decompilers wie DeDe Sie erhalten Benutzeroberfläche, aber ohne jegliche Logik.
Also, wenn Sie abrufen möchten Sie nur Formulare und Schaltflächen - Delphi ist einfacher als bei anderen Compilern, aber wenn Sie wissen wollen, was Los ist auf nach dem Klick auf die Schaltfläche, die Sie verwenden müssen ollydbg oder andere (debugger/disassembler) als für andere Sprachen, erzeugt ausführbare Dateien.
InformationsquelleAutor Jarek Bielicki
Gibt es vor-und Nachteile. Ich bin mir nicht sicher, in welchem Winkel Ihr das erwähnt, als leichter wird. Es gibt auch einen großen Unterschied in einer 1-form einfache Anwendung, gegen eine sehr tiefgehende Anwendung, die viele Formen und eine Vielzahl von Klassen und Funktionen. Es ist wie Notepad versus Office 2013 (da waren Sie codiert in delphi, nur ein Beispiel Vergleich der Komplexität nicht Sprache).
In einer kleinen app, mit der zusätzliche Informationen, die Delphi-apps "in der Regel" enthalten, können Sie machen es zu einem Kinderspiel. Jedoch, in einer großen Anwendung kann es "helfen", aber Sie haben eine million Anrufe zu Graben durch. Sie kann Ihnen helfen, in der Nähe, aber Anrufe innerhalb der Anrufe innerhalb von anrufen, die dann mehrere gibt als springt... das macht Sie schwindlig. Dann, wenn die app "war" verpackt oder geschützt, einige Dinge können immer noch ein entstellte Durcheinander. Während es kann funktionieren, Programmierung klug, es zu Lesen, kann sehr viel schwieriger. Ich war in einem anderen Tag, wo alle Saiten wurden verschlüsselt, also "referenced text strings" waren keine Hilfe, und die Verschlüsselung war nicht ein einfaches md5 oder base64, es war eine benutzerdefinierte Algorithmus. Vielleicht ein MD5 mit Salz, dann base64-kodiert? Ich konnte nie die genaue Methode, die auf die Saiten. Ich wusste, was einige von Ihnen wurden sein soll, konnte es aber nicht reproduzieren Methode, auch wenn es sah aus wie es war base64, es war die base64 der string bereits verschlüsselt ist, wie einige... I dont verlassen sich auf text-strings, aber in einem großen app, jedes bisschen hilft.
Natürlich meine interpretation dieser Frage, bei der Suche war eine Delphi-exe in OllyDbg. Ich könnte off base auf, wo Sie Jungs gingen mit diesem Thema, aber ich fühle mich in Bezug auf Olly und Umkehr, ich bin auf den Punkt (wenn es das war, was Sie reden, waren) lol.
InformationsquelleAutor Wade