Reverse-Engineering von C-Programmen

Lesezeit: 6 Minuten

Benutzer-Avatar
schreyasva

Jedes C-Programm wird in Maschinencode umgewandelt, wenn diese Binärdatei verteilt wird. Da der Befehlssatz eines Computers gut bekannt ist, ist es möglich, das ursprüngliche C-Programm zurückzubekommen?

  • ist es möglich, das ursprüngliche C-Programm zurückzubekommen?

    – Shreyasva

    16. Februar 2010 um 12:17 Uhr

  • @ Roger Pate, setzen Sie ein Fragesymbol an das Ende von “Originalprogramm” und Sie haben Ihre Frage: | Beeindruckend….

    – Shawn Mclean

    16. Februar 2010 um 12:18 Uhr

  • Ich habe gerade eine Fischsuppe gekocht. kann ich den ursprünglichen Fisch zurückbekommen?

    – Stefan Borini

    16. Februar 2010 um 17:46 Uhr

  • Zwei Haupthindernisse: Optimierung und das Löschen von Namensinformationen. Im Laufzeitcode ziehen es Compiler vor, Funktions- und Variablennamen zu löschen, da sie nicht benötigt werden. Compiler können Code auch so optimieren, dass dies nicht der Fall ist sehen wie das Original, funktioniert aber genauso.

    – Thomas Matthäus

    16. Februar 2010 um 18:23 Uhr

  • @stefan: wenn Die Frage bezieht sich auf die textuelle Rekonstruktion und nicht auf die Logik, die übliche Zeile lautet: “Man kann Hamburger aus Kühen machen, aber keine Kühe aus Hamburgern” 🙂

    – joveha

    16. Februar 2010 um 18:30 Uhr


Benutzer-Avatar
Philipp Ekberg

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

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

Sehen 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 und nicht so technisch wie “Compiler” definieren würden, was wäre das?

Antworten: Übersetzer

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

Die ausführbare Datei, die Sie haben, ist nur eine Übersetzung Ihres ursprünglichen Textes / Ihrer ursprünglichen Syntax, und wenn Sie sie “umkehren” und somit “zurückübersetzen” möchten, erhalten Sie höchstwahrscheinlich nicht die gleiche Struktur wie zu Beginn.

Ein realeres Beispiel wäre, wenn Sie vom Englischen ins Deutsche und vom Deutschen zurück ins Englische übersetzen, wird die Satzstruktur höchstwahrscheinlich anders sein, andere Wörter könnten verwendet werden, aber die Bedeutung, der Kontext, wird sich höchstwahrscheinlich nicht geändert haben.

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

Es hängt davon ab, was Sie unter Original-C-Programm verstehen. Dinge wie lokale Variablennamen, Kommentare usw. sind nicht in der Binärdatei enthalten, daher gibt es keine Möglichkeit, genau denselben Quellcode zu erhalten, der zum Erstellen der Binärdatei verwendet wurde. Werkzeuge wie z IDA Pro könnte Ihnen helfen, eine Binärdatei zu disassemblieren.

  • nein, nicht auf der Ebene der Variablennamen, aber zumindest die Logik des Programms

    – Shreyasva

    16. Februar 2010 um 11:50 Uhr

  • (und das Programm wurde mit -g kompiliert?)

    – Tom

    16. Februar 2010 um 17:55 Uhr

Ich würde die Konversionsrate eines wirklich erfahrenen Hackers auf etwa 1 Kilobyte Maschinencode pro Tag schätzen. Bei üblichen westlichen Gehältern beläuft sich der Preis beispielsweise für eine ausführbare 100-KB-Datei auf etwa 25.000 US-Dollar. Nachdem Sie so viel Geld ausgegeben haben, ist alles, was Sie gewinnen, ein Stück C-Code, der genau das tut, was Ihrer tut, abzüglich der Vorteile von Kommentaren und so weiter. Es ist in keiner Weise mit Ihrer Version konkurrenzfähig, Sie können Updates und Verbesserungen viel schneller bereitstellen. Das Reverse Engineering dieser Updates ist ebenfalls kein trivialer Aufwand.

Wenn Sie dieser Preis nicht beeindruckt, können Sie die Konvertierungskosten beliebig erhöhen, indem Sie mehr Code hinzufügen. Denken Sie nur daran, dass erfahrene Hacker, die große Programme wie dieses anpacken können, etwas viel Besseres zu tun haben. Sie schreiben ihren eigenen Code.

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

    Benutzer14554

    16. Februar 2010 um 14:22 Uhr

Benutzer-Avatar
Ira Baxter

Eine der besten Arbeiten zu diesem Thema, die ich kenne, ist:

Schweine aus Wurst? Reengineering von Assembler zu C via FermaT.

Der Anspruch ist, dass Sie ein vernünftiges C-Programm zurückbekommen, auch wenn der ursprüngliche asm-Code nicht in C geschrieben wurde! Es gelten viele Vorbehalte.

Das Hex-Strahlen Decompiler (Erweiterung zu IDA Pro) kann genau das tun. Es ist noch ziemlich neu und in Vorbereitung, aber sehr vielversprechend. Es ist etwas gewöhnungsbedürftig, kann aber möglicherweise den Umkehrvorgang beschleunigen. Es ist keine “Wunderwaffe” – kein C-Decompiler ist es, aber es ist eine große Bereicherung.

  • Wie unterscheidet der Decompiler zwischen for, while und do-while Schleifen, wann können die in der Quelle anders codiert werden? Außerdem, wie bekommt es die Namen der ursprünglichen Funktionen? Wie wird der Code “unoptimiert”, damit er mit dem Original übereinstimmt? Wie bestimmt es die Variablennamen? Führen Sie eine Suche durch news:comp.lang.c” für *hamburger und Kuh.

    – Thomas Matthäus

    16. Februar 2010 um 18:21 Uhr

  • Spielt es eine Rolle? Beides geht, wenn mir die Logik und nicht die Form wichtig ist

    – joveha

    16. Februar 2010 um 18:32 Uhr

Benutzer-Avatar
Johannes Bode

Der gebräuchliche Name für dieses Verfahren lautet „Hamburger wieder in Kühe verwandeln“. Es ist möglich, Binärcode in ein funktional äquivalentes C-Programm zurückzuentwickeln, aber ob dieser C-Code eine große Ähnlichkeit mit dem Original hat, ist eine offene Frage.

  • Wie unterscheidet der Decompiler zwischen for, while und do-while Schleifen, wann können die in der Quelle anders codiert werden? Außerdem, wie bekommt es die Namen der ursprünglichen Funktionen? Wie wird der Code “unoptimiert”, damit er mit dem Original übereinstimmt? Wie bestimmt es die Variablennamen? Führen Sie eine Suche durch news:comp.lang.c” für *hamburger und Kuh.

    – Thomas Matthäus

    16. Februar 2010 um 18:21 Uhr

  • Spielt es eine Rolle? Beides geht, wenn mir die Logik und nicht die Form wichtig ist

    – joveha

    16. Februar 2010 um 18:32 Uhr

Die Arbeit an Werkzeugen, die dies tun, ist eine Forschungstätigkeit. Das heißt, es ist möglich, in den einfachen Fällen etwas zu bekommen (Sie werden lokale Variablennamen nicht wiederherstellen, es sei denn, es sind beispielsweise Debug-Symbole vorhanden). Bei großen Programmen oder wenn der Programmierer beschlossen hat, es schwierig zu machen, ist es in der Praxis fast unmöglich.

1137920cookie-checkReverse-Engineering von C-Programmen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy