.jpg)
Dotfuscator 在重新命名方法方面,採用了稱為 Overload-Induction™ (多載誘發) 專利技術,鑑於大部分重新命名系統都只是對每一個舊名稱指派一個新名稱 (例如 "getX()" 會成為 "a()"、"getY()" 會成為 "b()"),Overload-Induction 則是盡最大可能誘發方法多載。它的基礎概念是,這個演算法會盡可能將許多方法重新命名成完全相同的名稱,許多客戶回報,所有方法中有整整 33% 被重新命名為 "a()"。在這些案例中,也就是有整整 15% 可重新命名的方法!這裡強調「可重新命名」,是因為許多方法原本就無法重新命名,包括建構函式、「類別建構函式」,以及要在 Runtime 時呼叫的方法。
經過這種深層模糊化之後,邏輯雖然多載誘發技術的威力沒有被破壞,卻已遠非人們所能夠理解了。下面這個簡單的範例能夠讓您稍微體驗一下:
| 原來的原始程式碼在進行模糊化之前的樣子 |
|---|
|
| 以 Dotfuscator 進行多載誘發處理之後再進行反向工程的原始程式碼 |
|---|
|
本範例在說明模糊化的程式碼會變得更為簡潔。重新命名的一項正面副作用,就是會縮減大小,例如,假設某個名稱的長度為 20 個字元,將它重新命名為 a() 之後就可以省下許多空間 (明確的說,就是少了 19 個字元)。而且,這樣也會經由節省字串堆積 (Heap) 項目而省下許多空間。將所有項目都重新命名為 "a" 表示 "a" 只會儲存一次,而且重新命名為 "a" 的每一個方法或欄位都可以指向它。多載誘發更加增強了這種效果,因為這些極短的識別項會一再重複使用。
這種方法有幾項明顯的優點:
- 重新命名長期以來一直是讓反編譯後的輸出變得更難以瞭解的一種方式,重新命名成為無法列印的字元 (或成為在目標來源語言中不合法的名稱) 可能會徒勞無功,因為反編譯器也同樣可具備重新「重新命名」這類識別項的能力,只要想像 Overload-Induction 能讓三分之一的方法名稱成為 "
a()",就會瞭解反編譯的輸出比較困難。 - 在其他所有重新命名系統中沒有的限制 (這類限制會在稍後討論),在 Overload-Induction也不會有。
- 由於 Overload-Induction 傾向經常使用同樣的字母,所以比較不容易用到比較長的名稱 (例如,
aa、aaa等),這樣也可以節省空間。
Overload-Induction 的專利演算法會判斷所有可能的重新命名衝突,而且只會在安全的情況下誘發方法多載,這個程序可能是無法倒置的,換句話說,不可能重新建構原來的方法名稱關聯性 (即使再次執行 Overload-Induction 也一樣)。
© 2002-2007 PreEmptive Solutions. All rights reserved.