首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xamarin混淆

Xamarin混淆
EN

Stack Overflow用户
提问于 2014-03-27 12:17:42
回答 2查看 5.8K关注 0票数 4

外面有什么东西可以混淆吗?我已经尝试过用于Android的Crypto混淆器,当我使用dex2jar解译时,我发现混淆程序和普通程序集没有区别。到目前为止,我已经浏览了以下链接:

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

用于Android的Mono,代码混淆

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-16 14:51:37

您在xamarin.com上引用了一篇论坛文章(“轻度混淆”)。在这里,现在我添加了一个关于如何与.NET的Xamarin和Babel混淆的解释。

我将在此重复一遍:

您不需要拥有完整的Visual就可以轻松和舒适地进行混淆。现在,我在(在Windows中)中使用了.NET的Babel。我没有试着让Babel在Mac上运行,也许这是可能的。

因此,这里我将解释如何在Xamarin Studio中混淆您的Android应用程序:

好的一点是,Xamarin使用了MSBuild机制,并且Babel可以集成到MSBuild过程中。

对我来说(安装Babel除外)只需要两个步骤:

(第1步)

使用文本编辑器编辑.csproj文件。Xamarin Studio不能运行。

代码语言:javascript
运行
复制
<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 (所以它是发行版)时,这个任务就会被应用。您可以指定一个xml文件,在该文件中可以为混淆过程定义细粒度规则。(例如排除某些类别等)

顺便提一句:经验法则是:将每个类、接口、委托或枚举定义为“内部”,而不是“公共”。默认情况下,必须在程序集之外可见的类型(公共类型)不会被混淆。默认情况下,内部类型将被混淆。我标记为"public“的唯一类是"MainActivity”。

(第2步)

当我开始第一次尝试我的应用程序时,我收到了以下错误消息:

代码语言:javascript
运行
复制
BABEL : error : Could not resolve assembly: 'Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065'

我首先无法理解这一点,因为Hello应用程序毫无问题地被混淆了。经过几个小时的研究,我发现了错误的原因。我的活动(我的游戏只有一个活动)具有以下属性:

代码语言:javascript
运行
复制
[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属性会导致问题。我意识到,当将该属性应用于带有“ILSpy”和"ConfigurationChanges“的C#活动类时,也会出现问题。所以我认为这不是巴别尔的问题,而是扎马林的问题。原因可能是,虽然"Label“和"MainLauncher”是基本类型(string和bool),但其他两种类型则不是。它们的类型是在Mono.Android.dll中定义的,这似乎是以一种错误的方式引用的。最好的情况是,如果Xamarin删除了编译后的dll的属性,因为它只用于生成步骤中的AndroidManifest.xml。

票数 5
EN

Stack Overflow用户

发布于 2016-11-01 14:55:55

Dotfuscator (在Visual中免费)或Dotfuscator (付费许可)混淆Xamarin应用程序:参见此处的保护Xamarin应用程序手册

使用Dotfuscator,混淆您的Xamarin应用程序的最一致和最安全的方法是将其集成到MSBuild管道中。这允许您使用标准构建工具混淆您的项目,并允许您使用Xamarin的内置调试器工作流测试您的混淆。为了让Xamarin正确处理模糊输出,应该将Dotfuscator的"Mono兼容“全局设置设置为"Yes”,并添加一个"controlflow.disabled_manglers“的项目属性,其值为"ILSpyBreaker”。

Xamarin的平台特定实用程序大量使用反射,因此建议将输入程序集从重命名中排除在外(同时仍然允许控制流混淆)。一旦成功,就可以在需要时启用重命名,并花时间确定应用程序所需的最小排除量。

然后,在每个Android或iOS csproj文件中,您应该添加一个对AfterBuild任务的引用和一个AfterBuild的目标,如下所示:

代码语言:javascript
运行
复制
<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配置项目,同时使构建过程句柄位于构建时的实际位置。

为了让Xamarin平台特定的构建过程能够正确地找到模糊化的程序集,必须在混淆后将它们复制回原来的组装位置。Android还有一个额外的限制,即原始的混淆PCL也必须复制回其特定的项目位置。要实现这一点,最简单的方法是在Dotfuscator项目中有一个构建后事件来执行复制:

添加"ObRelease“和/或"ObDebug”配置对于只有在明确需要和需要时才能混淆。这可以通过向csproj中的Dotfuscate元素添加一个条件属性来实现(例如: Condition=“‘$(配置)’== 'ObRelease‘")。请注意,当为Android添加新的"Release“配置时,需要在Packaging选项卡下的Android选项中禁用”使用共享运行时“和”启用开发人员检测“。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22687397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档