reverse-engineering länge - Wie dekompiliere ich eine.NET EXE in einen lesbaren C#Quellcode?



meta description (7)

Ich habe vor ein paar Jahren eine C # -Anwendung für einen Client geschrieben, aber ich habe den Quellcode nicht mehr. Alles, was ich habe, ist die EXE, die ich auf dem Client-PC installiert habe. Gibt es eine Möglichkeit, C # Quellcode aus der EXE generieren?


Answers

Reflector ist im Allgemeinen nicht mehr kostenlos, aber Open Source-Entwicklern steht es kostenlos zur Verfügung: http://reflectorblog.red-gate.com/2013/07/open-source/

Aber einige Unternehmen wie DevExtras und JetBrains haben kostenlose Alternativen geschaffen:

DevExtras CodeReflect

JetBrains DotPeek



JustDecompile ist kostenlos und verfügt über eine Funktion zum Erstellen von Projekten aus .NET-Assemblys.


Als Red Gate sagte, dass es keine kostenlose Version von .Net Reflector mehr geben würde, begann ich mit ILSpy und JustDecompile . Ich habe festgestellt, dass ILSpy genauer dekompilieren kann als JustDecompile (das sich noch in der Beta befindet). Red Gate hat seine Entscheidung geändert und hat noch eine kostenlose Version von .Net Reflector, aber jetzt mag ich ILSpy.

Auf der ILSpy-Website ( ILSpy ):

ILSpy ist der Open-Source .NET Assembly Browser und Decompiler.

ILSpy Funktionen

  • Baugruppen durchsuchen
  • IL Demontage
  • Dekompilierung zu C #
  • Unterstützt Lambdas und "Rendite"
  • Zeigt die XML-Dokumentation an
  • Einsparung von Ressourcen
  • Nach Typen / Methoden / Eigenschaften suchen (Teilzeichenfolge)
  • Hyperlink-basierte Typ- / Methoden- / Property-Navigation
  • Basis / abgeleitete Typen Navigation
  • Navigationsverlauf
  • BAML zu XAML Decompiler
  • Speichern Sie Assembly als C # -Projekt
  • Finden Sie die Verwendung von Feld / Methode
  • Erweiterbar über Plugins (MEF)

Aktualisieren:

Am 15. April 2012 wurde ILSpy 2.0 veröffentlicht. Neue Funktionen gegenüber Version 1.0:

  • Zusammenstellungslisten
  • Unterstützung für das Dekompilieren von Ausdrucksbäumen
  • Unterstützung für gehobene Operatoren auf Nullwerten
  • Dekompilieren zu Visual Basic
  • Suche nach mehreren Zeichenfolgen, die durch Leerzeichen getrennt sind (nach "Assembly Manager" in ILSpy.exe suchen würde AssemblyListManager finden)
  • Durch Klicken auf eine lokale Variable werden alle anderen Vorkommen dieser Variablen hervorgehoben
  • Strg + F kann verwendet werden, um in der dekompilierten Codeansicht zu suchen

Aktualisieren:

  • ILSpy 2.1 unterstützt Async / Warten auf Dekompilierung

Reflector und sein Add-In FileDisassembler .

Reflektor ermöglicht es, den Quellcode zu sehen. Mit FileDisassembler können Sie es in eine VS-Lösung konvertieren.


Ich bin überrascht, dass niemand Microsofts ildasm . Es ist vielleicht nicht so schön wie ILSpy oder Reflector, aber es kommt mit Visual Studio, so viele Entwickler haben es bereits.

Um es auszuführen (unter der Annahme VS 2013, sollte für andere Versionen ähnlich sein):

  1. Wählen Sie Start> Alle Programme> Visual Studio 2013> Visual Studio-Tools.
  2. Doppelklicken Sie auf Entwickler-Eingabeaufforderung für VS2013.
  3. Führen Sie "ildasm" von der resultierenden Eingabeaufforderung aus.
  4. Wählen Sie im Werkzeug Datei> Öffnen und öffnen Sie Ihre ausführbare Datei oder DLL.

Jetzt können Sie durch die DLL-Struktur navigieren. Doppelklicken Sie auf die Klassenmitglieder, um die IL zu sehen. Verwenden Sie Datei> Dump, um IL in eine Datei zu exportieren.


@Ed, I'm a bit reticent about posting this as it's little more than nitpicking. However, I would point out that in your code sample:

MyClass c;
  if (obj is MyClass)
    c = obj as MyClass

If you're going to use 'is', why follow it up with a safe cast using 'as'? If you've ascertained that obj is indeed MyClass, a bog-standard cast:

c = (MyClass)obj

...is never going to fail.

Similarly, you could just say:

MyClass c = obj as MyClass;
if(c != null)
{
   ...
}

I don't know enough about .NET's innards to be sure, but my instincts tell me that this would cut a maximum of two type casts operations down to a maximum of one. It's hardly likely to break the processing bank either way; personally, I think the latter form looks cleaner too.





c# .net reverse-engineering decompiling