2011-04-14 37 views
0

我正在研究一個C#混淆程序,我想知道是否有方法名稱「硬連線」到框架中,因此不應該被修改。想到的是.ctor,.cctor和Dispose。還有其他我應該避免修改嗎?哪些C#方法名稱不應該被混淆?

編輯: 爲了闡述和啓發Paul Alexander(感謝您的回答),我通過修改IL源代碼來實現這一點。下面是一些典型發言。方法(?):

.method family hidebysig virtual instance void 
      Dispose(bool disposing) cil managed 

    .method private hidebysig instance void 
      InitializeComponent() cil managed 

    .method public hidebysig specialname rtspecialname 
      instance void .ctor(class [mscorlib]System.Collections.Generic.List`1<string> twoLetterWords) cil managed 

    .method private hidebysig static string[] 
      CreateStringArray() cil managed 

我可以看到,構造函數(.ctor)具有「rtspecialname」選項,處置有一個「家」的選項。這是我應該尋找的東西嗎?

回答

1

對某個方法的元數據包含了「特別的名字」標誌上的方法是不能被重命名,你可以作爲一個使用基本的啓發式。但要準確確定方法的合格性,您必須遍歷整個繼承樹,會計基類,接口,屬性字符串引用的方法/屬性等。

+0

感謝您的回答。請參閱我的編輯。 – RenniePet 2011-04-14 23:21:10

+0

所有的答案都很有用,但我選擇這個作爲最有洞察力的答案,以及Paul Alexander關於get_和set_的另一個答案的評論。感謝所有回答。 – RenniePet 2011-04-22 23:51:27

2

您絕對應該避免修改公共課程中的任何公共方法。同時避免修改屬性獲取器和設置器(get_XXXset_XXX方法)。

+0

好點的就get_xxx和set_xxx,感謝開發者。至於公共類中的公共方法名稱,我打算修改它們 - 然後在處理來自其他類和程序集的引用時考慮到這一點。任何其他方法名稱應該單獨保留? – RenniePet 2011-04-14 23:05:48

+0

get_XXX和set_XXX實際上是安全的混淆。即使在混淆時,.NET運行庫也可以解析屬性的方法 - 即使在使用反射時也是如此。 – 2011-04-14 23:06:00

2

不要混淆與序列化有關的任何事情,除非通過屬性明確聲明名稱;甚至還要小心 - 一些序列化器在元數據中包含了類型名稱(可能不會長時間匹配)。

小心基於會議的方法;例如ShouldSerializeFoo()ResetFoo()(與屬性Foo配對) - 這些約定在串行器和ComponentModel中都很常見。對於某些序列化程序也有一個FooHasValue約定。

,那就是要使用反射很可能是註定的事情......,P

1

有關通過反射使用的方法/類的更多信息:注意框架或使用反射來指定應用程序類型和方法。即在ASP.Net用於處理請求的MVC類是按名稱選取的,在SharePoint中很多第三方類都是通過名稱引用的,因爲結果不應該在彙編中混淆特定的類名以用於此類應用程序。

我會採用其他混淆器正在使用的自定義屬性來控制混淆並將不應該被混淆的類/方法的外部可配置列表分開。在一般情況下,無法正確猜測哪些方法可以並且不能被混淆。即混淆公共方法名稱是可能的,只有當你知道所有的呼叫者 - 並非總是如此。

+0

感謝您的回答。 「只有當你知道所有的調用者時,纔可能混淆公共方法名稱」 - 我確實知道所有的調用者 - 這是我自己的程序,我可以完全控制它的所有部分,即使它是一個多裝配程序。 – RenniePet 2011-04-14 23:24:50

1

有許多標準應該被用來確定何時方法不應當重命名:

  • 方法overridding從.NET基類庫虛擬方法。
  • ctor和cctor
  • 標記爲specialName和rtSpecialName和runtime的方法。

和一些更喜歡如果混淆一個dll解析公共方法。

順便說一句,我很好奇你是否在做這個學習經驗或爲你自己使用。如果是後者,我會告訴你最好使用商業混淆器,而不是花時間在這個上(而不是專注於你的核心功能!)。

聲明:我在LogicNP軟件工作,Crypto Obfuscator

+0

「如果是後者,我會告訴你,最好使用商業混淆器,而不是花時間在這個上」 - 什麼?並錯過了所有這些樂趣?順便說一句,謝謝你的回答。 – RenniePet 2011-04-15 22:58:47