Dotfuscator不支持Unity3d?

时间:2016-07-29 08:13:09

标签: c# unity3d mono obfuscation dotfuscator

我用一些用C#编写的DLL测试了Dotfuscator。 它似乎在.NET环境中运行得很好,所以这次我用Unity3D尝试了它们。这些简单的DLL只是用简单的标准C#类和方法编写,没有反射,没有LINQ,没有其他自定义或第三方API,包括Unity。但是未能使它们在我的Unity3d项目中工作,而原始的纯粹的DLL没有被混淆的工作正常。 经过几个小时的努力,我决定尝试新的简单项目。以下是我在C#中获得的所有内容,没有其他代码,根本没有其他参考。

[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编辑器上的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.

我是对的吗?是否有人使用Dotfuscator与Unity3D或Mono很好?

[编辑] 我使用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

1 个答案:

答案 0 :(得分:4)

是的,Dotfuscator Professional Edition支持Mono和Unity。您在IL中看到差异的原因是由于Professional Edition提供的控制流模糊处理。这与您已从中排除标识符的重命名功能不同。

默认情况下,Dotfuscator使用尽可能多的控制流转换,因为它可以在.NET Framework上实现(即Microsoft的实现)。 但是,其中一些转换与Mono不兼容。 Dotfuscator提供禁用此类转换的选项。

在GUI中加载Dotfuscator项目后,可以在“高级”下的“设置”选项卡上找到此选项,名为“仅使用与Mono兼容的转换”。将此选项设置为“是”,然后保存并重建项目。

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

如果仍然存在问题,可以完全禁用“控制流”以查看是否可以解决问题。这也位于“设置”选项卡上的“功能”,“禁用控制流”下。将此选项设置为“是”,然后保存并重建项目。

完全披露:我在PreEmptive Solutions的Dotfuscator团队工作。如果您有更多问题,请记住,像您这样的评估用户也可以完全访问PreEmptive支持