完美保护!探讨Dotfuscator保护使用动态类型的C#应用??程序机制

在大多数情况下,使用动态类型的应用程序在Dotfuscator保护它们之后可以正常工作。这是因为动态类型通常解析为Dotfuscator输入中不包含的程序集中定义的类(因此不进行重命名)。

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

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

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

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

可参考以下示例:

DynamicMyClass.png

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

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:SampleCodeDynamicDynamicProgram.cs:line 25

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

DotfuscatorConfig.png

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

DynamicBuiltin.png

标签:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年11月8日
下一篇 2019年11月8日

相关推荐

发表回复

登录后才能评论