Sdílet prostřednictvím


Verfolgen und Interpretieren der Verbergungsausgabe

Schritt 1 – Verwenden eines Disassemblers

Das .NET Framework SDK enthält ein Disassemblierungstool mit dem Namen ildasm, mit dem Sie .NET Assemblys in IL-Assembly-Sprachanweisungen dekompilieren können. Um ildasm zu starten, stellen Sie zunächst sicher, dass das .NET Framework SDK installiert ist und sich im Suchpfad befindet, und geben Sie auf der Befehlszeile ildasm ein.

Hinweis: Wenn dies nicht funktioniert, Visual Studio aber installiert ist, befindet sich ildasm wahrscheinlich nicht im Suchpfad. Zum Öffnen der Visual Studio-Eingabeaufforderung wählen Sie im Startmenü Visual Studio [Version] | Visual Studio-Tools | Visual Studio [Version]-Eingabeaufforderung aus. Geben Sie ildasm ein.

  • Wählen Sie Datei | Öffnen aus, und wechseln Sie zu:
C:\Programme\PreEmptive Solutions\Dotfuscator Professional Edition 4.0\samples\GettingStarted\bin\Debug 
  • Wählen Sie GettingStarted.exe aus. Klicken Sie auf Öffnen. Eine Ansicht der disassemblierten Assembly wird angezeigt:

  • Um die angezeigte, nicht verborgene HelloWorld-Anwendung mit der verborgenen Version zu vergleichen, starten Sie eine weitere Kopie von ildasm. Wechseln Sie hierbei zum Verzeichnis
C:\Programme\PreEmptive Solutions\Dotfuscator Professional Edition 4.0\samples\GettingStarted\Dotfuscated 
  • Wählen Sie GettingStarted.exe aus. Klicken Sie auf Öffnen.

Ordnen Sie die ildasm-Fenster nebeneinander an. Vergleichen Sie die beiden Abbildungen miteinander.

Beachten Sie, dass die nicht verborgene Disassembly Methodennamen enthält, die gut verständlich sind. Beispielsweise kann aus dem Namen der Methode ConverseButton_Click: void (object, class [mscorlib]System.EventArgs) darauf geschlossen werden, dass diese Methode aufgerufen wird, wenn auf die Schaltfläche Converse geklickt wird. Sehen Sie sich jetzt die verborgene Version an. Welche Methode wird aufgerufen, wenn auf die Schaltfläche Converse geklickt wird? Dies ist nicht ohne weiteres zu erkennen. Beachten Sie auch, dass die SaySomething-Methode fehlt. Sie wurde entfernt, da die Methode im Code nicht verwendet wurde.

Doppelklicken Sie auf die Methoden SayHello:string () aus der ursprünglichen Assembly und a:string () aus der verborgenen Assembly. Diese beiden Methoden sind offenkundig identisch. Allerdings werden Sie bei genauerer Untersuchung des disassemblierten IL-Codes feststellen, dass die Zeichenfolgen in der verborgenen Version verschlüsselt wurden, um ein Entziffern des Codes zu erschweren. Suchen Sie z. B. die folgende Zeile in der nicht verborgenen Version:

IL_0000:  ldstr      "Hello, my name is "

Sehen Sie sich jetzt die verborgene Version an, und versuchen Sie, die oben erwähnte Zeichenfolge zu finden. Wenn Sie Schwierigkeiten haben, die Zeichenfolge zu finden, so liegt dies an der Verschlüsselung der Zeichenfolge, die nun wie folgt lautet:

IL_0000: ldstr bytearray (09 42 26 44 29 46 2B 48 26 4A 67 4C 6D 4E 22 50   
                          28 52 73 54 3B 56 36 58 34 5A 3E 5C 7D 5E 36 60   
                          12 62 43 64 )

Es ist leicht einzusehen, dass dies für Personen, die ein Reverse Engineering des Codes versuchen, verwirrend sein muss, insbesondere in komplexeren Anwendungen.

Schritt 2 – Dekompilieren

Der Gedanke liegt nahe, dass Quellcode nur einem kleinen Kreis technisch versierter Personen zugänglich ist, die mit der IL-Assemblysprache vertraut sind. Dies ist jedoch ein Irrtum. Der nächste Schritt bestünde darin, durch Verwendung eines Decompilers wie Reflector oder Anakrino den Quellcode selbst aus der Anwendung wiederherzustellen. Mit diesen Dienstprogrammen kann eine .NET-Assembly direkt zurück in eine Hochsprache wie C#, Visual Basic .NET oder C++ dekompiliert werden.

In diesem Abschnitt werden zwei frei verfügbare Decompiler verwendet:

  1. Reflector for .NET, http://www.aisto.com/roeder/dotnet/
  2. Anakrino (Version mit Benutzeroberfläche) / Exemplar (Befehlszeilenversion), http://www.saurik.com/net/exemplar/

Wenn Sie Anakrino / Exemplar für die mit Dotfuscator verborgene Datei GettingStarted.exe ausführen, wird der folgende Fehler erzeugt:

Exemplar.exe has encountered a problem and needs to close. We are sorry for the inconvenience.

Wenn Sie .NET Reflector für die mit Dotfuscator verborgene Datei GettingStarted.exe ausführen und versuchen, eine Methode wie a() zu untersuchen, wird die folgende Ausnahme ausgelöst:

This item appears to be obfuscated and can not be translated.

System.NotSupportedException: Cannot resolve local variable 'Label_0047'.
   at Reflector.CodeModel.Memory.GotoStatement.Resolve()
   at _12.VisitBlockStatement(IBlockStatement statement)
   at _111.VisitStatement(IStatement value)
   at _119.VisitMethodDeclaration(IMethodDeclaration value)
   at _125.VisitMethodDeclaration(IMethodDeclaration value)
   at _126.VisitMethodDeclaration(IMethodDeclaration value)
   at _123.VisitMethodDeclaration(IMethodDeclaration value)
   at _146._1(Boolean )

Folglich konnte durch Dotfuscator Professional ein Reverse Engineering des mit Dotfuscator verborgenen Codes mithilfe zweier wichtiger Decompiler verhindert werden.

© 2002-2007 PreEmptive Solutions. Alle Rechte vorbehalten.