我用一些用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
答案 0 :(得分:4)
是的,Dotfuscator Professional Edition支持Mono和Unity。您在IL中看到差异的原因是由于Professional Edition提供的控制流模糊处理。这与您已从中排除标识符的重命名功能不同。
默认情况下,Dotfuscator使用尽可能多的控制流转换,因为它可以在.NET Framework上实现(即Microsoft的实现)。 但是,其中一些转换与Mono不兼容。 Dotfuscator提供禁用此类转换的选项。
在GUI中加载Dotfuscator项目后,可以在“高级”下的“设置”选项卡上找到此选项,名为“仅使用与Mono兼容的转换”。将此选项设置为“是”,然后保存并重建项目。
如果仍然存在问题,可以完全禁用“控制流”以查看是否可以解决问题。这也位于“设置”选项卡上的“功能”,“禁用控制流”下。将此选项设置为“是”,然后保存并重建项目。
完全披露:我在PreEmptive Solutions的Dotfuscator团队工作。如果您有更多问题,请记住,像您这样的评估用户也可以完全访问PreEmptive支持。