2016-07-11 24 views
1

Ich wurde vor kurzem damit beauftragt, eine Lösung für die Bereitstellung von Umbenennungsfunktionen, sowie verschiedene andere Verschleierung zur Laufzeit vorkompilieren. Ich glaube, Roslyn zu benutzen ist der richtige Weg, aber bitte geben Sie mir einen Einblick.Pre-Compile - Obfuscate Roslyn generierter Code

Das ultimative Ziel ist wie folgt: Ermöglichen Sie Endbenutzer, verschiedene Optionen auszuwählen, die dann in einer Textversion der Assembly zur Laufzeit generiert werden. Wir verwenden dann Roslyn, um die .exe zu erzeugen. Ich war neugierig, ob es möglich ist, zur Laufzeit zu verschleiern, bevor die EXE überhaupt erzeugt wird. Auf diese Weise kann ich vars usw. umbenennen.

+0

Verwenden Sie Mono.Cecil. – SLaks

Antwort

5

Sie können jedes Werkzeug verwenden, das C# Quellcode zuverlässig transformiert.

Roslyn ist eine aber auf eine lustige Art; Sie können das Programm ändern und Objektcode erzeugen. Das sollte funktionieren.

Andere Program Transformation Systems (PTS) können dies tun, indem Sie die Quelle Code ändern. Ein PTS liest Quellcode, erstellt Compilerdatenstrukturen (z. B. ASTs), lässt Sie die ASTs ändern und kann dann den Quellcode aus dem modifizierten AST regenerieren. Auf diese Weise können Sie den verschleierten Code sehen; Sie können es später immer mit dem C# -Compiler kompilieren. Eine gute PTS wird Ihnen Code-Transformationen in Bezug auf die Syntax der Zielsprache in einer Form wie folgt schreiben:

if you see *this pattern*, replace it by *that pattern* 

ausgedrückt unten als

rule <name> <patternvariables> "thispattern" -> "thatpattern"; 

Mit einem PTS können Sie wohl willkürlich machen Änderungen am Quellcode, einschließlich der Umbenennung von Funktionen und Variablen, Code-Flow-Scrambling und Datenfluss-Scrambling. Zum Beispiel könnten Sie diese Regel verwenden, um Verwirrung fügen:

rule scramble_if_then(c: condition, b: block): statement -> statement 
     " if (\c) \b " -> "int temp = \c?4:3; 
          while (temp>3) {\b; temp--; }"; 

Diese Regel ist ein bisschen einfach/albern, aber ich denke, dass es den Punkt macht, die Sie lesbare Quellcode-Transformationen schreiben können. Wenn Sie viele solcher Regeln haben, wird es den Code sehr verschlingen, besonders wenn Ihre Regeln komplizierte Transformationen durchführen.

Wir verwenden unsere DMS Software Reengineering Toolkit zur Implementierung name-scrambling obfuscators, einschließlich einer für C#.