2013-09-03 7 views
12

Ich habe eine EXE-Datei und ich habe es mit Ida dekompiliert. Mir wurde gesagt, das Programm in Delphi codiert, also habe ich versucht, mit DeDe zu dekompilieren, aber es ist fehlgeschlagen, keine Ausgabe und kein Fehler. Und ich frage mich, ob es möglich ist, eine Sprache zu finden, die beim Erstellen von Exe verwendet wird, indem Sie verschiedene Decompiler ausprobieren, die speziell für eine Programmiersprache geschrieben wurden? Oder können sie aus einem anderen Grund scheitern?Kann man wissen, in welcher Sprache eine EXE-Datei geschrieben ist?

Antwort

10

In vielen Fällen ist es ist möglich, den Compiler zu identifizieren, der zum Kompilieren des Codes verwendet wurde, und von diesem die Originalsprache.

Die meisten Sprachimplementierungen enthalten eine Art Laufzeitbibliothek zur Implementierung verschiedener Operationen auf hoher Ebene der Sprache. Zum Beispiel hat C die CRT, die Datei-E/A-Operationen implementiert (usw.), Delphi hat Compiler-Helfer für seine string Art (Verkettung, Zuweisung und andere), ADA hat verschiedene Low-Level-Funktionen, um die Sicherheit der Sprache zu gewährleisten bald. Durch Vergleichen des Programmcodes mit den Laufzeitbibliotheken der Kandidaten-Compiler können Sie möglicherweise eine Übereinstimmung finden.

IDA implementiert diesen Ansatz in der FLIRT technology. Durch die Verwendung der Signaturen kann IDA die meisten der wichtigsten Compiler für DOS und Windows ermitteln. Unter Linux ist das etwas schwieriger, da es keinen einzigen Anbieter von Compiler-Binärdateien gibt, so dass für jede Distribution Signaturen erstellt werden müssten.

Aber auch ohne den Code der Laufzeitbibliothek zu verwenden, kann es möglich sein, den verwendeten Compiler zu identifizieren.Viele Compiler verwenden sehr unterschiedliche Idiome, um verschiedene Operationen darzustellen. Zum Beispiel I was able to guess, dass der für den Duqu-Virus verwendete Compiler Visual C++ war, der später confirmed war.

5

Compilation ist ein verlustbehafteter Prozess, so ist es im Allgemeinen nicht möglich, eine ausführbare Datei (oder andere kompilierte Programm-Modul, wie ein .so oder .dll) und erholt Quellcode in der Originalsprache oder sogar eindeutig bestimmen, was zu dekompilieren die Originalsprache war. Es ist nicht einmal notwendig, dass es nur eine originale Quellcode-Sprache gibt, da es möglich ist, dass vor dem Verknüpfen unterschiedliche Module in verschiedenen Sprachen geschrieben wurden. Normalerweise können Sie eine binäre Assembler-Sprache disassemblieren und wiederherstellen, obwohl das von sehr begrenztem Wert sein kann.

In vielen Fällen können Sie etwas über die Originalsprache mitteilen, vorausgesetzt, dass die Binärdatei nicht (von Symbolen) entfernt wurde. Zum Beispiel können Sie normalerweise feststellen, ob eine Binärdatei ursprünglich in C++ geschrieben wurde, indem Sie auf die Symbole in der Binärdatei (unter Linux, objdump, keine Ahnung, was die Entsprechung in Windows sein könnte): C++ Symbole werden gemangelt ein besonderer Weg. Es ist keine 100% ige Garantie, sondern eine hohe Wahrscheinlichkeit.

Das heißt, einige Decompiler machen eine ziemlich schwierige Aufgabe einer sehr schwierigen Aufgabe. Es ist nicht einfach, wahrscheinlich High-Level-Konstrukte aus einer Binärdatei zu ziehen. In meiner (sehr beschränkten) Erfahrung neigen sie dazu, für ziemlich triviale Programme oder für Software zu arbeiten, die mit einer beschränkten Anzahl von Versionen des ursprünglichen Compilers kompiliert sind, aber an etwas Substantiellem ersticken: es ist sehr schwierig für den Autor eines Decompilers mitzuhalten Änderungen in den Compilern, und es könnte sehr wenig Anreiz für sie sein, dies zu tun.

Selbst in Fällen, in denen die Dekompilierung sehr erfolgreich ist, ist das Ergebnis im Wesentlichen vollständig unkommentierter Code mit bedeutungslosen Variablennamen, der extrem schwer zu verstehen ist. Dekompilierung ist eine Sache, indem man die beabsichtigte semantische Bedeutung aus dem Ergebnis extrahiert. Denken Sie daran, dass viele Variablen, Verzweigungen, Schleifen und Funktionen vollständig wegoptimiert wurden, viele Funktionen inline wurden usw. Der "Quellcode" mag also, auch wenn Sie ihn auf diese Weise erhalten, nicht sehr viel sein von Nutzen für Sie.

+0

Natürlich erwarte ich keinen blanken Quellcode :) Aber die Programme haben so viel entwickelt und sie können den Assemblercode viel benutzerfreundlicher darstellen, so dass es einfacher ist, einfache Programme umzukehren. Danke trotzdem – Kuzgun

+0

Sie können 'objdump' auch unter Windows über MingW oder Cygwin verwenden. Sie sind im 'binutils'-Paket installiert. – adam