如何使用 Xamarin Android APK 的 .Net Reactor 混淆 dll

How to use .Net Reactor obfuscated dll of Xamarin Android APK

我是 Xamarin 的新手 Android。我使用 Visual Studio 2015 Community Edition 创建了一个应用程序。我已将解决方案配置设置为发布。

为了混淆,我使用了 .Net Reactor。

这就是我试图混淆的方式

1:构建应用程序后,我将转到 Bin\Release 文件夹

2:混淆 App.dll

3:在Bin\Release、Obj\Release和Obj\Release\assemblies

中用混淆后的dll替换原来的dll

4:转到工具->Android->发布

然而,当我尝试发布混淆后的 dll 时,将被原始 dll 替换。

所以我做错了什么?我必须手动打包apk文件吗?如果是这样我该怎么办?

1) 发布未混淆的应用程序.apk,重命名为.zip。

2) 从文件夹“assemblies”中将文件 Mono.Android.dll 移动到文件夹 YourProjectName\bin\Release.

3) 创建一个新的 .NET Reactor 项目,设置正确的设置(取消选中 Anti ILDASM,混淆过程也会重命名反射或序列化中使用的字段。要避免应用程序崩溃,应设置排除项以忽略某些类型或方法。)。 将此项目文件保存到 YourXamarinFolder\YourProjectName\bin\Release.

4) 创建文件obfuscate_android.bat,在此处插入代码:

 "C:\Program Files (x86)\Eziriz\.NET Reactor\dotNET_Reactor.exe" -project "NET_Reactor_Project_Name.nrproj"
  copy "YourProjectName_Secure\YourProjectName.dll" "YourProjectName.dll"
  DEL "YourProjectName_Secure\*.dll" "YourProjectName_Secure\*.pdb" /q

将此文件移动到 YourProjectName\bin\Release.

5) 卸载 Xamarin 项目并编辑 YourProjectName.csproj 找到下一个区块:

<PropertyGroup Condition = " '$ (Configuration) | $ (Platform)' == 'Release | AnyCPU'">
<! -- Insert here the link to obfuscate_android.bat -->
<PostBuildEvent>obfuscate_android.bat </ PostBuildEvent>
 </ PropertyGroup>

6) 全部保存并重新加载项目

7) 运行 发布。

我在 Xamarin Studio 中通过挂接到 MSBuild 使我的 Xamarin Android 项目与 .NET Reactor 混淆得很好。将此标记添加到 csproj 文件的底部:

  <Target Name="AfterCompile">
    <Exec Command="&quot;C:\Program Files (x86)\Eziriz\.NET Reactor\dotNET_Reactor.exe&quot; -file &quot;$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)&quot; -targetfile &quot;$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)&quot; -suppressildasm 1 -obfuscation 1 -stringencryption 1 -antitamp 1 -control_flow_obfuscation 1 -flow_level 9 -resourceencryption 1 -mono 1 -exception_handling 1" Condition="'$(ConfigurationName)' == 'Release'" />
  </Target>
</Project>

请注意,当我在 Visual Studio 2015 年升级到 Xamarin 时,这不再有效。给我一个 "error MSB4018: The "LinkAssemblies" 任务意外失败。"

**编辑 我通过将 PostBuild 设置为 true 并挂钩到 'PostBuildEvent' 事件来克服 'LinkAssemblies' 任务错误,而不是像 Ajit 指出的那样。

但是,混淆后的 DLL 没有添加到 apk 文件中。我通过解压 .apk 文件(只需将文件扩展名更改为 .zip 或 .rar)并反编译其中的 DLL 文件来对此进行测试。它没有被混淆。

我查看了 bin/Release 和 obj/Release 文件夹,其中的 DLL 被混淆了。但是由于某些原因,apk中的DLL并不是混淆后的DLL。

也许 PostBuildEvent 在创建 apk 文件的过程中来不及了?

这是我当前的设置:

将 PostBuild 设置为 true:

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    ...
    <PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
  </PropertyGroup>

然后挂接到 'PostBuildEvent' 事件而不是 'AfterCompile'

  <Target Name="PostBuildEvent">
    <Exec Command="&quot;C:\Program Files (x86)\Eziriz\.NET Reactor\dotNET_Reactor.exe&quot; -file &quot;$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)&quot; -targetfile &quot;$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)&quot; -suppressildasm 1 -obfuscation 1 -stringencryption 1 -antitamp 1 -control_flow_obfuscation 1 -flow_level 9 -resourceencryption 1 -mono 1 -exception_handling 1" Condition="'$(ConfigurationName)' == 'Release'" />
  </Target>
</Project>

** 更新 我在 VS 2015 中创建了一个简单的空白 Android 项目来测试问题是否可能是由我的项目的复杂性引起的(使用第 3 方控件、公共实用程序库作为解决方案中的第二个项目等)。 'LinkAssemblies' 错误仍然出现,所以它可能是我的 environment/setup.

我有一个 GitHub 帐户,但还没有下载应用程序,所以我无法上传整个项目文件夹结构,所以我只是压缩了整个解决方案并上传了。可在此处获取:

https://github.com/nbcruz/TestObfuscate/blob/master/TestObfuscate.zip

我不得不删除 obj/Debug 文件夹的内容,因为它有 78MB 的文件,使 zip 文件小于 25MB 以允许 GitHub。

.NET Reactor 项目位于 bin\Release\ 文件夹中。我手动 运行 它并在 bin\Release\TestObfuscate_Secure 文件夹中创建混淆的 DLL。 obfuscate.bat 文件也在 bin\Release\ 文件夹中,它基本上只是将 bin\Release\TestObfuscate_Secure 文件夹中的 DLL 复制到 bin\Release\ 文件夹中。这个空白的简单解决方案仍然会引发 'LinkAssemblies' 错误。

今天在 xamarin 中使用 .net reactor 变得非常容易:

  1. from reactor ide 为您的 visual studio 适当版本安装扩展(菜单 Visual Studio)

  2. 在 reactor ide 中为您的 xamarin 解决方案创建一个项目。您可以使用菜单“Protection Themes->Xamarin”或使用您自己的设置。不要忘记添加其他文件(您的 Forms 共享项目和其他需要的文件)。保存项目,记下它的路径。

  3. 在Visual Studioide菜单Tools->Reactor Automation set:

  • Xamarin Android(或其他需要的)平台项目的项目文件路径,选中已启用。
  • 要发布的配置,
  • 将 Net Reactor Project 文件复制到您在第 2 步中创建的文件。

点击确定,就这样。

构建过程将是 MSBuild 编译,然后反应器将应用其处理,然后 VS 将 pack/aot 为平台 deployment/distribution 设置的任何内容。