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

14

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)?

Mahsa
quelle
Was Sie wollen, heißt Dekompiler. Möglicherweise finden Sie Hilfe bei dieser Antwort: stackoverflow.com/questions/193896/whats-a-good-c-decompiler
Eric Renouf
IDA Pro mit dem Dekompilierermodul ist die einzige praktische Lösung, die tatsächlich mit großen ausführbaren Dateien funktioniert.
fpmurphy
@ fpmurphy1 Sie haben Hopper, dessen Qualität mit IDA Pro vergleichbar ist und dessen Lizenz einen Bruchteil des Preises ausmacht.
Rui F Ribeiro
@ fpmurphy1 Ich habe es noch nicht geschafft, die Qualität des von Avast generierten Codes zu sehen ... wer verwendet noch Intel 32-Bit-Plattformen? Außerdem habe ich Wintel seit Jahrzehnten nicht mehr benutzt. siehe unix.stackexchange.com/questions/418354/… Der Preisunterschied ist ziemlich bedeutend. Hex-rays / IDA pro beginnen jedoch bei 1500 USD für eine persönliche Lizenz bis zu einigen erpresserischen Werten für kommerzielle Lizenzen wie 5000 USD oder höher. AFAIK, Hopper beträgt 100 USD für einen einzelnen Benutzer und 130 für einen einzelnen Computer.
Rui F Ribeiro
@RuiFRibeiro. Eine verdammt große Menge Malware, die ich untersuche, ist immer noch 32-Bit.
fpmurphy

Antworten:

24

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 die Binärdatei dekompilieren . Das gibt Ihnen nicht Ihren Quellcode, aber es gibt Ihnen einen 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.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Bumerang sieht ziemlich ordentlich aus; Schade, dass die Dokumentation auf gcc -O4 verweist, da dies absolut nichts bewirkt (über -O3 hinaus), wenn der Speicher mir recht tut. Ihr letzter Satz ist natürlich ebenso gültig wie Ihre ersten fünf Sätze. Das heißt nicht, dass der Rest nicht so sehr gültig ist, als dass Sie sehr stark darauf hinweisen, wie wichtig es ist, regelmäßig zu sichern. +1
Pryftan
5

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 Assembler-Code für diese bestimmte Architektur schreiben oder Erfahrung mit der Disassemblierung haben, schwer zu lesen sind.
  3. Dekompiler wie Boomerang, Hex-rays und Snowman bieten zwar eine bessere Lesbarkeit, 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 (der 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.

Douglas Daseeco
quelle
1
# 1: Stimmt, obwohl es auch seine Fehler hat. # 3: Ich denke, das sind kommerzielle? Ich bin nur akademisch neugierig (ich habe redundante Backups, so dass ich so etwas nicht brauche). # 4: cflow (obwohl das die Quelle verwendet, gibt es einige, die an der Binärdatei arbeiten - natürlich mit einigen Einschränkungen). Es gibt andere da draußen, je nachdem, wonach Sie suchen. Was die grafische Ausgabe betrifft, kann ich dort nicht helfen, da ich die grafische Ausgabe für diese Art von Dingen nicht mag oder brauche (ich würde sie tatsächlich ablenkender finden). # 5: sehr wahr. Natürlich können Sie hier auch eine Textdatei verwenden.
Pryftan
3

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 aufwendig, das Programm von Grund auf neu zu schreiben.

Bagalaw
quelle
Beim Thema Kommentare ist mir kürzlich aufgefallen: - und ich habe keine Ahnung, ob dies das Lesen von Kommentaren durch einen Dekompiler ermöglichen würde, und ich erwarte auch nicht, dass Dekompiler überhaupt nach solchen Dingen suchen - Folgendes: -C Verwerfen Sie keine Kommentare. Alle Kommentare werden an die Ausgabedatei weitergeleitet, mit Ausnahme der Kommentare in verarbeiteten Anweisungen, die zusammen mit der Anweisung gelöscht werden. Es werden sowohl die Nebenwirkungen als auch die der Option -CC hervorgehoben (dies gilt für gcc, wahrscheinlich jedoch für cpp). Nicht, dass ich erwarte, dass es für das OP gilt, aber vielleicht für einige von Interesse.
Pryftan