Quellenforschung in .NET

Den Quellcode einer ausführbaren Datei zu rekonstruieren ist ein Anliegen, das viele Entwickler teilen. Das Microsoft .NET Framework legt diesem Wunsch prinzipiell keine Steine in den Weg. Dieser Artikel stellt einige, meist kostenlose, Werkzeuge zum Dekompilieren in .NET vor.

In Pocket speichern vorlesen Druckansicht 1 Kommentar lesen
Lesezeit: 7 Min.
Von
  • Harald M. Genauck
Inhaltsverzeichnis

Den Wunsch, Quellcode einer ausführbaren Datei zu rekonstruieren, teilen viele Entwickler. Gründe dafür mag es viele geben: angefangen von durchaus legitimen, wie etwa dem, dass einem der eigene ursprüngliche Quellcode aus welchem Grund auch immer abhandengekommen ist, bis hin zum illegalen Abkupfern. Dazwischen liegt die Grauzone des Reengineerings, das beispielsweise zum Aufspüren von Fehlern in Komponenten und Bibliotheken oder aber zum Herstellen von Interoperabilität noch als legitim angesehen wird.

Das Microsoft .NET Framework jedenfalls legt diesem Wunsch prinzipiell keine Steine in den Weg. Eher im Gegenteil: Die dem Framework eigenen Reflection-Mechanismen und die automatisch in den Kompilaten enthaltenen Metadaten liefern den Rohstoff, auf den das Framework zum Teil für die eigene Funktionsfähigkeit angewiesen ist.

So gehört beispielsweise ein Disassembler (ildasm.exe), der ein ausführbares Kompilat (DLL oder EXE) in die hinter allen .NET-Programmiersprachen stehende "[Common] Intermediate Language" ([C]IL) zurück übersetzen kann, zu den Werkzeugen des Microsoft .NET Framework SDKs. Ein IL-Listing zu lesen ist allerdings nicht jedermanns Sache. Erst ein "richtiges" Quellcode-Listing, zumindest eine Übersetzung in eine der gängigsten .NET-Sprachen wie C# oder VB.NET, bietet den "richtigen Wohlfühlfaktor". Eine solche Umsetzung in Quellcode leisten sogenannte "Decompiler".

Bei Quellcode in der gewohnten Programmiersprache (C#, VB) ist der "Wohlfühlfaktor" größer als bei einem Listing in der Intermediate Language (IL).

Natürlich gibt es auch Werkzeuge, die die eingebaute Rekonstruierbarkeit unterbinden sollen. Microsoft selbst hat dem von Anfang Rechnung getragen und mit jeder Visual-Studio-Version einen sogenannten "Obfuscator" mitgeliefert beziehungsweise eine Schnupperversion davon angeboten. Diese Werkzeuge sind tatsächlich so "gemein", wie ihr Name klingt: Sie verwürfeln das Innere einer Assembly derart, dass die meisten Decompiler-Werkzeuge erst einmal das Handtuch werfen müssen.

Der "Urvater" der Decompiler-Familie und zugleich deren bisher langlebigstes Mitglied ist der ".NET Reflector", den ursprünglich Lutz Roeder, Principal Software Architect bei Microsoft, schon bald nach Erscheinen des Microsoft .NET Frameworks geschrieben und als Freeware der Entwicklergemeinde zur Verfügung gestellt hatte. Mit dem Ziel, die konsequente und professionelle Weiterentwicklung voranzutreiben, übernahm Red Gate im Jahr 2008 den Reflector und machte ab 2011 mit der Version 7 ein kommerzielles Produkt daraus.

Aktuell bietet Red Gate Version 7.7des Reflectors in drei Varianten und mit vollständiger Unterstützung des .NET Framework 4.5 an. Als eigenständige Anwendung ("Reflector Standard") kann nahezu jede .NET-Assembly in Form von C#-, VB.NET, MS-C++- oder F#-Quellcode sowie als IL-Listing ausgegeben oder exportiert werden. Im Quellcode können Symbolnamen (wie etwa Klassen- oder Methodennamen) weiter verfolgt und deren jeweilige Definitionen per Click angesprungen werden. In einem Analyse-Fenster werden Abhängigkeiten und Verwendungen von Objekten aufgezeigt. Die projektbezogene Arbeit wird mit individuell zusammenstellbaren Assembly-Listen erleichtert und als bequeme Gedächtnisstütze können Bookmarks angelegt werden. "Reflector VS", eine der durch Red Gate bereitgestellten Varianten, enthält neben der eigenständigen Anwendung eine Erweiterung für Microsoft Visual Studio. Sie erlaubt ein dynamisches Dekompilieren direkt in VS, die Navigation zu Definitionen im dekompilierten Quellcode per Kontextmenü oder über den eigenen Reflector-Object-Browser. Als Highlight kommt in der umfangreichsten Version "Reflector Pro" die Möglichkeit hinzu, PDBs (Symbol-Dateien) zu dekompiliertem Code zu erzeugen und damit die Option zum Debuggen zu eröffnen. Der entstandene Code kann dabei durchlaufen und Haltepunkte können gesetzt werden. Die seinerzeit schon von Lutz Roeder angelegte Erweiterbarkeit des Reflectors konnte den Weg für eine im Laufe der Jahre stattliche angewachsene Palette an Add-ins ebnen. In einem Projekt auf der Open-Source-Plattform CodePlex zusammengefasst, finden sich Tools wie beispielsweise zur Visualisierung von Assembly-Strukturen und -Referenzen, zur Manipulation von IL-Code, zur Darstellung von BAML-/WPF-Ressourcen in XAML und vielem mehr.

Eine Möglichkeit zum Debuggen in dekompiliertem Quellcode einer System- Assembly bietet der ".NET Reflector VS Pro" von Red Gate.

Die Kommerzialisierung des bis dahin kostenlosen und auch daher sehr populären Reflectors durch Red Gate hat, wie fast zwangsläufig zu erwarten war, laute Proteste in der Entwicklergemeinde hervorgerufen und so den Anstoß für verschiedene Initiativen gegeben, die weiterhin kostenfrei verfügbare .NET-Decompiler zur Verfügung stellen wollen.