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

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

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

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

在大多数状况下,使用动态类型的应用程序在Dotfuscator保护它们以后能够正常工做。这是由于动态类型一般解析为Dotfuscator输入中不包含的程序集中定义的类(所以不进行重命名)。这包括来自第三方程序集的类型,来自非托管程序集的类型,以及内置类型-int,bool,string。另外一方面,若是动态类型解析为在Dotfuscator的输入程序集中定义的类型,则须要设置Dotfuscator重命名排除项以保留那些编译器生成的反射调用。3d

可参考如下示例:调试

DynamicMyClass.png

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

1576042201.png

若是对这些代码进行了混淆而没有重命名排除,咱们将遇到运行时错误:字符串

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”。get

DotfuscatorConfig.png

若是咱们从MyClass加载属性,则可能会应用相同的想法。在示例的其余地方,有一个动态类型能够解析为内置类型。即便在运行时在int和string之间切换,此代码也能够在没有其余Dotfuscator配置的状况下正常运行:编译器

DynamicBuiltin.png

相关文章
相关标签/搜索