2011-09-15 104 views
7

我想混淆我的彙編文件(* .dll,* .exe)Dotfuscator。我的問題是如果我這樣做,我仍然可以使用它們的原始名稱(我是指混淆之前的名稱)在這些程序集中的類和類型,並使用System.Reflection方法來處理它們嗎?混淆彙編和反射

如果您需要更詳細,請告訴我

回答

8

混淆是反射會導致你一些問題。即使您採取建議以使用選項不混淆公共方法,一些反映的代碼可能會調用私有方法。問題在於混淆會改變您可能需要保持不變的某些代碼的名稱。

如果你知道或能找到易於與反射使用的地區可以使用

[global::System.Reflection.Obfuscation(Exclude=true, Feature="renaming")] 

這將告訴混淆保持名稱。

與反思運行混淆需要更多的測試,這是肯定的,但仍然有可能...

1

您可以在混淆集中使用System.Reflection,但由於一些模糊的點是在裝配一切重命名爲隨機的,毫無意義的事情,你不能在非混淆的程序集中對相同的名稱和標識符進行反射。如果你想對混淆程序集進行反射,你需要以不依賴於什麼類型和成員命名的方式來進行反射。

+1

通常公衆成員不會混淆工作(或至少有一個選項不會模糊公衆成員) – xanatos

+0

@asbjornu - 是否有任何方法反思和避免使用成員名稱? – amirhosseinab

+0

解決方案(或不)會創建一個靜態類,它具有一個System.Type字典,然後當您需要使用反射時,從此字典中獲取該類型。所以不管你在obsfucator之後的方法/類是哪個名字,你仍然有這個參考。當然,如果你的程序集中有不可數的類型,那麼最終會出現一個沒有任何設計模式靜態類的巨人,這可能會導致應用程序中的性能問題以及未處理的異常。 –

0

您可以創建自己的私人地圖,擺脫舊的新名稱。 映射器必須寫一種磁盤/分貝與以下結構的表: 模塊(可執行程序),索引,OriginalType,ObfuscatedType

創建基於參數兩種模式操作「映射器」控制檯應用程序: 應用將獲得作爲參數的可執行文件路徑

  1. 加載組件
  2. GetTypes從loadedAssembly
  3. PreObfuscation刪除所有條目,並重新寫入索引和OriginalType值。 PostObfuscation按索引更新ObfuscatedType。 後生成的事件必須如下:
    1. Mapper.exe 「target.exe」 「預」
    2. [模糊處理]
    3. Mapper.exe 「target.exe」 「郵報」

現在你需要一個函數來從原始名稱getObfuscatedName,你就完成了。

注意,該解決方案將不會修剪爲類型的數量會發生變化,指標不再匹配

之間
OriginalAssembly.GetTypes() 

ObfuscatedAssembly.GetTypes()