如何使用 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=""C:\Program Files (x86)\Eziriz\.NET Reactor\dotNET_Reactor.exe" -file "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -targetfile "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -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=""C:\Program Files (x86)\Eziriz\.NET Reactor\dotNET_Reactor.exe" -file "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -targetfile "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -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 变得非常容易:
from reactor ide 为您的 visual studio 适当版本安装扩展(菜单 Visual Studio)
在 reactor ide 中为您的 xamarin 解决方案创建一个项目。您可以使用菜单“Protection Themes->Xamarin”或使用您自己的设置。不要忘记添加其他文件(您的 Forms 共享项目和其他需要的文件)。保存项目,记下它的路径。
在Visual Studioide菜单Tools->Reactor Automation set:
- Xamarin Android(或其他需要的)平台项目的项目文件路径,选中已启用。
- 要发布的配置,
- 将 Net Reactor Project 文件复制到您在第 2 步中创建的文件。
点击确定,就这样。
构建过程将是 MSBuild 编译,然后反应器将应用其处理,然后 VS 将 pack/aot 为平台 deployment/distribution 设置的任何内容。
我是 Xamarin 的新手 Android。我使用 Visual Studio 2015 Community Edition 创建了一个应用程序。我已将解决方案配置设置为发布。
为了混淆,我使用了 .Net Reactor。
这就是我试图混淆的方式
1:构建应用程序后,我将转到 Bin\Release 文件夹
2:混淆 App.dll
3:在Bin\Release、Obj\Release和Obj\Release\assemblies
中用混淆后的dll替换原来的dll4:转到工具->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=""C:\Program Files (x86)\Eziriz\.NET Reactor\dotNET_Reactor.exe" -file "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -targetfile "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -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=""C:\Program Files (x86)\Eziriz\.NET Reactor\dotNET_Reactor.exe" -file "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -targetfile "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -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 变得非常容易:
from reactor ide 为您的 visual studio 适当版本安装扩展(菜单 Visual Studio)
在 reactor ide 中为您的 xamarin 解决方案创建一个项目。您可以使用菜单“Protection Themes->Xamarin”或使用您自己的设置。不要忘记添加其他文件(您的 Forms 共享项目和其他需要的文件)。保存项目,记下它的路径。
在Visual Studioide菜单Tools->Reactor Automation set:
- Xamarin Android(或其他需要的)平台项目的项目文件路径,选中已启用。
- 要发布的配置,
- 将 Net Reactor Project 文件复制到您在第 2 步中创建的文件。
点击确定,就这样。
构建过程将是 MSBuild 编译,然后反应器将应用其处理,然后 VS 将 pack/aot 为平台 deployment/distribution 设置的任何内容。