繁体   English   中英

Xamarin混淆

[英]Xamarin obfuscation

那里有什么东西可以混淆吗? 我尝试过用于Android的Crypto Obfuscator,当我使用dex2jar解编译时,我发现混淆和正常汇编之间没有区别。 到目前为止,我已经通过以下链接:

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

单声道Android版,代码混淆

您参考了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文件,您可以在其中为混淆过程定义细粒度规则。 (例如,排除某些类别等)

顺便说一句:经验法则是:将每个类,接口,委托或枚举定义为“内部”,而不是“公共”。 默认情况下,组件外部必须可见的类型(公共类型)不会被混淆。 默认情况下,内部类型将被混淆。 我标记为“公共”的唯一类是“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”和“MainLauncher”不是问题所在。 但是“WindowSoftInputMode”和“ConfigurationChanges”是问题所在。

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

您可能想知道为什么Activity属性导致了问题。 我意识到当使用“WindowSOftInputMode”和“ConfigurationChanges”将此属性应用于C#Activity类时,ILSpy也遇到了问题。 所以我认为这不是巴别塔的问题,而是Xamarin的问题。 原因可能是,虽然“Label”和“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”,并且应添加值为“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”配置对于仅在明确需要和需要时进行模糊处理非常有用。 这可以通过将一个Condition属性添加到csproj中的Dotfuscate元素来实现(例如:Condition =“'$(Configuration)'=='ObRelease'”)。 请注意,在为Android添加新的“发布”配置时,需要在“打包”选项卡下的“Android选项”中禁用“使用共享运行时”和“启用开发人员工具”。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM