翻譯|行業(yè)資訊|編輯:李顯亮|2019-12-11 13:37:33.150|閱讀 258 次
概述:在大多數(shù)情況下,使用動態(tài)類型的應用程序在Dotfuscator保護它們之后可以正常工作。這是因為動態(tài)類型通常解析為Dotfuscator輸入中不包含的程序集中定義的類(因此不進行重命名)。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
C#中的動態(tài)類型提供了其他靜態(tài)類型語言無法提供的靈活性。自C#4.0(.NET 4.5)引入以來,Dotfuscator與希望了解有關混淆類型如何影響動態(tài)類型的客戶進行了合作。
Dotfuscator(點擊下載最新版)是一個.NET的Obfuscator。它提供企業(yè)級的應用程序保護,大大降低了盜版、知識產權盜竊和篡改的風險。Dotfuscator的分層混淆、加密、水印、自動失效、防調試、防篡改、報警和防御技術,為世界各地成千上萬的應用程序提供保護。
使用動態(tài)類型時,編譯器會對其成員方法(和/或屬性)生成反射調用。這些反射調用使用方法名稱的字符串表示形式在運行時調用該方法。混淆后,此字符串必須與方法名稱匹配,以避免破壞運行時行為。
在大多數(shù)情況下,使用動態(tài)類型的應用程序在Dotfuscator保護它們之后可以正常工作。這是因為動態(tài)類型通常解析為Dotfuscator輸入中不包含的程序集中定義的類(因此不進行重命名)。這包括來自第三方程序集的類型,來自非托管程序集的類型,以及內置類型-int,bool,string。另一方面,如果動態(tài)類型解析為在Dotfuscator的輸入程序集中定義的類型,則需要設置Dotfuscator重命名排除項以保留那些編譯器生成的反射調用。
可參考以下示例:
動態(tài)類型解析為MyClass,如我們的代碼中所定義。然后,它從MyClass調用MyMethod。編譯完此代碼后,請注意,編譯器將MyMethod的字符串表示形式加載到要通過反射加載的堆棧上。從MSIL:
如果對這些代碼進行了混淆而沒有重命名排除,我們將遇到運行時錯誤:
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”。
如果我們從MyClass加載屬性,則可能會應用相同的想法。在示例的其他地方,有一個動態(tài)類型可以解析為內置類型。即使在運行時在int和string之間切換,此代碼也可以在沒有其他Dotfuscator配置的情況下正常運行:
本站文章除注明轉載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn