Xamarin obfuscation

本文关键字:obfuscation Xamarin | 更新日期: 2023-09-27 17:54:30

有什么东西可以混淆吗?我已经尝试过Android的Crypto Obfuscator,当我使用dex2jar进行反编译时,我看到混淆和正常汇编之间没有区别。到目前为止,我已经浏览了以下链接:

http://forums.xamarin.com/discussion/14962/light-obfuscation

Mono for Android,代码混淆

Xamarin obfuscation

你提到了xamarin.com上的论坛帖子("Light obfusation ")。现在,我已经添加了一个关于如何混淆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>

每当你构建你的应用程序和构建模式不是调试(所以它是发布),这个任务被应用。您可以指定一个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
)]

"Label"answers"MainLauncher"不是问题所在。但是"WindowSoftInputMode"answers"ConfigurationChanges"是问题所在。

为了修复它,我完全从。cs文件中删除了[Activity(…)]属性,并手动添加了必要的信息到AndroidManifest.xml。这样,混淆工作没有问题。

您可能想知道为什么Activity属性会导致问题。我意识到ILSpy也有一个问题,当这个属性被应用到c#活动类与"WindowSOftInputMode"answers"ConfigurationChanges"。所以我认为这不是巴别塔的问题,而是沙玛林的问题。原因可能是,虽然"Label"answers"MainLauncher"是基本类型(字符串和bool),但其他两个不是。它们的类型在Mono.Android.dll中定义,似乎以错误的方式引用。最好的事情是如果Xamarin删除了编译dll的属性,因为它只用于在构建步骤中制作AndroidManifest.xml。

Dotfuscator CE(在Visual Studio中免费)或Dotfuscator PRO(付费许可)混淆Xamarin应用程序:查看Xamarin手册:保护Xamarin应用

使用Dotfuscator,混淆Xamarin应用程序的最一致和最安全的方法是将其集成到MSBuild管道中。这允许您使用标准的构建工具混淆您的项目,并允许您使用Xamarin的内置调试器工作流测试您的混淆。为了让Xamarin正确处理模糊输出,Dotfuscator的"Mono Compatible"全局设置应该设置为"Yes",项目属性应该设置为"controlflow"。应添加值为"ILSpyBreaker"的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选项中禁用"使用共享运行时"answers"启用开发人员工具"。

完成这些步骤后,您应该能够在Visual Studio或Xamarin Studio中看到Dotfuscator的构建输出。