微信小游戏马甲包是指同一套游戏源码使用不同的名字包装上线微信小游戏平台。微信官方是不允许这样的方式上线小游戏,但是游戏运营方为了买量的需求,往往采用不同包装来,以获取更多流量。另外游戏发行以后,多家联运渠道都需要上线同一款小游戏,也存在马甲包的情况。
如果马甲包游戏源码上传时没有经过特殊处理,就会打回小游戏内容涉嫌代码包内容侵权,同时信用分-5(信用分越低,提审时间越长,一般保持在90分及以上才能保证快速审核)。微信官方回复结果如下:
目前,微信小游戏审核相比苹果商店审核还不算严格,基本上能突破代码包侵权问题,过审率还是蛮高的。那么如何突破代码包侵权问题,可以这样操作:
JS混淆
推荐jascriptobfascator工具。为什么不用UglifyJS?微信开发者工具上传代码的时候也是用这个来压缩,你觉得用它来混淆能解决问题吗。市面上还有一些付费的代码混淆工具,如js**man,我还没有试用过,但是要把代码往他们的服务器传,估计我老板会打死我吧。另外价钱也不算便宜的,现在小游戏代码动不动单包超过3M,按这样算,至少买一个年度VIP才行。
为什么用jascriptobfascator?
因为它是免费开源的,请看它的Githup。它可以实现变量替换,代码压缩,平展控制流,加入废代码等等功能。难点就是如何合理配置混淆参数,既能保证过审,又能保证游戏性能,游戏大小。也就是说,如果性能太差(游戏发热),游戏太大(加载慢),会严重影响用户转化和留存,过审了也是白搭!
提取字符串
仅仅用jascriptobfascator来混淆一下行不行?因为jascriptobfascator混淆的时候,其实字符串还是在代码内,比较容易标记。一般做法是将字符串抽离出来,放到一个或者多个文件压缩保存。
怎么提取字符串?普通的正则替换肯定是不行的,游戏代码,很容易替换出问题,导致游戏异常。这里推荐大家学习Javascript AST语法分析,这个解析器https://astexplorer.net/ 可以帮助你快速学习AST语法树。开发过程中我们会用到acorn以及escodegen,其中acorn会帮助遍历代码语法树,这时候,你可以修改语法树;escodegen则将修改好的语法树保存为新的代码。
//都可以通过npm安装acorn、acorn-walk、escodegen
const acorn = require("acorn");
const walk = require("acorn-walk");
const escodegen = require('escodegen');
//content是js代码
const ast = acorn.parse(content, {
ecmaVersion: 'latest',
sourceType: 'script'
});
//提取数组
walk.simple(ast, {
ArrayExpression(node) { //数组
if (!node.elements || !node.elements.length) {
return;
}
for (var i in node.elements) {
if (!node.elements[i]) {
continue;
}
if (node.elements[i].type == 'Literal' && !node.elements[i].regex && node.elements[i].value) {
let key = ...;//保存key和value关系,并生成key
node.elements[i].type = "Identifier";
node.elements[i].name = `${key}`;
}
}
},
});
let options = {
comment: false,
format: {
compact: true
},
};
//获得新的JS代码
content = escodegen.generate(ast, options);
性能测试
完成了1和2以后,最重要的环节来的,测试混淆代码的性能。这里我们可以用腾讯自家研发的工具Perfdog https://perfdog.qq.com/ 。我们主要用这个工具来测试不同混淆代码跑起来的FPS,CPU占用,以及电池温度。
测试设备用苹果手机最好,娇贵的苹果手机比安卓手机更容易发烫,容易测试出问题。
好了,以上是微信小游戏马甲包混淆策略。再补充几点平时提审要注意的地方:
1、iOS的充值入口一定要隐藏,带“充值”字样的文字都不行
2、游戏内不要出现过于暴露的素材
3、可以使用个人账号来测试混淆策略是否有效果,如果有效果再用公司账号去提审,避免信用分扣除过多
4、目前微信官方对代码文件名、资源文件、请求域名审查还不严格,这方面可以少下功夫,不要钻到死胡同里