2010-02-16 23 views
12

Jedes c-Programm wird in Maschinencode konvertiert, wenn diese Binärdatei verteilt wird. Da der Befehlssatz eines Computers gut bekannt ist, ist es möglich, das ursprüngliche C-Programm zurück zu bekommen?Reverse-Engineering-C-Programme

+4

Wo ist die Frage? –

+0

ist es möglich, das C-Original-Programm zurück zu bekommen? – shreyasva

+3

@Roger Pate, stellen Sie ein Fragezeichen am Ende des "Originalprogramms" und Sie haben Ihre Frage: | wow .... –

Antwort

16

Sie können nie zur genau gleichen Quelle zurückkehren, da es keine Metadaten darüber gibt, die mit dem kompilierten Code gespeichert wurden.

Aber Sie können Code aus dem Assembly-Code neu erstellen.

Schauen Sie sich dieses Buch an, wenn Sie an diesen Dingen interessiert sind: Reversing: Secrets of Reverse Engineering.

bearbeiten

einige Compiler-101 hier, wenn Sie einen Compiler mit einem anderen Wort zu definieren sind und nicht so technisch wie „Compiler“, was wäre es?

Antwort: Übersetzer

Ein Compiler die Syntax/Phrasen übersetzt Sie in eine andere Sprache ein C-Compiler übersetzt Assembly oder sogar Maschinencode geschrieben haben. C# -Code wird in IL übersetzt und so weiter.

Die ausführbare Datei, die Sie haben, ist nur eine Übersetzung Ihres ursprünglichen Textes/Syntax und wenn Sie es "umkehren" und daher "übersetzen zurück" wollen, werden Sie wahrscheinlich nicht die gleiche Struktur wie am Anfang haben. Ein realistischeres Beispiel wäre, wenn Sie vom Englischen ins Deutsche und vom Deutschen ins Englische übersetzen würden, wäre die Sentanzstruktur höchstwahrscheinlich anders, andere Wörter könnten verwendet werden, aber die Bedeutung, der Kontext, wird am wahrscheinlichsten sein nicht geändert haben.

Das gleiche gilt für einen Compiler/Übersetzer, wenn Sie von C nach ASM gehen, die Logik ist die gleiche, es ist nur eine andere Art zu lesen (und natürlich ist es optimiert).

+0

Kann ich hartcodierte Strings extrahieren? – GRiMe2D

5

Es hängt davon ab, was Sie mit dem ursprünglichen C-Programm meinen. Dinge wie lokale Variablennamen, Kommentare usw. sind nicht in der Binärdatei enthalten, daher gibt es keine Möglichkeit, genau den gleichen Quellcode zu erhalten, der für die Erstellung der Binärdatei verwendet wurde. Werkzeuge wie IDA Pro können Ihnen helfen, eine Binärdatei zu zerlegen.

+0

nein, nicht auf die Ebene der Variablennamen, aber mindestens die Logik des Programms – shreyasva

+0

Wenn Sie objdump -S verwenden, könnten Sie weitere Informationen erhalten. – Tom

+0

(und das Programm wurde mit -g kompiliert?) – Tom

3

Arbeiten an Tools, die dies tun, ist eine Forschungsaktivität. Das heißt, es ist möglich, etwas in den einfachen Fällen zu erhalten (Sie werden lokale Variablennamen nicht wiederherstellen, wenn keine Debugsymbole vorhanden sind). In der Praxis ist es praktisch unmöglich für große Programme oder wenn der Programmierer sich dazu entschlossen hat, es schwierig zu machen.

2

Es gibt keine 1: 1-Zuordnung zwischen einem C-Programm und dem ASM/Maschinencode, den es erzeugt - ein C-Programm kann zu einem anderen Ergebnis auf verschiedenen Compilern oder mit verschiedenen Einstellungen kompilieren) und manchmal zwei verschiedene Bits von C könnte den gleichen Maschinencode erzeugen.

Sie können definitiv können C-Code aus einer kompilierten EXE generieren. Sie können einfach nicht wissen, wie ähnlich es in der Struktur zum ursprünglichen Code sein wird - abgesehen davon, dass Variablen-/Funktionsnamen verloren gehen, nehme ich an, dass es nicht die ursprüngliche Art und Weise kennt, wie der Code unter vielen Dateien aufgeteilt wurde.

4

