• 【UGF】AssetBundle资源加密解密


    最近用HybridCLR做热更,热更dll也是AssetBundle,如果不做加密处理,也就意味着资源和热更代码全都赤果果暴露出来了。

    GF框架内置的AssetBundle工具自带简单的加密功能:

    勾选AB包底部下拉菜单可以选中不同的加载AB方式,不同的加载方式会走DefaultLoadResourceAgentHelper不同的加载方法;

    Load From File: 回调ReadFile(string fullPath)方法;

    其它:回调ParseBytes(byte[] bytes)方法;

    DefaultLoadResourceAgentHelper已经根据AB选择的加载方式,处理了是否解密。所以只需要设置AB的加载方式名称结尾带有Quick Decrypt 和 Decrypt都会自带加密解密功能。使用的加密算法分别为GameFramework.Utility.Encryption.GetQuickXorBytes();GameFramework.Utility.Encryption.GetXorBytes();

    自定义加密解密:

    加密AB:

    首先在AB编辑器中,设置所有AB包的加载方式为Load From Memory,此方式会走LoadResourceAgentHelper的ParseBytes(byte[] bytes)方法,需重写此方法处理解密逻辑;

    自定义一个编辑器类AssetBuildHandler : IBuildEventHandler, 继承IBuildEventHandler,实现OnPostprocessPlatform接口,工具打包出AB文件后会回调此方法,在方法中遍历加密AB文件;

    1. public void OnPostprocessPlatform(Platform platform, string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected, string outputPackedPath, bool isSuccess)
    2. {
    3. string targetPath = string.Empty;
    4. bool copyToStreamingAssets = false;
    5. if (outputPackageSelected)
    6. {
    7. targetPath = outputPackagePath;
    8. copyToStreamingAssets = true;
    9. }
    10. else if (outputPackedSelected)
    11. {
    12. targetPath = outputPackedPath;
    13. copyToStreamingAssets = true;
    14. }
    15. else if (outputFullSelected)
    16. {
    17. targetPath = outputFullPath;
    18. }
    19. if (string.IsNullOrEmpty(targetPath))
    20. {
    21. Debug.LogErrorFormat("targetPath is null.");
    22. return;
    23. }
    24. string[] fileNames = Directory.GetFiles(targetPath, "*", SearchOption.AllDirectories);
    25. string streamingAssetsPath = Path.Combine(Application.dataPath, "StreamingAssets");
    26. foreach (string fileName in fileNames)
    27. {
    28. var abAssetName = fileName.Substring(targetPath.Length);
    29. string destFileName = Path.Combine(streamingAssetsPath, abAssetName);
    30. FileInfo destFileInfo = new FileInfo(destFileName);
    31. if (!destFileInfo.Directory.Exists)
    32. {
    33. destFileInfo.Directory.Create();
    34. }
    35. //GameFrameworkVersion.dat和GameFrameworkList.dat不能加密
    36. if (ConstBuiltin.IsEncrypt && !abAssetName.StartsWith("GameFrameworkVersion.") && !abAssetName.StartsWith("GameFrameworkList."))
    37. {
    38. EncryptFile(fileName);
    39. }
    40. if (copyToStreamingAssets) File.Copy(fileName, destFileName);
    41. }
    42. if (isSuccess)
    43. {
    44. if (outputFullSelected || outputFullSelected)
    45. {
    46. EditorUtility.RevealInFinder(targetPath);
    47. }
    48. }
    49. }
    50. private void EncryptFile(string resFile)
    51. {
    52. var data_bytes = File.ReadAllBytes(resFile);
    53. data_bytes = UtilityBuiltin.XOR.QuickXor(data_bytes, ConstBuiltin.RES_KEY);
    54. File.WriteAllBytes(resFile, data_bytes);
    55. }

    在AB包Build工具界面选择自己定义的AssetBuildHandler,然后打包即可:

     解密:

    自定义EncryptLoadResourceAgentHelper继承DefaultLoadResourceAgentHelper,重写ParseBytes(byte[] bytes)方法;

    由于前面AB包选择了加载方式为Load From Memory,所以会走ParseBytes方法,然后处理解密即可。

    1. using GameFramework.FileSystem;
    2. using UnityEngine;
    3. using UnityGameFramework.Runtime;
    4. public class EncryptLoadResourceAgentHelper : DefaultLoadResourceAgentHelper
    5. {
    6. public override void ParseBytes(byte[] bytes)
    7. {
    8. if (ConstBuiltin.IsEncrypt)
    9. {
    10. bytes = UtilityBuiltin.XOR.QuickXor(bytes, ConstBuiltin.RES_KEY);
    11. }
    12. base.ParseBytes(bytes);
    13. }
    14. }

  • 相关阅读:
    rsync同步目录脚本
    Redis 连接不上 WRONGPASS invalid username-password pair
    pyside6安装
    优秀的测试/开发程序员与普通的程序员对比......
    RHCE---搭建博客网站
    Set集合(HastSet&hashCode)
    C#开源免费的Blazor图表库
    信号完整性分析基础知识之传输线和反射(七):带负载传输线、感性不连续引起的反射
    pbootcms 二级域名 迁移网站后 出现 内页 404
    本宁顿学院青年作家奖报名备赛
  • 原文地址:https://blog.csdn.net/final5788/article/details/126483875