rgss加密文件解包器_Unity AssetBundle高效加密案例分享

0da08439c88bb40732a9ccc50ce75c28.png

这是侑虎科技第585篇文章,感谢作者江鱼供稿。欢迎转发分享,未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859)

作者主页:https://www.zhihu.com/people/yu-jiang-3-65/,作者也是U Sparkle活动参与者,UWA欢迎更多开发朋友加入U Sparkle开发者计划,这个舞台有你更精彩!


随着AssetStudio的普及,Unity项目中使用的AssetBundle资源可以被各种小白用户解包提取,由此AssetBundle资源包的安全问题不得不引起我们重视。

过去,通过官方文档的了解,我们主要可以通过,AssetBundle.LoadFromMemory(Async)的方案来实现资源包加密,官方文档对这个方法是这样描述的:

Use this method to create an AssetBundle from an array of bytes. This is useful when you have downloaded the data with encryption and need to create the AssetBundle from the unencrypted bytes.
Compared to LoadFromMemoryAsync, this version is synchronous and will not return until it is done creating the AssetBundle object.

下面是官方文档中的示例代码:

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;public class ExampleClass : MonoBehaviour
{byte[] MyDecription(byte[] binary){byte[] decrypted = new byte[1024];return decrypted;}IEnumerator Start(){var uwr = UnityWebRequest.Get("http://myserver/myBundle.unity3d");yield return uwr.SendWebRequest();byte[] decryptedBytes = MyDecription(uwr.downloadHandler.data);AssetBundle.LoadFromMemory(decryptedBytes);}
}

需要注意的是,对于AssetBundle.LoadFromMemory(Async)这个方法,在官方的AssetBundle foudamentals一文中,官方又非常明确的指出:

Unity's recommendation is not to use this API.
AssetBundle.LoadFromMemoryAsync loads an AssetBundle from a managed-code byte array (byte[] in C#). It will always copy the source data from the managed-code byte array into a newly-allocated, contiguous block of native memory. If the AssetBundle is LZMA compressed, it will decompress the AssetBundle while copying. Uncompressed and LZ4-compressed AssetBundles will be copied verbatim.
The peak amount of memory consumed by this API will be at least twice the size of the AssetBundle: one copy in native memory created by the API, and one copy in the managed byte array passed to the API. Assets loaded from an AssetBundle created via this API will therefore be duplicated three times in memory: once in the managed-code byte array, once in the native-memory copy of the AssetBundle and a third time in GPU or system memory for the asset itself.
Prior to Unity 5.3.3, this API was known as AssetBundle.CreateFromMemory. Its functionality has not changed.

从官方的解释中,我们可以看到AssetBundle.LoadFromMemory(Async)的使用成本非常高昂,不被推荐是自然而然的事情。但是,有没有更高效便捷的方式去对AssetBundle进行加密处理,防止被小白用户利用AssetStudio之类的工具轻易地提取到AssetBundle的资源呢?

在查看Unity API的时候发现LoadFromFile末尾有一个offset参数,那么这个参数有什么用呢?是否可以起到防止AssetBundle资源直接被AssetStudio提取呢?先看官方文档的接口说明:

public static AssetBundle LoadFromFile(string path, uint crc, along offset);Parameters

ec819574df91b0aa3c44b97c09086665.png
ReturnsAssetBundle Loaded AssetBundle object or null if failed.Description
Synchronously loads an AssetBundle from a file on disk.
The function supports bundles of any compression type. In case of lzma compression, the data will be decompressed to the memory. Uncompressed and chunk-compressed bundles can be read directly from disk.
Compared to LoadFromFileAsync, this version is synchronous and will not return until it is done creating the AssetBundle object.
This is the fastest way to load an AssetBundle.

官方文档的代码示例并没有,提供offest参数的演示,所以在这里就不搬运了,接下来我会用自己写的测试代码来做演示。

首先,我们需将XAsset生成好的AssetBundle文件内容进行偏移处理,待Unity打包完成后遍历所有AssetBundle文件,并对文件添加offset后进行覆盖,代码如下:

foreach (string bundleName in bundleNames)
{string filepath = outputPath + "/" + bundleName;// 利用 hashcode 做偏移 string hashcode = manifest.GetAssetBundleHash(bundleName).ToString();ulong offset = Utility.GetOffset(hashcode);if ( offset > 0){byte[] filedata = File.ReadAllBytes(filepath);int filelen = ((int)offset + filedata.Length);byte[] buffer = new byte[filelen];copyHead(filedata, buffer, (uint)offset);copyTo(filedata, buffer, (uint)offset);FileStream fs = File.OpenWrite(filepath);fs.Write(buffer, 0, filelen);fs.Close();offsets  += filepath + " offset:" + offset + "n";}WriteItem(stream, bundleName, filepath, hashcode);
}

然后,我们再进行加载测试,我们分别使用offset参数加载AssetBundle,和模拟解密文件后从内存中加载AssetBundle然后读取其中的一个Texture用于显示,可以参考以下代码:

// 基于offset加载AssetBundle
async void onLoadWithOffsetClicked()
{if (offsetBundle)offsetBundle.Unload(true);var current_memory = Profiler.GetTotalAllocatedMemoryLong();display_image.texture = null;var path = System.IO.Path.Combine(Application.streamingAssetsPath, "assets_previews_offset");var assetBundleRequest = AssetBundle.LoadFromFileAsync(path, 0, 294);await assetBundleRequest;var texture = assetBundleRequest.assetBundle.LoadAsset<Texture2D>("download.jpg");display_image.texture = texture;offsetBundle = assetBundleRequest.assetBundle;Debug.Log("Offset Load Complete:" + (Profiler.GetTotalAllocatedMemoryLong() - current_memory));
}// 基于Menmory加载AssetBundle
async void onLoadWithMemoryClicked()
{if (memoryBundle)memoryBundle.Unload(true);var current_memory = Profiler.GetTotalAllocatedMemoryLong();display_image.texture = null;var path = System.IO.Path.Combine(Application.streamingAssetsPath, "assets_previews");WWW www = new WWW("file://" + path);await www;var request = AssetBundle.LoadFromMemoryAsync( www.bytes);await request;var texture = request.assetBundle.LoadAsset<Texture2D>("download.jpg");display_image.texture = texture;memoryBundle = request.assetBundle;www.Dispose();Debug.Log("Memory Load Complete:"+ (Profiler.GetTotalAllocatedMemoryLong() - current_memory));
}

接下来,我们再看看对以上两个函数执行的Profiler数据分析采样的结果:

9ca5b823f7b286835e8f2ebbd333cb76.png
测试场景截图

8ed85134774930b93c9b529dc7c63ec1.png
使用offset参数加载之前的内存情况

caf6710eca77c9e3bb76de362ff1f446.png
使用offset参数加载AssetBundle之后的内存情况

115331946f6f4f2014f33b066988ac99.png
使用LoadFromMemory加载之前的内存情况

ad77bf524d7ccde871a9ce72283f3051.png
使用LoadFromMemory加载之后的内存情况

b387e07f53f9b6bbf6921388debf431a.png

通过对比发现,使用LoadFromMemory内存明显发生了增长,并且在加载过程中还出现了一个内存高峰。

由于我们对AssetBundle的资源进行了偏移,势必在理论上,AssetStudio无法直接解析出我们Unity工程中的AssetBundle,接下来我们再来看下,我们的理论是否经得起实践的考验。

经测试,没加offset的时候可以轻易地用AssetStudio预览AssetBundle中的资源,请参考下图(因为用的是公司项目的资源所以需要打码处理):

1ee9a650f43bea0a2b613c4442420348.png

带offset的资源,发现和我们的理论推测结果一致,请参考:

713085f05b76dcad6505a37252e37382.png

在测试过程中发现,有些老版本的AssetStudio,在解析带offest的资源的时候甚至会直接奔溃。其实,对于资源加密,我们大多数时候能做到的是防小白不防专家,不管你是采用简单的或者复杂的,在反编译高手手里都有点苍白,我亲眼所见一个大佬用IDA把人家的通信加密算法反出来了,所以这里就不做更深入的分析了。


文末,再次感谢江鱼的分享,如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859)

也欢迎大家来积极参与U Sparkle开发者计划,简称“US”,代表你和我,代表UWA和开发者在一起!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云DTS大幅降价,低至400元即可获得实现秒级延迟的数据传输服务

