it-swarm.com.de

Konvertieren Sie die ausführbare Datei zurück in den C-Quellcode

Leider habe ich meinen Quellcode verloren und ich habe nur die Ausgabedatei, die mit gcc unter Linux erstellt wurde, und ich habe jetzt keinen Zugriff auf meinen PC. Gibt es eine Möglichkeit, die Ausgabedatei in eine Quelldatei zu konvertieren (in c unter Linux)?

14
mahsa

Sie hatten also eine Kuh, aber Sie haben sie versehentlich in einen Hamburger umgewandelt, und jetzt möchten Sie Ihre Kuh zurück.

Entschuldigung, so funktioniert es einfach nicht.

Stellen Sie einfach die Quelldatei aus Ihren Backups wieder her.

Ah, Sie hatten keine Backups. Leider gibt Ihnen das Universum dafür keine Pause.

Sie können dekompilieren die Binärdatei. Das gibt Ihnen nicht Ihren Quellcode, aber es gibt Ihnen etwas Quellcode mit dem gleichen Verhalten. Sie erhalten die Variablennamen nur, wenn es sich um eine Debug-Binärdatei handelt. Sie erhalten nicht genau die gleiche Logik, wenn Sie nicht ohne Optimierungen kompiliert haben. Offensichtlich erhalten Sie keine Kommentare.

Ich habe Boomerang verwendet, um einige Programme zu dekompilieren, und das Ergebnis war besser lesbar als der Maschinencode. Ich weiß nicht, ob es das beste Werkzeug da draußen ist. Erwarten Sie auf keinen Fall Wunder.

Beim Reverse Engineering einer ausführbaren Datei sind mehrere Tools üblich.

  1. Der Befehl "Datei", der den Dateipfad als ersten Parameter verwendet, damit Sie (in den meisten Fällen) bestimmen können, über welche Art von ausführbarer Datei Sie verfügen.
  2. Disassembler, die genau zeigen, was die ausführbare Datei tut, aber für diejenigen, die keinen Assembly-Code für diese bestimmte Architektur schreiben oder Erfahrung mit der Disassemblierung haben, schwer zu lesen sind.
  3. Dekompilierer wie Boomerang, Hex-rays und Snowman können eine bessere Lesbarkeit bieten, stellen jedoch nicht die tatsächlichen Variablennamen oder die Syntax des ursprünglichen Programms wieder her und sind nicht 100% zuverlässig, insbesondere in Fällen, in denen die Ingenieure, die die ausführbare Datei erstellt haben, mit getestet haben diese Pakete und versuchte, die Sicherheit weiter zu verschleiern.
  4. Datenflussdiagramme oder Tabellen. Ich kenne kein kostenloses Tool, um dies automatisch zu tun, aber ein Python oder Bash-Skript über einem Textparser der Assembly-Ausgabe (das in sed oder Perl geschrieben werden kann) kann hilfreich sein .
  5. Bleistift und Papier, ob Sie es glauben oder nicht, zum Aufschreiben von Flüssen und Ideen.

In den meisten Fällen musste der Code von Grund auf neu geschrieben, als Assembler-Programm verwaltet oder durch erneutes Anwenden von Änderungsanforderungen auf eine ältere Version wiederhergestellt werden.

5
Douglas Daseeco

Was Sie tun möchten, heißt "Dekompilieren". Es gibt viele Dekompilierer und es ist nicht praktisch, sie alle hier zu behandeln.

Als allgemeine Bemerkung: Die Konvertierung von C-Quelle in ausführbaren Maschinencode ist verlustbehaftet. Zum Beispiel:

  • Kommentare gehen irreversibel verloren
  • Variablennamen sind weg
  • Manchmal werden Schleifen für die Leistung abgewickelt
  • Funktionen können neu angeordnet werden

Es ist selten, dass Code so geschrieben wird, wie er geschrieben wurde. Die meisten Compiler ändern heutzutage Ihren Code drastisch, um ihn zu optimieren. Wenn Sie also dekompilieren, kann der Compiler nur erraten, wie der Quellcode ausgesehen haben muss. Er kann nicht wissen, was Ihr Code war, da dieser weg ist. Wenn der Dekompiler gut ist, kann der Code, den Sie erhalten, zumindest wieder in eine entsprechende ausführbare Datei kompiliert werden. Anschließend können Sie ihn langsam umgestalten, damit er lesbar ist. Aber höchstwahrscheinlich wird der Dekompiler absolut unlesbaren Spaghetti-Code erzeugen, und es wird große Kopfschmerzen bereiten, ihn zu entschlüsseln. Manchmal ist es weniger Arbeit, das Programm einfach von Grund auf neu zu schreiben.

3
Bagalaw