【问题标题】:How to use .Net Reactor obfuscated dll of Xamarin Android APK如何使用 Xamarin Android APK 的 .Net Reactor 混淆 dll
【发布时间】:2023-03-06 02:43:01
【问题描述】:

我是 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文件。如果是这样,我该怎么做?

【问题讨论】:

    标签: c# android xamarin.android obfuscation net-reactor


    【解决方案1】:

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

    2) 将文件 Mono.Android.dll 从文件夹“assemblies”移动到文件夹 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) 运行发布。

    【讨论】:

    • 没用。当我尝试发布时,它正在用原始 dll 替换混淆的 dll。
    • 尝试指定文件的绝对链接。
    • 当我尝试发布项目时,将“bin\Release\obfuscated.dll”替换为“bin\release\un obfuscated.dll”。我还替换了“obj\release\”、“obj\release\assemblies”等中的 dll。但它们也被替换了
    • 有我的视频指南(俄语):link
    • 好的。有效。但我有一个问题。 obfuscate_android.bat 目标>...?
    【解决方案2】:

    我在 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:“LinkAssemblies”任务意外失败。”

    **编辑 正如 Ajit 指出的那样,我通过将 PostBuild 设置为 true 并挂钩到“PostBuildEvent”事件来解决“LinkAssemblies”任务错误。

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

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

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

    这是我目前的设置:

    将 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”错误。

    【讨论】:

    • 它有效。尝试构建后事件,您是否检查它是否在未启用混淆的情况下正确编译。
    • Ajit,你能发布你的 csproj xml 吗?你是在使用“”还是你的命令在这里?您是按照 Polyariz 的建议手动将混淆的 DLL 插入 apk 并手动签署 apk,还是使用构建生成的 apk?
    • PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> pdbonlytruebin\Release\TRACEprompt4FalseSdkOnly"obfuscate.bat" True
    • 我正在属性组中添加构建后事件
    • 我收到““LinkAssemblies”任务意外失败。”再次出错。我正在做的是手动运行 Reactor 并创建混淆的 DLL,然后只需执行“复制”命令将混淆的 DLL 复制到发布文件夹中,而不是调用 Reactor 来动态创建混淆的 DLL。应该是一样的。您是否反编译了您的 apk 中的 DLL 以确保它是经过混淆的?
    【解决方案3】:

    如今,.net reactor 与 xamarin 一起使用变得非常容易:

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

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

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

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

    点击确定,就是这样。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-23
      • 2019-07-25
      • 2019-11-23
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      相关资源
      最近更新 更多