5

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

对于混淆,我使用了 .Net Reactor。

这就是我试图混淆的方式

1:一旦我建立了应用程序,我会去 Bin\Release 文件夹

2:混淆App.dll

3:将Bin\Release、Obj\Release和Obj\Release\assemblies中的混淆dll替换为原来的dll

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

但是,当我尝试发布混淆的 dll 时,将被原始 dll 替换。

那么我做错了什么?我是否必须手动打包apk文件。如果是这种情况,我该怎么做?

4

3 回答 3

1

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

2) 将文件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) 运行发布。

于 2016-06-25T18:45:09.910 回答
1

通过连接到 MSBuild,我在 Xamarin Studio 中获得了我的 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 时,这不再起作用。给了我一个“错误 MSB4018:“LinkAssemblies”任务意外失败。”

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

但是,混淆的 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 项目,以测试问题是否是由我的项目的复杂性引起的(使用 3rd 方控件、通用实用程序库作为解决方案中的第二个项目等)。'LinkAssemblies' 错误仍然发生,所以它可能是我的环境/设置。

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

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

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

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

于 2016-12-30T19:04:14.043 回答
1

今天使用 .net reactor 和 xamarin 非常容易:

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

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

  3. 在 Visual Studio ide 菜单 Tools->Reactor Automation 中设置:

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

点击确定,就这样。

构建过程将是 MSBuild 编译,然后反应器将应用其处理,然后 VS 将打包/aot 为平台部署/分发设置的任何内容。

于 2020-09-04T11:11:06.650 回答