翻譯|使用教程|編輯:李顯亮|2019-06-05 11:06:29.640|閱讀 504 次
概述:Dotfuscator提供了一種應(yīng)用程序保護(hù)的多層方法。這些層中的每一層都提供了一個重要的整體保護(hù)策略。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Dotfuscator是一個.NET的Obfuscator。它提供企業(yè)級的應(yīng)用程序保護(hù),大大降低了盜版、知識產(chǎn)權(quán)盜竊和篡改的風(fēng)險(xiǎn)。Dotfuscator的分層混淆、加密、水印、自動失效、防調(diào)試、防篡改、報(bào)警和防御技術(shù),為世界各地成千上萬的應(yīng)用程序提供保護(hù)。
Dotfuscator提供了一種應(yīng)用程序保護(hù)的多層方法。這些層中的每一層都提供了一個重要的整體保護(hù)策略。如果一層受到損害,其他層繼續(xù)提供有效保護(hù),使攻擊者更難以實(shí)現(xiàn)其目標(biāo)。并且不僅有多個層,而且每個層都具有比其他混淆產(chǎn)品使用的簡單技術(shù)更強(qiáng)大的高級功能。
從本文開始我們一起了解Dotfuscator如何對應(yīng)用程序進(jìn)行多層保護(hù),層層遞進(jìn),大致可分為:
Dotfuscator能夠?qū)⑺蓄悺⒎椒ê妥侄沃孛麨槎堂Q。這使得反編譯輸出更加難以理解,并且使得生成的可執(zhí)行文件的大小更小。
大多數(shù)商業(yè)混淆器使用一種重命名技術(shù),該技術(shù)應(yīng)用的普通標(biāo)識符可以短至單個字符。當(dāng)obfuscator處理代碼時(shí),它選擇下一個可用的平凡標(biāo)識符進(jìn)行替換。這個看似簡單的重命名方案有一個關(guān)鍵屬性:它是不可逆轉(zhuǎn)的。在保留程序邏輯的同時(shí),這些名稱變得毫無意義,阻礙了所有理解代碼的嘗試。
Dotfuscator使用了一種更深層次的混淆技術(shù),它是為Dotfuscator開發(fā)的,并通過先發(fā)制人的解決方案獲得了專利,稱為過載感應(yīng)?。重載歸納不是為每個舊名稱替換一個新名稱,而是將盡可能多的方法重命名為相同的名稱。下面的簡單例子說明了過載感應(yīng)技術(shù)的威力:
混淆之前的原始源代碼:
private void CalcPayroll(SpecialList employeeGroup) { while (employeeGroup.HasMore()) { employee = employeeGroup.GetNext(true); employee.UpdateSalary(); DistributeCheck(employee); } }
重載感應(yīng)混淆后的反向工程源代碼:
private void a(a b) { while (b.a()) { a = b.a(true); a.a(); a(a); } }
實(shí)例表明,代碼被混淆和壓縮,這是重命名的一個積極的副作用。通過保存字符串堆條目,重命名還可以節(jié)省空間。這種方法有著明顯的優(yōu)點(diǎn)在于:
Overload-Induction的專利算法確定所有可能的重命名沖突,只有在安全的情況下才會引發(fā)方法重載。這個過程可以證明是不可逆的。換句話說,重構(gòu)原始方法名稱關(guān)系是不可能的(即使再次運(yùn)行重載誘導(dǎo))。
Dotfuscator還通過允許將方法的返回類型或字段的類型用作確定方法或字段唯一性的標(biāo)準(zhǔn),從而增強(qiáng)了超載誘導(dǎo)?。該特性允許在方法和字段重命名中最多增加15%的冗余。此外,由于在源語言(包括c#和Visual Basic)中通常不允許重載方法返回類型或字段類型,這進(jìn)一步阻礙了反編譯器。
通常不會對包含任何XAML代碼的程序集執(zhí)行過載誘導(dǎo),因?yàn)檫\(yùn)行時(shí)確定XAML和代碼如何鏈接的方式不同。因此,Use Enhanced Overload Induction選項(xiàng)不會更改此類程序集的任何內(nèi)容。當(dāng)使用任何類型的反射(包括XAML)、指定入口點(diǎn)的配置文件、其他應(yīng)用程序調(diào)用的庫等時(shí),重命名可能會出現(xiàn)問題。在重命名后對應(yīng)用程序進(jìn)行全面測試,以確保不存在此類問題,這一點(diǎn)非常重要。
假定庫模式已關(guān)閉,Dotfuscator將嘗試重命名它所能重命名的所有內(nèi)容。反射的某些使用可能導(dǎo)致Dotfuscator在重命名時(shí)不更新對特定實(shí)體的所有引用。在下面的例子中,我們排除了四個類及其字段:
我們的應(yīng)用程序通過反射查找這些類型和成員的名稱來引用它們。如果要重命名它們,應(yīng)用程序?qū)o法在運(yùn)行時(shí)找到它們。因此,我們將它們排除在通過這些復(fù)選框重命名之外。
有時(shí)候,您可能需要為特定的編碼約定做出許多特定的排除。即使這樣,當(dāng)開發(fā)人員添加更多遵循該約定的代碼時(shí),他們也必須記住對新代碼進(jìn)行另一個特定的排除。
對此的解決方案是自定義排除規(guī)則。使用前面的示例,假設(shè)我們計(jì)算出所有名稱以“Dungeon”結(jié)尾的類型,以及這些類型中的特定字段類型,都需要排除在重命名之外。與其創(chuàng)建一堆特定的排除,我們可以制定一個自定義規(guī)則:
我們使用Add Type按鈕添加了規(guī)則的根節(jié)點(diǎn),并將其命名為.*Dungeon,并將正則表達(dá)式(regex)選項(xiàng)設(shè)置為true,以指示應(yīng)該將該名稱視為正則表達(dá)式。因此,節(jié)點(diǎn)將匹配名稱以“Dungeon”結(jié)尾的類型。因?yàn)槲覀儗xclude類型(excludetype)設(shè)置為true,所以任何匹配此名稱的類型都將被排除在重命名之外。如果我們將該選項(xiàng)設(shè)置為false,那么匹配的類型將不會被排除在重命名之外——只包含由其子節(jié)點(diǎn)指定的成員。
然后,通過右鍵單擊根節(jié)點(diǎn)并選擇Add字段,我們添加了一個子節(jié)點(diǎn)。我們將這個節(jié)點(diǎn)命名為.*,并再次指出應(yīng)該將其視為正則表達(dá)式。我們將規(guī)則限制為只覆蓋具有公共訪問修飾符的字段(通過設(shè)置+public),以及簽名為string[]的字段,因?yàn)樵谖覀兊膱鼍爸羞@兩個字段都是必需的。
配置好規(guī)則后,您可以選擇一個節(jié)點(diǎn)并單擊Preview按鈕,Dotfuscator將在左側(cè)的樹視圖中突出顯示與定制規(guī)則匹配的條目。在我們的示例中,我們預(yù)覽子節(jié)點(diǎn),因此突出顯示匹配條件的字段。
內(nèi)置規(guī)則是自定義的排除規(guī)則,非常普遍有用;我們默認(rèn)包含它們,這樣用戶就不必重新實(shí)現(xiàn)它們。
例如,System.Web方法。服務(wù)屬性轉(zhuǎn)換為以下自定義規(guī)則:
Exclude all methods that are decorated with attributes from the System.Web.services namespace.
options選項(xiàng)卡上有許多重命名選項(xiàng),包括應(yīng)該使用什么重命名方案、是否引入顯式覆蓋以及其他許多選項(xiàng)。
— 持續(xù)更新中 —
如果你有任何問題或意見,可在下方評論區(qū)留言,點(diǎn)擊資源列表查看更多教程資源~
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn