Gibt es eine Hoffnung auf eine Decompiler umwandeln würde, dass ein ausführbares Programm in C / C + +-Code?
Diese FAQ Antwort ist ein Auszug aus Snippets von Bob Stout.
Halten Sie nicht Ihren Atem. Denken Sie darüber nach ... Für einen Decompiler zu arbeiten, entweder 1) Jeder Compiler hätte, um im Wesentlichen identischen Code, auch mit voller Optimierung eingeschaltet ist, oder 2) wäre es zu erkennen, die einzelnen Ausgabe von jeder Compiler den Code-Generator.
Wenn der erste Fall wurden auch als richtig erweisen, würde es keine Notwendigkeit mehr für die Compiler-Benchmarks, da jeder würde das gleiche. Für den zweiten Fall, um wahr zu sein würde in sehr komplexes Programm, das zu ändern mit jedem neuen Compiler-Version.
Also, was zu bestimmten decompilers für spezielle Compiler - sagen Decompiler für die nur auf den Code von, sagen wir, BC + + 4.5? Das bringt uns wieder zu der Frage der Optimierung. Kodex für Klarheit und Verständlichkeit ist oft ineffizient. Code für maximale Leistung (Geschwindigkeit oder Größe) ist oft kryptisch (am besten!) Hinzu kommt die Tatsache, dass alle modernen Compilern haben eine Vielzahl von Optimierungen Schalter, um die Optimierung Techniken zu ermöglichen und die zu vermeiden. Die Quintessenz ist, dass für eine hinreichend große, komplexe-Source-Modul, können Sie den Compiler auf eine Reihe von verschiedenen Objekt-Module einfach, wenn Sie Ihre Optimierung Schalter, so dass Ihre Decompiler wird auch zu einem deoptimizer, die automatisch erkennen, welche Optimierung von Strategien wurden bei der Kompilierung aktiviert.
Let's weiter zu vereinfachen und festzulegen, dass Sie nur zur Unterstützung einer spezifischen Compiler und Sie zu dekompilieren, um die logische Source-Code zu interpretieren, ohne zu versuchen, die Optimierung. Was dann? Eine gute Optimierung kann und wird wesentlich umschreiben die Interna des Codes, so dass, was Sie aus Ihrem Decompiler wird, nicht nur kryptisch, aber in vielen Fällen, enträtselte mit goto-Anweisungen und andere nicht-Nein-Codierung der guten Praxis. An dieser Stelle haben Sie dekompiliert Quelle, aber was nützt es?
Bitte beachten Sie auch sorgfältig meine Quellenangabe Module. Ein Merkmal von C ist, dass es sich weitgehend unleserlich, es sei denn, aufgeschlüsselt in leicht wartbare-Source-Module (. C-Dateien). Wie wird die Decompiler damit umgehen? Es könnte entweder versuchen zu dekompilieren das gesamte Programm in einigen Mammut main ()-Funktion, verlieren alle Modularität, oder sie könnte versuchen, jedes aufgerufene Funktion in eine eigene Datei. Die erste Möglichkeit würde unbrauchbar Chaos und der zweite auf Probleme stoßen, wenn die ursprüngliche Quelle hade Dateien mit mehreren Funktionen mit statischen Daten und / oder eine oder mehrere Funktionen Aufruf eine oder mehrere statische Funktionen. Ein Decompiler könnte statische Daten und / oder globale Funktionen, aber nur auf Kosten der Lesbarkeit oder (was bereits nicht akzeptabel).
Schließlich sind, dass der kommerzielle Anwendungen Code oft die schwierigste und Zeit-Funktionen in Assembler, die sich als fast unmöglich, zu dekompilieren in eine C-Äquivalent.
Wie ich schon sagte, nicht Halten Sie den Atem an. Mit der Verbesserung der Technologie, wo decompilers kann mehr möglich ist, Optimierer und Sprachen (C + +, zum Beispiel, wäre eine wesentlich härtere Sprache zu dekompilieren als C) auch heimlich, dass sie weniger wahrscheinlich.
Seit Jahren Unix-Anwendungen wurden verteilt in Form gehüllt Quelle (Maschine, aber nicht lesbar - alle Kommentare und Leerzeichen entfernt, Variablen Namen aller in der Form OOIIOIOI, etc.), das war ein ganz ausreichende Mittel für den Schutz der Urheberrechte. Es ist sehr unwahrscheinlich, dass Decompiler Ausgang würde sogar so lesbar wie eingehüllt Quelle.
Update: Decompiler-Technologie ist nach wie vor sehr schwierig, aber bedeutende Fortschritte erzielt wurden, da dies geschrieben wurde.
Lesen Sie Was ist ein Decompiler? Für aktuelle Informationen über Decompiler Projekte.
|
Bookmark Gibt es Hoffnung auf eine Decompiler umwandeln würde, dass ein ausführbares Programm in C / C + +-Code?