为了释放更多技术红利&#xff0c;进一步普惠广大客户和开发者&#xff0c;阿里云7月上旬宣布数据传输服务(Data Transmission Service,简称DTS) 数据同步功能降价&#xff0c;最高降价幅度高达40%。中国大陆&#xff0c;最低单价低至400元/月&#xff0c;跨境专线同步&#xf…

【又是一波重点】深度解析服务器科普知识 | CSDN博文精选

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | Hardy晗狄转自 &#xff5c; CSDN博客责编 | 阿秃服务器是网络数据的节点和枢纽&#xff0c;是一种高性能计算机&#xff0c;存储、处理网络上80&#xff05;的数据、信息&#xff0c;负责为网络中的多个客户端用户同时提供信…

Linux下启动/关闭Oracle服务和 oracle监听启动/关闭/查看状态

文章目录一、Linux下启动Oracle 二步曲1&#xff09;启动监听2&#xff09;启动数据库实例二、Linux下启动Oracle 实战操作2.1. 登录服务器&#xff0c;切换到oracle用户&#xff0c;或者以oracle用户登录2.2. 打开监听服务2.3. 以SYS用户身份登录Oracle2.4. 通过startup命令启…

【公测中】阿里云发布国内首个大数据双活容灾服务,满足高要求大数据灾备场景

在6月上旬举行的云栖大会上海峰会上&#xff0c;阿里云发布了国内首个大数据集群双活容灾产品-混合云容灾服务下的混合云大数据容灾服务&#xff08;HDR for Big Data, 简称 HDR-BD&#xff09;&#xff0c;并已经在7月份开始邀测。HDR-BD采用业界领先的数据双向实时复制技术&a…

linux CentOS7 最小化安装环境静默安装Oracle11GR2数据库(安装操作系统环境_01)

文章目录最小化安装 linux CentOS7我使用的镜像包&#xff1a;CentOS-7-x86_64-DVD-1810.iso虚拟机就创建好了 通过方向键选择&#xff1a;install centos 7 回车 直接点击&#xff1a;continue 这里采用自动分区&#xff0c;手动自定义分区请参考 网络设置方式有2种 第一种…

阿里云发布vSphere虚拟机备份服务 ,网络带宽有限条件下依然能有效保护数据

在6月上旬举行的云栖大会上海峰会上&#xff0c;阿里云发布了vSphere虚拟机备份上云服务&#xff08;HBR for vSphere&#xff09;&#xff0c;并已经在7月份开始邀测。利用混合云备份服务可以将虚拟机镜像备份上云&#xff0c;避免了传统备份方案复杂的软件部署&#xff0c;存…

行!人工智能玩大了!程序员:太扯,阴谋!你怎么看?

人工智能真的玩大了吗&#xff1f;人工智能行业的人才真的“爆发了&#xff1f;”AI程序员究竟怎么样&#xff1f;A与B 薪酬与前景程序员与远方2017年~2018年&#xff0c;是人工智能大火的时候。你会发现&#xff0c;跟朋友聊天不谈人工智能&#xff0c;聊天的bigger都上不去。…

spss 22 0统计分析从入门到精通_「转需」20+统计分析软件使用工具包,一次全搞定...

数据越来越多&#xff0c;使用统计软件对数据进行处理不失为一个减少工作量的好办法。在学习统计时&#xff0c;又怎么能少的了各种分析数据的助手呢&#xff1f;情报站为大家准备了常用统计软件使用工具包&#xff0c;各项常用统计软件课程一次全到手&#xff01;(领取方式见评…

Pandas/networkx图分析简单入门

摘要&#xff1a; 本文是一篇pandas/networkx图分析入门&#xff0c;对所举的欺诈检测用例进行了简单的图论分析&#xff0c;便于可视化及操作。 对于图论而言&#xff0c;大家或多或少有些了解&#xff0c;数学专业或计算机相关专业的读者可能对其更加清楚。图论中的图像是由若…

linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(安装常用工具_02)

接上一篇&#xff1a;linux CentOS7 最小化安装环境静默安装Oracle11GR2数据库&#xff08;安装操作系统环境_01&#xff09; 安装wget yum install -y wget安装vim yum install -y vim-enhanced或者 yum -y install vim安装unzip yum install zip unzip安装 lrzsz yum -y…

