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

Pre-Compile - Obfuscate Roslyn Generated Code

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

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

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

Roslyn 就是其中之一,但以一种有趣的方式;您可以修改程序并生成目标代码。应该可以。

其他Program Transformation Systems (PTS)可以通过修改source代码来实现。 PTS 读取源代码,构建编译器数据结构(例如 AST),让您修改 AST,然后可以从修改后的 AST 重新生成源代码。这样你就可以看到混淆后的代码;您可以稍后使用 C# 编译器对其进行编译。一个好的 PTS 可以让你按照目标语言的语法编写代码转换,格式如下:

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

下面表示为

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

使用PTS,您可以对源代码进行任意更改,包括函数和变量重命名、代码流打乱和数据流打乱。例如,您可以使用此规则来增加混淆:

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

这个规则有点 simple/silly 但我认为它说明了您可以编写可读的源代码转换。如果你有很多这样的规则,它会扰乱代码很多,特别是如果你的规则进行复杂的转换。

我们使用我们的 DMS Software Reengineering Toolkit to implement name-scrambling obfuscators,包括一个用于 C# 的。