探讨!Dotfuscator如何保护使用动态类型的C#应用​​程序

C#中的动态类型提供了其他静态类型语言无法提供的灵活性。自C#4.0(.NET 4.5)引入以来,Dotfuscator与希望了解有关混淆类型如何影响动态类型的客户进行了合作。

Dotfuscator点击下载最新版)是一个.NET的Obfuscator。它提供企业级的应用程序保护,大大降低了盗版、知识产权盗窃和篡改的风险。Dotfuscator的分层混淆、加密、水印、自动失效、防调试、防篡改、报警和防御技术,为世界各地成千上万的应用程序提供保护。

使用动态类型时,编译器会对其成员方法(和/或属性)生成反射调用。这些反射调用使用方法名称的字符串表示形式在运行时调用该方法。混淆后,此字符串必须与方法名称匹配,以避免破坏运行时行为。

在大多数情况下,使用动态类型的应用程序在Dotfuscator保护它们之后可以正常工作。这是因为动态类型通常解析为Dotfuscator输入中不包含的程序集中定义的类(因此不进行重命名)。这包括来自第三方程序集的类型,来自非托管程序集的类型,以及内置类型-int,bool,string。另一方面,如果动态类型解析为在Dotfuscator的输入程序集中定义的类型,则需要设置Dotfuscator重命名排除项以保留那些编译器生成的反射调用。

可参考以下示例:

探讨!Dotfuscator如何保护使用动态类型的C#应用​​程序

动态类型解析为MyClass,如我们的代码中所定义。然后,它从MyClass调用MyMethod。编译完此代码后,请注意,编译器将MyMethod的字符串表示形式加载到要通过反射加载的堆栈上。从MSIL:

探讨!Dotfuscator如何保护使用动态类型的C#应用​​程序

如果对这些代码进行了混淆而没有重命名排除,我们将遇到运行时错误:

Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'a.a' does not contain a definition for 'MyMethod'   at CallSite.Target(Closure , CallSite , Object , String )   at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite site, T0 arg0, T1 arg1)   at a.a() in C:\SampleCode\Dynamic\Dynamic\Program.cs:line 25

为了避免此运行时错误,我从重命名中排除了“ MyMethod”。

探讨!Dotfuscator如何保护使用动态类型的C#应用​​程序

如果我们从MyClass加载属性,则可能会应用相同的想法。在示例的其他地方,有一个动态类型可以解析为内置类型。即使在运行时在int和string之间切换,此代码也可以在没有其他Dotfuscator配置的情况下正常运行:

探讨!Dotfuscator如何保护使用动态类型的C#应用​​程序