2016-07-29 91 views
0

我用一些用C#編寫的DLL測試了Dotfuscator。 它似乎在.NET環境下效果很好,所以這次我用Unity3D試了一下。這些簡單的DLL只是用簡單的標準C#類和方法進行編碼,沒有反射,沒有LINQ,沒有其他自定義或第三方API(包括Unity的)。但未能讓他們在我的Unity3d項目中工作,而未被模糊處理的原始純DLL工作正常。 經過幾個小時的掙扎後,我決定用新的簡單項目進行測試。下面是我在C#中獲得的所有內容,沒有其他代碼,根本沒有其他參考。Dotfuscator不支持Unity3d?

[System.Reflection.Obfuscation(Feature = "renaming", Exclude = true)] 
public class Class1 
{ 
    [System.Reflection.Obfuscation(Feature = "renaming", Exclude = true)] 
    public static int Get() 
    { 
     return 123; 
    } 
} 

把這個編譯成DLL之後,我把它放在Unity3D Editor的EMPTY項目中並播放,效果很好。但是,當我用Dotfuscator混淆DLL後再次嘗試時,它停止說「InvalidProgramException:Class1中的IL代碼無效:Get():IL_000c:pop」。

正如您在上面看到的,我添加了防止代碼被重命名的屬性,當然,我可以在Reflector中看到類和方法的名稱實際上未被重命名。

昨天我新註冊並從PreEmptive網站下載了最新的Dotfuscator專業版4.21.0評估版。我使用.NET 3.5編譯了Visual Studio 2008和2015,並嘗試了所有不同的解決方案平臺。 Unity的版本是5.3.4f1。

我現在的猜測是Dotfuscator只適用於MSIL,而不是Unity3D內部使用的Mono 2.X。

我對不對?有沒有人在Unity3D或Mono中使用Dotfuscator?

[編輯] 我使用ILDasm檢查IL代碼,不明白髮生了什麼,但有趣的是看到一堆代碼被修改。

前申請Dotfuscator的

.method public hidebysig static int32 Get() cil managed 
{ 
    .custom instance void [mscorlib]System.Reflection.ObfuscationAttribute::.ctor() = (01 00 02 00 54 0E 07 46 65 61 74 75 72 65 08 72 // ....T..Feature.r 
                         65 6E 61 6D 69 6E 67 54 02 07 45 78 63 6C 75 64 // enamingT..Exclud 
                         65 01)           // e. 
    // Code Size  6 (0x6) 
    .maxstack 8 
    IL_0000: ldc.i4  0x75bcd15 
    IL_0005: ret 
} // end of method Class1::Get 

應用Dotfuscator的

.method public hidebysig static int32 Get() cil managed 
{ 
    // Code Size  127 (0x7f) 
    .maxstack 2 
    .locals init (int32 V_0) 
    IL_0000: ldc.i4  0x993 
    IL_0005: stloc  V_0 
    IL_0009: ldloca  V_0 
    IL_000d: ldind.i4 
    IL_000e: ldc.i4  0x993 
    IL_0013: stloc  V_0 
    IL_0017: ldloca  V_0 
    IL_001b: ldind.i4 
    IL_001c: ceq 
    IL_001e: switch  ( 
         IL_002f, 
         IL_004c, 
         IL_002f) 
    IL_002f: br.s  IL_003e 
    IL_0031: ldc.i4.0 
    IL_0032: stloc  V_0 
    IL_0036: ldloca  V_0 
    IL_003a: ldind.i4 
    IL_003b: pop 
    IL_003c: br.s  IL_004a 
    IL_003e: ldc.i4.0 
    IL_003f: stloc  V_0 
    IL_0043: ldloca  V_0 
    IL_0047: ldind.i4 
    IL_0048: br.s  IL_003b 
    IL_004a: nop 
    IL_004b: nop 
    IL_004c: ldc.i4  0x1 
    IL_0051: stloc  V_0 
    IL_0055: ldloca  V_0 
    IL_0059: ldind.i4 
    IL_005a: br.s  IL_0068 
    IL_005c: ldc.i4.0 
    IL_005d: stloc  V_0 
    IL_0061: ldloca  V_0 
    IL_0065: ldind.i4 
    IL_0066: br.s  IL_0068 
    IL_0068: brfalse.s IL_006a 
    IL_006a: ldc.i4.0 
    IL_006b: stloc  V_0 
    IL_006f: ldloca  V_0 
    IL_0073: ldind.i4 
    IL_0074: brfalse IL_0079 
    IL_0079: ldc.i4  0x75bcd15 
    IL_007e: ret 
} // end of method Class1::Get 
+0

你有沒有嘗試在MonoDevelop(與Unity合作)中創建新的Mono 2項目,並測試你的DLL?如果它能工作,問題在於Unity,如果不是的話,問題在於Mono和/或Mono版本統一使用。 –

+0

@JerrySwitalski謝謝。正如你所說,我認爲這是值得嘗試的,當我回到家時會檢查它:)順便說一下,單聲道2.X版本現在可用? Unity使用老版本的Mono,所以如果不是這樣的話,它可能會有所不同。 – Jenix

回答

4

是後,Dotfuscator的專業版支持單聲道和統一。您在IL中看到差異的原因是由專業版提供的模糊處理造成的控制流程。這與您從中排除標識符的重命名功能不同。

默認情況下,Dotfuscator使用盡可能多的控制流轉換,因爲它可以在.NET Framework上使用(即Microsoft的實現)。 但是,其中一些轉換與Mono不兼容。 Dotfuscator提供了一個選項來禁用這種轉換。

在GUI中加載Dotfuscator項目後,可以在「高級」下的「設置」選項卡上找到該選項,名爲「僅使用單一兼容轉換」。將此選項設置爲「是」,然後保存並重建項目。

Dotfuscator Professional Edition - Settings Tab, "Use only Mono-compatible transforms" enabled and highlighted

如果這仍然是給你的問題,你可以禁用控制流完全,看看是否能解決問題。這也在「設置」選項卡的「功能」,「禁用控制流」下。將此選項設置爲「是」,然後保存並重建項目。

完全披露:我在PreEmptive Solutions的Dotfuscator團隊工作。如果您有更多問題,請記住像您這樣的評估用戶也可以完全訪問PreEmptive支持

+0

我問過PreEmptive支持團隊之後就問這裏。我不得不在這裏添加這個stackoverflow鏈接,因爲在網站上的一個小盒子裏寫上所有的代碼是很困難的。令我失望的是,他甚至沒有查看我要求查看的這一頁。此外,他/她只寫了四個簡短的句子,只是說他/她不確定爲什麼我不能工作,因爲它應該支持Unity3d。但無論如何,來自同一個團隊的答案拯救了我的一天,感謝一百萬,喬。 – Jenix

+0

非常感謝!我剛剛測試並解決了問題。最重要的是,當我打開「Suppress Ildasm」選項時,它阻止ILDasm完美地打開文件!非常令人印象深刻,是有史以來最好的混淆器。非常喜歡! – Jenix

+0

對不起,但我可以問兩個更快的問題嗎? 1.「Suppress Ildasm」選項是否會影響性能? 2.有沒有關於如何使用Unity3d的教程? – Jenix