Xamarin 混淆
Posted
技术标签:
【中文标题】Xamarin 混淆【英文标题】:Xamarin obfuscation 【发布时间】:2014-05-06 09:55:33 【问题描述】:有什么可以混淆的吗?我已经尝试过适用于 android 的 Crypto Obfuscator,当我使用 dex2jar 反编译时,我发现混淆和普通程序集之间没有区别。到目前为止,我已经浏览了以下链接:
http://forums.xamarin.com/discussion/14962/light-obfuscation
Mono for Android, code obfuscation
【问题讨论】:
我过去曾在基于 C# 的项目中使用过 Spices.net,它做得很好。我从未尝试将它与 Xamarin 项目一起使用,但它也可以工作。 Obfuscation in Xamarin Projects的可能重复 【参考方案1】:您引用了 xamarin.com 上的论坛帖子(“Light Obfuscation”)。在那里,现在我添加了关于如何使用 Xamarin Studio 和 Babel for .NET 进行混淆的说明。
我在这里重复一遍:
您无需拥有完整的 Visual Studio 即可获得一种简单舒适的混淆方式。我现在将 Babel for .NET 与 Xamarin Studio(在 Windows 中)一起使用。我没有尝试让 Babel 在 Mac 上运行,也许这是可能的。
所以,在这里我将解释如何在 Xamarin Studio 中混淆您的 Android 应用:
好在 Xamarin Studio 使用了 MSBuild 机制,Babel 可以集成到一个 MSBuild 进程中。
对我来说(除了安装 Babel)只需要两个步骤:
(步骤 1)
使用文本编辑器编辑您的 .csproj 文件。 Xamarin Studio 不得运行。
<Project>
[... All existing stuff ...]
<UsingTask TaskName="Babel" AssemblyName="Babel.Build, Version=6.4.0.0, Culture=neutral, PublicKeyToken=138d17b5bd621ab7" />
<Target Name="AfterBuild" Condition=" '$(Configuration)' != 'Debug' ">
<Babel InputFile="$(TargetPath)" OutputFile="$(TargetPath)" GenerateDebug="true"
[...]
RulesFiles="babel.xml"
SuppressIldasm="false" ObfuscateTypes="true" ObfuscateProperties="true" ObfuscateEvents="true" ObfuscateMethods="true"
ObfuscateFields="true" VirtualFunctions="true" FlattenNamespaces="false"
StringEncryption="true"
/>
</Target>
</Project>
每当您构建应用并且构建模式不是 Debug(所以它是 Release)时,就会应用此任务。您可以指定一个 xml 文件,您可以在其中为混淆过程定义细粒度的规则。 (例如排除某些类等)
顺便说一句:经验法则是:将每个类、接口、委托或枚举定义为“内部”,而不是“公共”。默认情况下,必须在程序集之外可见的类型(公共类型)不会被混淆。默认情况下,内部类型将被混淆。我标记为“public”的唯一类是“MainActivity”。
(步骤 2)
当我开始第一次尝试我的应用时,我收到了以下错误消息:
BABEL : error : Could not resolve assembly: 'Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065'
首先我无法理解,因为 Hello-World Android 应用程序被混淆而没有问题。经过几个小时的研究,我找到了错误的原因。我的活动(我的游戏只有一个活动)具有以下属性:
[Activity(
Label = "The name of my game",
MainLauncher = true,
WindowSoftInputMode = SoftInput.AdjustPan,
ConfigurationChanges = ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden | ConfigChanges.Orientation | ConfigChanges.ScreenSize
)]
“标签”和“MainLauncher”原来不是问题。但是“WindowSoftInputMode”和“ConfigurationChanges”是问题所在。
为了修复它,我从 .cs 文件中完全删除了 [Activity (...)] 属性,并手动将必要的信息添加到 AndroidManifest.xml 中。这样,混淆工作没有问题。
您可能想知道为什么 Activity 属性会导致问题。我意识到,当将此属性应用于具有“WindowSOftInputMode”和“ConfigurationChanges”的 C# Activity 类时,ILSpy 也存在问题。所以我认为这不是 Babel 的问题,而是 Xamarin 的问题。原因可能是,虽然“Label”和“MainLauncher”是基本类型(字符串和布尔),但其他两个不是。它们的类型在 Mono.Android.dll 中定义,似乎以错误的方式引用。最好的办法是 Xamarin 删除已编译 dll 的属性,因为它仅用于在构建步骤中制作 AndroidManifest.xml。
【讨论】:
【参考方案2】:Dotfuscator CE(Visual Studio 中免费)或 Dotfuscator PRO(付费许可证)混淆 Xamarin 应用程序: 请参阅此处的 Xamarin 手册:Protecting Xamarin Apps
使用 Dotfuscator,混淆 Xamarin 应用程序的最一致和安全的方法是将其集成到 MSBuild 管道中。这允许您使用标准构建工具对项目进行混淆,并允许您使用 Xamarin 的内置调试器工作流测试您的混淆。为了让 Xamarin 正确处理混淆输出,Dotfuscator 的“单声道兼容”全局设置应设置为“是”,并应添加值为“ILSpyBreaker”的“controlflow.disabled_manglers”项目属性。
Xamarin 的平台特定实用程序大量使用反射,因此建议从重命名中简单地排除输入程序集(同时仍允许控制流混淆)作为起点。一旦这样做了,您就可以根据需要启用重命名,并花时间确定您的应用程序所需的最少排除项。
然后,您应该在每个 Android 或 ios csproj 文件中添加对 Dotfuscate 任务的引用和 AfterBuild 的目标,如下所示:
<UsingTask TaskName="PreEmptive.Tasks.Dotfuscate" AssemblyFile="$(MSBuildExtensionsPath)\PreEmptive\Dotfuscator\4\PreEmptive.Dotfuscator.Tasks.dll" />
////SNIP////
<Target Name="AfterBuild">
<PropertyGroup>
<DotfuscatorProperties>
<OutDir>$(OutDir)</OutDir>
<OutputPath>$(OutputPath)</OutputPath>
</DotfuscatorProperties>
</PropertyGroup>
<Dotfuscate ConfigPath="Obfuscate.Android.xml" Properties="$(DotfuscatorProperties)"/>
</Target>
请注意,我们将某些属性从构建过程传递到 Dotfuscator 过程。特别是 OutDir 和 OutPath。通过使用具有默认值的项目属性,我们可以在 Dotfuscator 项目文件中指定路径,以允许我们使用独立的 Dotfuscator UI 配置项目,同时让构建过程在构建时处理它们的实际位置。
为了让 Xamarin 平台特定的构建过程能够正确找到经过混淆的程序集,必须在混淆后将它们复制回原始程序集位置。 Android 有一个额外的限制,即原始的混淆 PCL 也必须复制回其项目特定位置。完成此操作的最简单方法是在 Dotfuscator 项目中使用构建后事件来进行复制:
添加“ObRelease”和/或“ObDebug”配置可能有助于仅在明确需要和需要时进行混淆。这可以通过向 csproj 中的 Dotfuscate 元素添加 Condition 属性来完成(例如:Condition="'$(Configuration)' == 'ObRelease'")。请注意,在为 Android 添加新的“发布”配置时,需要在“打包”选项卡下的 Android 选项中禁用“使用共享运行时”和“启用开发人员工具”。
完成这些步骤后,您应该能够在 Visual Studio 或 Xamarin Studio 中的构建期间看到 Dotfuscator 的构建输出。
【讨论】:
这是一个质量很差的答案,因为您的两个帮助点都依赖于未来几个月可能无法使用的网络链接。请考虑从这些网站中提取有用信息并编辑您的答案以包含该信息。将链接作为附加信息包含在内是可以的,但是让它们成为您答案的核心并不是......一旦您有足够的代表,只有链接的答案可以简单地添加为 cmets。 谢谢尼尔。我会做出改变。以上是关于Xamarin 混淆的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Dotfuscator 混淆 Xamarin.Android 应用程序的公共成员?
Xamarin.Forms 是 Xamarin.Android、Xamarin.IoS 和 Xamarin.Win 的简单总和吗?