如何在学习机器学习时学习数学?

摘要&#xff1a; 机器学习到底需要怎么样的数学基础&#xff1f;高段位机器学习如何练成&#xff1f;来瞧瞧。 到目前为止&#xff0c;我们都还不完全清楚开始机器学习需要什么样的数学水平&#xff0c;特别是那些没有在学校学习数学或统计学的人。 在这篇文章中&#xff0c…

RPA机器人来了, 你的饭碗还好吗?

摘要&#xff1a; RPA正在席卷全球各行各业&#xff0c;从金融到医疗再到零售。多种重复有规律的工作流程正在被代替。从上世纪90年代到现在&#xff0c;RPA经历了怎样的发展历程&#xff0c;目前又是怎么样的现状呢&#xff1f; RPA&#xff0c;正在席卷全球 这是一个平常的星…

linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(安装依赖包_03)

接上一篇&#xff1a;linux CentOS7最小化安装环境静默安装Oracle11GR2数据库&#xff08;安装常用工具_02&#xff09; 安装Oracle11GR2所需要的依赖包 有高手写成了这样: yum -y install gcc gcc-c make binutils compat-libstdc-33 elfutils-libelf elfutils-libelf-devel …

机器学习算法概述:随机森林逻辑回归

摘要&#xff1a; 机器学习算法入门介绍&#xff1a;随机森林与逻辑回归&#xff01; 随机森林是用于分类和回归的监督式集成学习模型。为了使整体性能更好&#xff0c;集成学习模型聚合了多个机器学习模型。因为每个模型单独使用时性能表现的不是很好&#xff0c;但如果放在一…

【终于等到你】7种策略解除云风险警报

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | Bruce Harpham转自 &#xff5c; INSIDER责编 | 阿秃云服务时代已经来临&#xff0c;且企业也正在积极的拥抱云技术。之前的云服务仅限于简单的存储或者联系人管理&#xff0c;而现在&#xff0c;像ERP这样的企业核心服务也开…

linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(oracle基础配置_04)

接上一篇&#xff1a;linux CentOS7最小化安装环境静默安装Oracle11GR2数据库&#xff08;安装依赖包_03&#xff09; 创建用户 组 及文件夹 创建用户组&#xff1a;groupadd oinstall 创建用户组&#xff1a;groupadd dba 创建用户并添加到用户组&#xff1a;useradd -g oinst…

HTTPS时代已来,你做好准备了吗?

摘要&#xff1a; 全站HTTPS时代的到来&#xff0c;这也是最近越来越多的网站上HTTPS和更换证书的原因。那么究竟什么是HTTPS&#xff1f;它为什么会提升安全系数&#xff1f;CDN HTTPS又将如何做到安全性与性能同时提升&#xff1f;作为用户&#xff0c;又如何快速便捷的进行部…

专访阿里视频云叔度:一场技术人的自我修行

摘要&#xff1a; 千年之后的2018年&#xff0c;“玄奘之路”BC连14位同伴在这段自我修行的路程中沿着大师昔日的足迹徒步前行&#xff0c;对极致的追求促使他们努力挑战生命的每个不可能。其中&#xff0c;最让人感动的是一个打着点滴行进的身影&#xff0c;他在遭遇右腿受伤、…

spring cloud gateway 网关_微服务网关Spring Cloud Gateway全搞定

一、微服务网关Spring Cloud Gateway1.1 导引文中内容包含&#xff1a;微服务网关限流10万QPS、跨域、过滤器、令牌桶算法。在构建微服务系统中&#xff0c;必不可少的技术就是网关了&#xff0c;从早期的Zuul&#xff0c;到现在的Spring Cloud Gateway&#xff0c;网关我们用的…

这个耳机一点不输千元级的AirPods

你如果问我&#xff1a;生活中你觉得必不可少的一件电子产品是什么&#xff1f;那么我会毫不犹豫的回答你&#xff1a;是耳机&#xff01;出门忘带耳机是绝对不能忍听不听没关系&#xff0c;但是有它比较安心我觉得生活中不仅是我很多人都对耳机有一种依赖因为很多人都喜欢音乐…