Gibt es einen C ++ - Dekompiler? [geschlossen]

116

Ich habe ein Programm, in dem ich den C ++ - Quellcode verloren habe. Gibt es da draußen gute C ++ - Dekompilierer?

Ich bin schon auf Boomerang gestoßen .

Bryan Denny
quelle
objdumpfür Linux
Stypox
1
cutter.re für großartige GUI und großartigen eingebauten Dekompiler
Misiur

Antworten:

80

Sie können IDA Pro von Hex-Rays verwenden . Normalerweise erhalten Sie aus einer Binärdatei kein gutes C ++, es sei denn, Sie haben Debugging-Informationen kompiliert. Bereiten Sie sich darauf vor, viel Handarbeit zu leisten, um den Code umzukehren.

Wenn Sie die Binärdateien nicht entfernt haben, besteht Hoffnung, dass IDA Pro C-ähnlichen Code für Sie erstellen kann. Normalerweise ist es aber sehr rau, zumindest als ich es vor ein paar Jahren benutzt habe.

David Holm
quelle
26
Zur Verdeutlichung wird IDA nur die Demontage durchführen. Es gibt ein Add-On namens Hex-Rays, das den Rest des Weges in eine C / C ++ - Quelle dekompiliert, soweit dies möglich ist.
Davenpcj
2
Nach meinem Lesen der Dokumente geben Hex-Strahlen nur C wie Pseudocode aus. Nicht dass dies das Dekompilieren von C ++ unbrauchbar macht, Sie müssen nur ein wenig darüber wissen, wie Compiler C ++ - Strukturen konvertieren.
Michael Anderson
Zur Verdeutlichung ist Disassembly das Beste, was Sie mit Hex-Rays dekompilieren können. ASM wird in C ++ übersetzt. ASM kann mit Arbeit in jede Programmiersprache übersetzt werden, da alle Programme als ASM ausgeführt werden können
Barkermn01
4
SNOWMAN ist ein guter kostenloser C ++
Inga
2
+1 für Schneemann, aber wie andere bereits erwähnt haben, wird selbst eine einfache Hallo-Welt nach dem Dekompilieren praktisch unlesbar.
bdetweiler
25

Informationen werden beim Kompilieren verworfen. Selbst wenn ein Dekompiler den logisch äquivalenten Code mit Klassen und allem erzeugen könnte (was wahrscheinlich nicht möglich ist), ist der selbstdokumentierende Teil im optimierten Release-Code verschwunden. Keine Variablennamen, keine Routinennamen, keine Klassennamen - nur Adressen.

Dustin Getz
quelle
24
"Die Seele" des Programms ist weg, nur eine leere Hülle seines früheren Selbst ... "
Darshan Chaudhary
21

Ja, aber keiner von ihnen wird es schaffen, lesbaren Code zu erstellen, der die Mühe wert ist. Sie werden mehr Zeit damit verbringen, die dekompilierte Quelle mit Assembler-Blöcken zu lesen, als Ihre alte App von Grund auf neu zu schreiben.

m_pGladiator
quelle
6

Ich habe keine Dekompilierer gesehen, die C ++ - Code generieren. Ich habe einige experimentelle gesehen, die einen vernünftigen Versuch zur Generierung von C-Code unternehmen, aber sie waren in der Regel davon abhängig, dass sie den Codegenerierungsmustern eines bestimmten Compilers entsprechen (das hat sich möglicherweise geändert, es ist eine Weile her, seit ich dies das letzte Mal untersucht habe ). Natürlich werden alle symbolischen Informationen verschwunden sein. Google für "Dekompiler".

Ferruccio
quelle
4

Je nachdem, wie groß und wie gut der ursprüngliche Code geschrieben war, kann es sich lohnen, erneut in Ihrer Lieblingssprache (die möglicherweise noch C ++ ist) zu beginnen und aus Fehlern zu lernen, die in der letzten Version gemacht wurden. Hat nicht jemand einmal darüber gesprochen, einen zu schreiben, um ihn wegzuwerfen?

nb Wenn es sich um ein riesiges Produkt handelt, ist es möglicherweise nicht die Zeit wert.

harriyott
quelle
24
Joel ist ein großartiger Kolumnist, aber manchmal falsch. Und dann gibt es Zeiten, in denen er falsch zitiert wird. Wie hier, da sich die Frage um den Verlust von Quellcode dreht. Joels Artikel erklärt, warum Quellcode wertvoll ist.
MSalters
5
Hat nicht jemand einmal darüber gesprochen, einen zu schreiben, um ihn wegzuwerfen? Ja, und er hat seine Meinung geändert. Davewsmith.com/blog/2010/brook-revisits-plan-to-throw-one-away [I] 1975 riet ich Programmierern, „die erste Version wegzuwerfen“ und dann eine zweite zu bauen einer. Bei der Ausgabe zum 20-jährigen Jubiläum wurde mir klar, dass eine konstante inkrementelle Iteration ein weitaus
vernünftigerer