.NET混淆器 Dotfuscator保護機制——重命名

Dotfuscator是一個.NET的Obfuscator。它提供企業級的應用程序保護,大大下降了盜版、知識產權盜竊和篡改的風險。Dotfuscator的分層混淆、加密、水印、自動失效、防調試、防篡改、報警和防護技術,爲世界各地成千上萬的應用程序提供保護。正則表達式

Dotfuscator提供了一種應用程序保護的多層方法。這些層中的每一層都提供了一個重要的總體保護策略。若是一層受到損害,其餘層繼續提供有效保護,使攻擊者更難以實現其目標。而且不只有多個層,並且每一個層都具備比其餘混淆產品使用的簡單技術更強大的高級功能。算法

從本文開始咱們一塊兒瞭解Dotfuscator如何對應用程序進行多層保護,層層遞進,大體可分爲:c#

  • 第一層保護——Obfuscation轉換:它對編譯的代碼進行操做,使逆向工程變得困難或不可能。
  • 第二層保護——保護程序運行時發生的檢查:當程序檢測到攻擊者試圖篡改或反向工程時,它可使用自定義邏輯進行自我防護。
  • 其他增強保護——包括切除和水印。
  • Dotfuscator提供某些功能幫您構建、部署和調試混淆的程序集

下載Dotfuscator最新試用版安全


第一層保護:Obfuscation轉換

重命名

Dotfuscator可以將全部類、方法和字段重命名爲短名稱。這使得反編譯輸出更加難以理解,而且使得生成的可執行文件的大小更小。測試

大多數商業混淆器使用一種重命名技術,該技術應用的普通標識符能夠短至單個字符。當obfuscator處理代碼時,它選擇下一個可用的平凡標識符進行替換。這個看似簡單的重命名方案有一個關鍵屬性:它是不可逆轉的。在保留程序邏輯的同時,這些名稱變得毫無心義,阻礙了全部理解代碼的嘗試。ui

▲過載感應編碼

Dotfuscator使用了一種更深層次的混淆技術,它是爲Dotfuscator開發的,並經過先發制人的解決方案得到了專利,稱爲過載感應™。重載概括不是爲每一箇舊名稱替換一個新名稱,而是將盡量多的方法重命名爲相同的名稱。下面的簡單例子說明了過載感應技術的威力:加密

混淆以前的原始源代碼:spa

private void CalcPayroll(SpecialList employeeGroup) {
   while (employeeGroup.HasMore()) {
        employee = employeeGroup.GetNext(true);
        employee.UpdateSalary();
        DistributeCheck(employee);
    }
}

重載感應混淆後的反向工程源代碼:3d

private void a(a b) {
    while (b.a()) {
        a = b.a(true);
        a.a();
        a(a);
    }
}

實例代表,代碼被混淆和壓縮,這是重命名的一個積極的反作用。經過保存字符串堆條目,重命名還能夠節省空間。這種方法有着明顯的優勢在於:

  • 重命名使反編譯輸出難以理解。在目標源語言中重命名不可打印字符或非法名稱是無效的,由於反編譯器能夠重命名這些標識符。考慮到重載誘導可能使三個方法名中的一個成爲「a()」,理解反編譯輸出是困難的。
  • 除了存在於全部重命名系統中的限制外,超載誘導沒有其餘限制。
  • 因爲過載誘導每每更頻繁地使用相同的字母,因此它進入較長名稱的速度更慢(例如aa、aaa等),這也節省了空間。

Overload-Induction的專利算法肯定全部可能的重命名衝突,只有在安全的狀況下才會引起方法重載。這個過程能夠證實是不可逆的。換句話說,重構原始方法名稱關係是不可能的(即便再次運行重載誘導)。

▲加強的過載感應

Dotfuscator還經過容許將方法的返回類型或字段的類型用做肯定方法或字段惟一性的標準,從而加強了超載誘導™。該特性容許在方法和字段重命名中最多增長15%的冗餘。此外,因爲在源語言(包括c#和Visual Basic)中一般不容許重載方法返回類型或字段類型,這進一步阻礙了反編譯器。

▲限制

一般不會對包含任何XAML代碼的程序集執行過載誘導,由於運行時肯定XAML和代碼如何連接的方式不一樣。所以,Use Enhanced Overload Induction選項不會更改此類程序集的任何內容。當使用任何類型的反射(包括XAML)、指定入口點的配置文件、其餘應用程序調用的庫等時,重命名可能會出現問題。在重命名後對應用程序進行全面測試,以確保不存在此類問題,這一點很是重要。

▲具體排除

假定庫模式已關閉,Dotfuscator將嘗試重命名它所能重命名的全部內容。反射的某些使用可能致使Dotfuscator在重命名時不更新對特定實體的全部引用。在下面的例子中,咱們排除了四個類及其字段:

 

renaming_specific_exclusions.png

 

咱們的應用程序經過反射查找這些類型和成員的名稱來引用它們。若是要重命名它們,應用程序將沒法在運行時找到它們。所以,咱們將它們排除在經過這些複選框重命名以外。

▲自定義排除規則

有時候,您可能須要爲特定的編碼約定作出許多特定的排除。即便這樣,當開發人員添加更多遵循該約定的代碼時,他們也必須記住對新代碼進行另外一個特定的排除。

對此的解決方案是自定義排除規則。使用前面的示例,假設咱們計算出全部名稱以「Dungeon」結尾的類型,以及這些類型中的特定字段類型,都須要排除在重命名以外。與其建立一堆特定的排除,咱們能夠制定一個自定義規則:

 

renaming_custom_exclusion_rule.png

 

咱們使用Add Type按鈕添加了規則的根節點,並將其命名爲.*Dungeon,並將正則表達式(regex)選項設置爲true,以指示應該將該名稱視爲正則表達式。所以,節點將匹配名稱以「Dungeon」結尾的類型。由於咱們將Exclude類型(excludetype)設置爲true,因此任何匹配此名稱的類型都將被排除在重命名以外。若是咱們將該選項設置爲false,那麼匹配的類型將不會被排除在重命名以外——只包含由其子節點指定的成員。

而後,經過右鍵單擊根節點並選擇Add字段,咱們添加了一個子節點。咱們將這個節點命名爲.*,並再次指出應該將其視爲正則表達式。咱們將規則限制爲只覆蓋具備公共訪問修飾符的字段(經過設置+public),以及簽名爲string[]的字段,由於在咱們的場景中這兩個字段都是必需的。

配置好規則後,您能夠選擇一個節點並單擊Preview按鈕,Dotfuscator將在左側的樹視圖中突出顯示與定製規則匹配的條目。在咱們的示例中,咱們預覽子節點,所以突出顯示匹配條件的字段。

▲內置規則

內置規則是自定義的排除規則,很是廣泛有用;咱們默認包含它們,這樣用戶就沒必要從新實現它們。

 

renaming_built_in_rules.png

 

例如,System.Web方法。服務屬性轉換爲如下自定義規則:

Exclude all methods that are decorated with attributes from the System.Web.services namespace.

▲選項

options選項卡上有許多重命名選項,包括應該使用什麼重命名方案、是否引入顯式覆蓋以及其餘許多選項。

 

—  持續更新中  —


若是你有任何問題或意見,可在下方評論區留言,點擊資源列表查看更多教程資源~

相關文章
相關標籤/搜索