Ich würde die Conversion-Rate eines wirklich geschickten Hackers bei etwa 1 Kilobyte Maschinencode pro Tag schätzen. Bei durchschnittlichen Gehältern im Westen liegt der Preis für eine ausführbare Datei mit 100 KB bei etwa 25.000 US-Dollar.Nachdem Sie so viel Geld ausgegeben haben, ist alles, was Sie gewonnen haben, ein Stück C-Code, das genau das tut, was Ihres tut, abzüglich der Vorteile von Kommentaren und so weiter. Es ist nicht wettbewerbsfähig mit Ihrer Version, Sie können Updates und Verbesserungen viel schneller liefern. Das Reverse-Engineering dieser Updates ist ebenfalls eine triviale Aufgabe.

Wenn dieser Preis Sie nicht beeindruckt, können Sie die Konvertierungskosten beliebig erhöhen, indem Sie mehr Code hinzufügen. Denken Sie daran, dass fähige Hacker, die große Programme wie diese angehen können, etwas viel besseres zu tun haben. Sie schreiben ihren eigenen Code.

+0

Eine schnelle Analyse von ein paar Dateien zeigt, dass 1KB nur ein paar hundert Zeilen Maschinencode ist, und es ist weniger, desto größer das Programm. Eine solche Analyse wäre relativ leicht für einen nicht so erfahrenen Hacker. Ich bezweifle jedoch, dass jemand bereit wäre, für rohen C-Code zu bezahlen, der ein weiteres Reverse Engineering erfordern würde, so dass der Programmierer den Code auf eine brauchbare Weise neu schreiben oder anderweitig dokumentieren müsste.Wenn Sie nur einen Algorithmus oder eine Schnittstelle mit einer bestimmten geheimen API stehlen möchten, könnte dies kosteneffektiv sein, aber ansonsten klingt es einfach zu teuer, um sich die Mühe zu machen. – jbcreix

3

Der Hex-Rays Decompiler (Erweiterung zu IDA Pro) kann genau das tun. Es ist noch ziemlich neu und aufstrebend, aber vielversprechend. Es ist etwas gewöhnungsbedürftig, kann aber den Umkehrprozess beschleunigen. Es ist keine "Silberkugel" - kein Decompiler ist es, aber es ist ein großer Vorteil.

+0

Wie unterscheidet der Decompiler zwischen "for", "while" und "do-while" Schleifen, wenn dann in der Quelle anders codiert werden kann? Wie bekommt es die Namen der ursprünglichen Funktionen? Wie "optimiert" es den Code, um dem Original zu entsprechen? Wie ermittelt es die Variablennamen? Suchen Sie nach * news: comp.lang.c "für * hamburger * und * cow *. –

+1

Macht es eine Rolle? Entweder wenn ich mich um die Logik kümmere und nicht um die Form – joveha

2

Der allgemeine Name für dieses Verfahren ist "Verwandlung von Hamburgern in Kühe". Es ist möglich, binären Code in ein funktional äquivalentes C-Programm umzuwandeln, aber ob dieser C-Code eine große Ähnlichkeit mit dem Original aufweist, ist eine offene Frage.

4

Eines der besten Arbeiten zu diesem Thema, das ich kenne ist:

Pigs from sausages? Reengineering from assembler to C via FermaT.

Die Behauptung ist, dass Sie ein vernünftiges C-Programm zurückbekommen, selbst wenn der ursprüngliche asm-Code nicht in C geschrieben wurde! Viele Vorbehalte gelten.

+0

Nice. Ich habe eine der Vorbehalte. Das Ergebnis der Ausführung eines meiner Programme erzeugt ein C-Programm, aber das resultierende C-Programm funktioniert nicht, weil der Assembly-Code meinen nicht standardmäßigen Stack-Frame annimmt. – Joshua

+0

Sie haben tatsächlich den FermaT-Konverter verwendet? ... Ich würde das erwarten Stack-Frame-Layout würde nicht einen Unterschied machen, ein Stack-Frame ist nur eine Art von "Struktur" und wenn Sie vernünftige Strukturen für Heap-Werte vorschlagen können, sollten Sie in der Lage, dies für Stack-Frames tun. Können Sie eine bestimmte geben Beispiel? –

2

Sie können hex-rays.com ausprobieren, es hat einen wirklich netten Decompiler, der den Assemblercode mit 99% Genauigkeit in C dekompilieren kann.