2020年7月更新:针对本文的需求,开发了代码混淆插件,详情请见微信小游戏代码包侵权解决方案升级版
随着微信小游戏平台的普及和完善,越来越多的游戏开发者加入到微信小游戏开发队伍中,很多公司开发者一个团队就开发了几十款游戏。
目前,微信小游戏同质化严重,大多是一套代码,换换皮肤就变成了一款新游戏。更有甚者,有些开发者直接反编译别人的游戏包进行简单修改,变成自己的产品申请上架。严重损害著作权所有人的利益和平台规则。
为了遏制和打击这种现象,微信小游戏平台有一个环节是机审,审查代码包的相似度,如果代码包相似度超过一定的比例就会被判定为“代码包侵权”,审核不予通过。
这本身是好事,但是却产生了大量“误杀”行为。很多公司开发团队用同一套自己研发的游戏引擎开发出不同的产品,申请上线的时候会判定为“侵权”。这就郁闷了,自己侵权自己。
虽然微信官方说可以申诉,但是时间不受控制,这不是一个上策。更好的方式是修改代码,混淆代码,让其看起来和别的项目不像,不要触发微信代码机审的“黑机关”。
好了,废话了半天,该上菜了!希望各位读者收获满满!
混淆代码的思路:
1、修改所有代码Class 类名称不要重复
2、修改全部全局属性、和至少 1/3的方法名称不要重复(这部分可以写程序去批量改)
3、打乱那些基类、工具类里面的方法顺序, 举例 Class A里面有 Function B、C、D,在不同项目里面改乱顺序,项目1里面的 Class A中顺序是B、D、C;项目2里面的 Class A中顺序是D、C、B;
4、如果定义了 package包名,包名也改掉;
5、每个类里面 随机插入一些废代码(注意,不是直接复制独立的废代码文件到项目中,这种方式无效)
6、如果是白鹭引擎,记把exml里面的代码也改改,各种重用的组件比如按钮、Class名称和文件名都改一下。
7、如果是 Laya 2.0项目,class 前面 不要用default 定义。
按照以上思路,修改到位,经过作者30+款产品上线的经验,通过率99.99%。
以上修改思路是有一定工作量的,而且是枯燥的,所以最好写代码脚本去处理,作者一般是手动+自动相结合的方式去混淆代码,以下代码实现了部分混淆代码的功能:
/* 为项目添加干扰代码,主要做这几件事:
1、修改每个类里面的私有方法,添加一个随机数
2、在代码里面随机一行插入一个随机命名的方法体
3、在代码里面随机一行插入一行没有意义的代码
*/
const LINENUM = 20;
const LINENUM_RADOM = 13;
var fs = require('fs');
var path = require('path');
var filterFils = ["Base64", "ThemeAdapter","AssetAdapter", "Platform", "wxgamesdk"];//忽略文件
var filterDirs = ["xxxx"];//忽略目录
var traceName = "xxxx";//添加的干扰代码
var funString = '_xxxx_fun(){ console.log("';//添加的方法体
var root_Url = "D:/code/project/src";//项目diam路径
fileDisplay(path.resolve(root_Url));
/**
* 文件遍历方法
* @param filePath 需要遍历的文件路径
*/
function fileDisplay(filePath){
//根据文件路径读取文件,返回文件列表
fs.readdir(filePath,function(err,files){
if(err){
console.warn(err)
}else{
//遍历读取到的文件列表
files.forEach(function(filename){
//获取当前文件的绝对路径
var filedir = path.join(filePath,filename);
//根据文件路径获取文件信息,返回一个fs.Stats对象
fs.stat(filedir,function(eror,stats){
if(eror){
console.warn('获取文件stats失败');
}else{
var isFile = stats.isFile();//是文件
var isDir = s