H5游戏的资源混淆机制

最近弄iOS的马甲包提审,总是被打回,被iOS搞的很头痛。主要原因因为还是iOS那边认为是相同的包,所以打回了。所以我们想着将资源做加密和混淆,让每个马甲包的内容都不一样。现在项目已经上线了,需要有一种方案,既不改变现有的开发方式,又能解决现在的问题。

保持现有的开发不变,现有的资源和开发都不做变化,只针对与需要做加密的渠道做处理。资源方面,可以通过脚本,将所有的文本文件内容进行aes加密保存,将所有的资源名重命名为md5加密的资源名;代码方面,写两个插件类,对资源进行解密。

加密库的选择

  • 加密库需要支持 nodebrowser 两种方式,使用 node 对资源文件进行加密,使用 browser 对网络加载的资源进行解密。
  • 加密库最好能有对称加密和非对称加密两种方式,因为文本文件内容是需要解密,这样就需要对称加密,我选择了 aes。文件名可以采用非对称加密,因为不需要解密

伟大的开源库提供了选择:crypto-js
github提供的库的详细说明

对资源进行解密

我非常欣赏 白鹭 的资源加载管理方式,它是采用插件类的形式来对资源进行加载和解析的,比如说图片,注册一个图片处理类;文本,注册一个文本处理类。这种方式,为资源解析提供了很好的扩展。我只需要重写一图片处理类,和文本处理类,再注册到处理器中,引擎就调用我的图片处理和文本出来。

文本文件解密

  • 新建一个文本处理类 text.js, 分析传入的url,将资源的名字解析出来,然后进行md5加密,再去网络加载这个md5加密过的资源名
function getTextRealUrl(url, xhr) {
	var index1 = url.lastIndexOf('/');
	var index2 = url.lastIndexOf('.json');
	if(index2 < 0)
		return url;
	var fileName = url.substring(index1 + 1, index2 + 5);
	xhr.name = 'json'
	var newFileName  = md5(fileName);
	return url.replace(fileName, newFileName);
}

function md5(content){
	var bytes  = CryptoJS.MD5(content, key);
	var originalText = bytes.toString();
	return originalText
}
  • 获取到文本后,我们在对文本进行 aes 解密,上面也说,所有的文本内容都做了 aes 加密
function decrypt(content) {
	var bytes  = CryptoJS.AES.decrypt(content, key);
	var originalText = bytes.toString(CryptoJS.enc.Utf8);
	
	let firstCode = originalText.charCodeAt(0);
	if (firstCode < 0x20 || firstCode > 0x7f) {
		originalText = originalText.substring(1); // 去除第一个字符
	}
	return originalText
}

对图片文件的解密

图片文件也可以安装文本文件的处理方式来处理,考虑到图片的解析会比较性能,我只做了图片名的md5加密

资源加密

资源加密的思路就很简单的,只需要对现有的资源做两个处理:

  • 对所有的文本文件和图片文件的资源名做md5加密
  • 对所有的文本文件做 aes 加密
  • 其他资源不做修改

将原始的资源,通过脚本导出到新的资源目录,将这个资源作为对应的渠道资源。下次要打新的马甲包的时候,我们可以通过修改加密key,这样生成的文件和文件名又不一样了。

在项目中导入加密库和我们编写的两个插件库

{
	"initial": [
		"js/egret.min.js",
		"js/egret.web.min.js",
		"js/assetsmanager.min.js",
		"js/tween.min.js",
		"js/game.min.js",
		"js/socket.min.js",
		"js/promise.min.js",
		"js/dragonBones.min.js",
		"js/jszip.min.js",
		"js/text.js",
		"js/image.js",
		"js/crypto-js.js"
	],
	"game": [
		"js/main.min.js?v=201904121852"
	]
}

注意: js/text.js, js/image.js, 两个库需要在白鹭库后面,这样才能覆盖白鹭的方法

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值