C# 如何使用Xamarin Android APK的.Net反应器模糊dll

C# 如何使用Xamarin Android APK的.Net反应器模糊dll,c#,android,xamarin.android,obfuscation,net-reactor,C#,Android,Xamarin.android,Obfuscation,Net Reactor,我是Xamarin Android的新手。我使用Visual Studio 2015社区版创建了一个应用程序。我已将解决方案配置设置为Release 对于模糊处理,我使用.Net Reactor 这就是我试图混淆的方式 1:构建应用程序后,我将转到Bin\Release文件夹 2:混淆App.dll 3:在Bin\Release、Obj\Release和Obj\Release\assemblies中用模糊化的dll替换原始dll 4:转到工具->安卓->发布 但是,当我试图发布时,模糊的dll将

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

对于模糊处理,我使用.Net Reactor

这就是我试图混淆的方式

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

2:混淆App.dll

3:在Bin\Release、Obj\Release和Obj\Release\assemblies中用模糊化的dll替换原始dll

4:转到工具->安卓->发布

但是,当我试图发布时,模糊的dll将被原始dll替换

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

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

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

3) 创建一个新的.NET Reactor项目,设置正确的设置(取消选中Anti-ILDASM,并且模糊处理过程重命名反射或序列化中使用的字段。为避免应用程序崩溃,应设置忽略某些类型或方法的排除项。)。 将此项目文件保存到您的文件夹\YourProjectName\bin\Release中

4) 创建文件混淆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
将此文件移到您的projectname\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>

混淆android.bat
 
6) 全部保存并重新加载项目


7) 运行发布。

我在Xamarin Studio中获得了我的Xamarin Android项目,通过挂接MSBuild与.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:“链接程序集”任务意外失败。”

**编辑 正如Ajit指出的那样,我通过将PostBuild设置为true并挂接到“PostBuildEvent”事件来克服“LinkAssembly”任务错误

但是,未将模糊化的DLL添加到apk文件中。我通过解压缩.apk文件(只需将文件扩展名更改为.zip或.rar)并反编译其中的DLL文件来测试这一点。它没有被混淆

我查看了bin/Release和obj/Release文件夹,其中的DLL被模糊化了。但由于某些原因,apk中的DLL不是经过模糊处理的DLL

也许PostBuildEvent在创建apk文件的过程中太晚了

以下是我当前的设置:

将后期生成设置为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项目,以测试问题是否是由我的项目的复杂性引起的(使用第三方控件、公共实用程序库作为解决方案中的第二个项目等)。“LinkAssembly”错误仍然存在,因此可能是我的环境/设置造成的

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

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


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

现在,与xamarin一起使用.net reactor非常容易:

  • 从reactor ide安装visual studio相应版本的扩展(菜单visual studio)

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

  • 在Visual Studio ide菜单工具->反应堆自动化设置中:

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


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

    不起作用。当我尝试发布时,它正在用原始dll替换模糊处理的dll。尝试指定文件的绝对链接。当我尝试发布时,项目将“bin\Release\obfuscated.dll”替换为“bin\Release\un obfuscated.dll”。我还替换了“obj\release\”和“obj\release\assemblies”等中的dll。但它们也被替换。这是我的视频指南(俄语):好的。成功了。但我有一个问题。混淆的android.bat和…有什么区别?它可以工作。尝试postbuild事件,并检查它是否在未启用模糊处理的情况下正确编译。Ajit,您可以发布您的csproj xml吗?您在这里使用的是“”还是命令?您是按照Polyariz的建议,手动将模糊处理的DLL插入apk并对apk进行签名,还是使用由生成生成的apk?PropertyGroup Condition=“'$(配置)|$(平台)=='Release | AnyCPU'”>pdbonly true bin\Release\TRACE prompt 4 False SdkOnly“obfuscate.bat”是的,我正在属性组中添加后期生成事件,我正在获取“链接程序集”