2010-11-23 8 views
6

Es tut mir leid - C++ - Quellcode kann als Implementierung eines Designs gesehen werden, und mit Reverse-Engineering ich meine, das Design zurück zu bekommen. Es scheint, dass die meisten von euch es gelesen haben, als ob sie eine C++ Quelle von Binaries bekommen. Ich habe eine genauere Frage an Understanding a C++ codebase by generating UML - tools&methologyReverse Engineering C++ - beste Werkzeuge und Ansatz


geschrieben Ich denke, es gibt viele Tools, die C-Reverse Engineering kann ++ (Sourcecode), aber in der Regel ist es nicht so einfach, einen Sinn zu geben, was Sie raus.

Haben Sie eine gute Methode gefunden?

Ich denke, eines der Dinge, die ich zum Beispiel sehen möchte, ist die GUI-Ebene und wie sie getrennt ist (oder nicht vom Rest). Denke, die Tools sollten Pakete irgendwie erkennen und dann lasse ich sie manuell organisieren.

+0

Wenn Sie Quellcode haben, was genau meinen Sie in erster Linie mit "Reverse Engineering"? – SingleNegationElimination

+0

Sie erwarten, dass ein Disaspebler oder Decompiler Pakete erkennt, Benutzeroberflächenelemente aus Nicht-UI-Code abliest oder irgendetwas in der Nähe davon? – Falmarri

Antwort

8

Meiner Kenntnis nach gibt es keine zuverlässigen Tools, die kompiliertes C++ rückentwickeln können.

Darüber hinaus denke ich, dass es fast unmöglich sein sollte, ein solches Gerät zu bauen. Ein kompiliertes C++ - Programm wird zu nichts weiter als maschinensprachlichen Anweisungen. Um zu wissen, wie dies C++ - Konstrukten zugeordnet ist, müssen Sie den Compiler, die Compilereinstellungen, die enthaltenen Bibliotheken usw. ad infinitum kennen.

Warum wollen Sie so etwas? Je nachdem, was Sie wollen, kann es andere Wege geben, um das zu erreichen, was Sie wirklich wollen.

+1

Es ist auch keine Bijektion, selbst wenn die Compiler-Information: zu der Zeit ein paar Funktions-Template-Aufrufe wurden inline, instanziiert mit verschiedenen Typen, ist es unmöglich zu wissen, und kann sehr schwer zu erraten, dass sie wirklich alle aus dem gleichen stammen Vorlage an erster Stelle. Es sei denn, die Binärdatei hat Debug-Informationen. –

+0

Ziemlich einverstanden - Sie können C++ nicht wirklich reverse engineeren. – Puppy

+0

Sie gehen davon aus, dass das Ziel darin besteht, den ursprünglichen Quellcode wiederherzustellen. Es ist hypothetisch möglich, etwas funktionell Äquivalentes zurückzubekommen (selbst wenn dies bedeutet, dass Template-Instanziierungen wie unabhängige Typen und Funktionen aussehen werden). Es gibt jedoch kein Werkzeug, das das momentan gut macht. –

3

Sie können mit dissembly Steuerfluss ziehen, aber Sie werden nie wieder Datentypen ...

Es gibt nur ganze Zahlen (und vielleicht ein paar Shorts) in der Montage. Denken Sie an Objekte, Arrays, Strukturen, Strings und Zeigerarithmetik, die alle vom selben Typ sind!

+3

"Sie werden niemals Datentypen zurückbekommen" - frage ich mich. Vtables sind möglicherweise gut erkennbar, und wahrscheinlich hat alles mit externer Verknüpfung Namen, die man auslesen kann. Sie können vielleicht eine vernünftige Menge über viele Klassen herausfinden, aber was Sie nicht tun können, ist alle Anrufe zu dieser Klasse zu finden, da im Allgemeinen einige inline sein werden. –

+1

@Steve: Die Namen sind nicht da. Alles, was übrig bleibt, sind Speicheradressen. –

+0

