Frage

So ist ein Decompiler wirklich eine Sache, die die Quelle einer kompilierten / interpretierten Stück Code gibt gibt? Weil mir das klingt unmöglich. Wie würden Sie die Namen der Funktionen, Variablen, Klassen bekommen, etc, wenn es kompiliert wird. Oder bin falsch interpretiert ich die Definition? Wie funktioniert es? Und was ist das allgemeine Prinzip hinter einen zu machen?

War es hilfreich?

Lösung

Sie haben Recht über Ihre Definition eines Decompiler: es dauert eine kompilierte Anwendung und produziert Quellcode Spiel. Es wird jedoch nicht in den meisten Fällen den Namen und die Struktur von Variablen / Funktionen / Klassen kennen - es nur Vermutungen. Es analysiert den Fluss des Programms und versucht, einen Weg zu finden, dass die Strömung durch eine bestimmte Programmiersprache darstellen, in der Regel jedoch C, da die Programmiersprache der Wahl (C, in diesem Beispiel) ist oft auf einem höheren Niveau als der Staat des zugrunde liegenden Programms (ein binäres ausführbares) könnten einige Teile des Programms unmöglich sein, genau darzustellen; in diesem Fall würde die Decompiler scheitern und Sie würden einen Disassembler verwenden müssen. Dies ist, warum viele Leute mögen ihren Code verschleiern. Es macht es viel schwieriger für decompilers es zu öffnen

einen Decompiler zu bauen ist keine einfache Aufgabe. Grundsätzlich müssen Sie die Anwendung nehmen, dass Sie (es sein, eine ausführbare Datei oder eine andere Form der kompilierten Anwendung) werden dekompiliert und analysieren sie in eine Art Baum Sie mit im Speicher arbeiten kann. Sie würden dann den Ablauf des Programms analysieren und versuchen, prasselt zu finden, könnte darauf hindeuten, dass eine if Statement / Variable / Funktion / etc an einer bestimmten Stelle im Code verwendet wurde. Es ist alles wirklich nur ein Ratespiel. Sie die Muster wissen müßten, dass der Compiler in kompilierten Code macht, dann für diese Mustern suchen und sie mit gleichwertigen Menschen lesbaren Quellcode ersetzen

Das ist alles viel einfacher für geordnete Programme wie Java oder .NET, wo Sie müssen nicht mit Montageanleitung befassen, und Dinge wie Variablen sind meist aus für Sie gesorgt. Dort müssen Sie nicht erraten, so viel wie nur direkt übersetzen. Sie werden vielleicht nicht genau Variable / Methodennamen haben, aber man kann zumindest deduce die Programmstruktur ziemlich leicht.

Disclaimer: Ich habe noch nie einen Decompiler geschrieben und somit nicht wissen, jedes Detail von dem, was ich spreche. Wenn Sie beim Schreiben eines Decompiler wirklich interessiert sind, sollten Sie ein Buch über das Thema bekommen.

Andere Tipps

Ein Decompiler im Grunde nimmt den Maschinencode und kehrt es zurück in die Sprache wurde formatiert. Wenn ich mich nicht irre, ich glaube, die Decompiler muss wissen, welche Sprache es in kompiliert wurde, sonst wird es nicht funktionieren.

Der grundlegende Zweck des Decompiler ist in Ihrem Quellcode zu kommen; zum Beispiel hätte einmal meine Java-Datei beschädigt und das einzige, was ich kann, damit es zu war durch die Verwendung eines Decompiler bringen (da die Klassendatei nicht beschädigt wurde).

Es funktioniert durch eine „vernünftige“ herzuleiten (basierend auf einige Heuristiken) Darstellung von dem, was in dem Objektcode. Der Grad der Ähnlichkeit zwischen dem, was es produziert und was ursprünglich da neigt stark auf abhängen, wie viele Informationen enthalten ist, in binär aus startet. Wenn Sie mit im Grunde ein „reines“ binary zu starten, ist es in der Regel mit nur bilden „vernünftigen“ Namen für die Variablen fest, wie Dinge wie i, j und k für Loop-Indizes verwenden und längere Namen für die meisten anderen.

Auf der anderen Seite, eine Sprache, die unterstützte Selbstbeobachtung Bedürfnisse einzubetten sehr viel mehr Informationen über Variablennamen, Typen, usw., in die ausführbaren Datei. In einem Fall wie diesem dekompiliert etwas viel näher an das Original, wie sie typischerweise Beibehaltung der ursprünglichen Namen für Funktionen erzeugen können, Variablen, usw. In einem solchen Fall kann die Decompiler produzieren oft etwas ganz ähnlich zum Original - vielleicht etwas mehr zu verlieren als die Formatierung und Kommentare

.

Das hängt davon ab, welche Sprache Sie dekompiliert. Wenn Sie so etwas wie C oder C ++ dekompiliert, dann ist die einzige Information zur Verfügung gestellt ist Funktionsnamen und Argumente (In DLLs). Wenn Sie mit Java zu tun hat, dann fügt der Compiler in der Regel Zeilennummern, Variablennamen, Feld- und Methodennamen, und so weiter. Wenn es keine Variablennamen sind, dann würden Sie Namen wie localInt1, localInt2, localException1 bekommen. Oder was auch immer der Compiler ist. Und es kann den Abstand zwischen den Zeilen sagen, weil der Zeilennummern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top