预编译 - 混淆Roslyn生成的代码

Dev*_*kes 2 c# obfuscation roslyn

我最近的任务是提出一个提供重命名功能的解决方案,以及在运行时预编译的各种其他混淆.我相信使用Roslyn是可行的方法,但请提供您可能拥有的任何见解.

最终目标如下:允许最终用户选择各种选项,然后在运行时将其生成为程序集的文本版本.然后我们使用Roslyn生成.exe.我很好奇是否有可能在运行时混淆,甚至在生成EXE之前.这样我可以重命名变量等.

Ira*_*ter 5

您可以使用任何可以可靠地转换C#源代码的工具.

罗斯林是一个但有趣的方式; 您可以修改程序并生成目标代码.这应该工作.

其他程序转换系统(PTS)可以通过修改代码来实现.PTS读取源代码,构建编译器数据结构(例如,AST),允许您修改AST,然后可以从修改的AST重新生成源代码.这样你就可以看到混淆的代码; 您可以随后使用C#编译器进行编译.一个好的PTS将允许您使用以下形式编写目标语言语法的代码转换:

 if you see *this pattern*, replace it by *that pattern*
Run Code Online (Sandbox Code Playgroud)

以下表示为

  rule <name> <patternvariables>  "thispattern" -> "thatpattern";
Run Code Online (Sandbox Code Playgroud)

使用PTS,您可以对源代码进行任意更改,包括函数和变量重命名,代码流加扰和数据流加扰.例如,您可能会使用此规则来添加混淆:

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

这个规则有点简单/愚蠢,但我认为它可以说明你可以编写可读的源代码转换.如果你有很多这样的规则,它会对代码进行大量加扰,特别是如果你的规则进行复杂的转换.

我们使用DMS Software Reengineering Toolkit来实现名称加扰混淆器,包括一个用于C#的混淆器.