@Steve Jessop: Inline-Funktionen sind eigentlich kein Problem, das dem "Decompiler" einfach als mehrere Funktionen mit wiederholtem Code erscheinen wird. Sicher, es wird nicht wie die ursprüngliche Quelle aussehen, aber es kann funktional gleichwertig mit dem sein, was wirklich wichtig für das Reverse Engineering ist. –

3

Es ist zwar keine vollständige Lösung. Sie sollten in IDA Pro und Hexrays schauen.

Es ist mehr für "Reverse Engineering" im traditionellen Sinne des Satzes. Wie in, wird es Ihnen eine gute Idee von dem geben, wie der Code in einer C-ähnlichen Sprache aussehen würde, aber wird (kann) nicht völlig funktionierenden Quellcode zur Verfügung stellen.

Was es gut ist für, ein gutes Verständnis davon zu bekommen, wie ein bestimmtes Segment (normalerweise eine Funktion) funktioniert. Es ist "user assisted", was bedeutet, dass es oft viele Dereferenzierungen von Offsets macht, wenn es wirklich eine Struktur oder Klasse gibt. An diesem Punkt können Sie den Decompiler mit einer Strukturdefinition versorgen (Klassen sind wirklich nur Strukturen mit zusätzlichen Dingen wie v-Tabellen und so) und es wird den Code mit den neuen Typinformationen neu analysieren.

Wie ich schon sagte, es ist nicht perfekt, aber wenn Sie "Reverse Engineering" machen wollen, ist es die beste Lösung, die ich kenne. Wenn Sie vollständige "Dekompilierung" wollen, dann haben Sie ziemlich viel Glück.

0

Das OovAide-Projekt unter oder auf GitHub hat ein paar Funktionen, die helfen können. Es verwendet den CLang-Compiler zum Abrufen von genauen Informationen aus dem Quellcode. Es durchsucht die Verzeichnisse auf der Suche nach Quellcode und sammelt die Informationen in ein kleineres Dataset, das die für die Analyse erforderlichen Informationen enthält.

Ein Konzept heißt Zone Diagrams.Es zeigt Beziehungen zwischen Klassen bei ein sehr hohes Niveau seit jeder Klasse, wie ein Punkt auf dem Diagramm gezeigt, und Verbindungslinien werden gezeigt, die sie verbinden. Dies ermöglicht die Diagramme, um Hunderte oder Tausende von Klassen anzuzeigen. Die OovAide-Programmzonendiagrammanzeige hat einen Optionsaufruf "Show Child Zones", , der die Klassen gruppiert, die in Verzeichnissen näher beieinander liegen. Es gibt auch Verzeichnisfilter, mit denen die Anzahl der Klassen reduziert werden kann, die in einem Diagramm für sehr große Projekte angezeigt werden. Ein Beispiel für Zonenpläne und wie sie funktionieren wird hier gezeigt: http://oovaide.sourceforge.net/articles/ZoneDiagrams.html

Wenn die Verzeichnisse Komponententypen in den Buildeinstellungen zugewiesen sind, dann das Komponentendiagramm, das die Abhängigkeiten zwischen den Komponenten zeigen. Diese zeigt sogar, welche Komponenten von externen Komponenten wie GTK oder anderen externen Bibliotheken abhängig sind.

Die nächste Ebene nach unten zeigt etwas wie UML-Klassendiagramme, zeigt aber alle Relationen anstelle von nur Aggregation und Vererbung. Er kann Klassen anzeigen, die in Methoden verwendet werden, oder Klassen, die als Parameter an Methoden übergeben werden. Jede Klasse kann als Startpunkt ausgewählt werden, dann wird vor eine Klasse dem Diagramm hinzugefügt, und es wird eine Liste angezeigt, in der angezeigt werden kann, welche Klassen durch einen Beziehungstyp angezeigt werden.

Die unterste Ebene zeigt Sequenzdiagramme. Dies ermöglicht das Navigieren in der Aufrufstruktur nach oben oder nach unten, während die Klassen angezeigt werden, die die Methoden enthalten.