Xamarin混淆

Jay*_*aty 4 c# mono android xamarin

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

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

单声道Android版,代码混淆

eik*_*kuh 5

您参考了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>
Run Code Online (Sandbox Code Playgroud)

每当您构建应用程序并且构建模式不是Debug(因此它是Release)时,将应用此任务.您可以指定一个xml文件,您可以在其中为混淆过程定义细粒度规则.(例如,排除某些类别等)

顺便说一句:经验法则是:将每个类,接口,委托或枚举定义为"内部",而不是"公共".默认情况下,组件外部必须可见的类型(公共类型)不会被混淆.默认情况下,内部类型将被混淆.我标记为"公共"的唯一类是"MainActivity".

(第2步)

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

BABEL : error : Could not resolve assembly: 'Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065'
Run Code Online (Sandbox Code Playgroud)

我首先无法理解,因为一个Hello-World Android应用程序被混淆了没有问题.经过几个小时的研究,我找到了错误的原因.我的活动(我的游戏只有一个活动)具有以下属性:

[Activity(
    Label = "The name of my game", 
    MainLauncher = true, 
    WindowSoftInputMode = SoftInput.AdjustPan,
    ConfigurationChanges = ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden | ConfigChanges.Orientation | ConfigChanges.ScreenSize
)]
Run Code Online (Sandbox Code Playgroud)

原因是"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.