一、游戏深度保护功能介绍
为提高微信开放平台生态安全性,平台提供了针对游戏代码的深度保护功能,可实现对小游戏前端代码进行加密,以防止代码暴露,提高攻击者阅读前端代码逻辑的难度;还为代码增加了水印识别能力,保证代码唯一性,防止核心代码被盗取二次上线平台;同时也可以一定程度防止恶意用户脱机使用前后端网络协议来伪造真实用户、伪造正常访问及伪造游戏数据等虚假行为,避免影响游戏公平性。开发者也应注意自身开发规范的严谨性,保证游戏的代码质量,保护游戏用户财产安全。
游戏深度保护插件只需在微信开发者工具中直接进行安装即可,操作便捷,无需额外耗时,可将JavaScript文件传递给加密工具,从而实现字符串加密、属性加密、调用转换、代码混淆、代码水印等多项保护措施。建议涉及小游戏中的核心算法逻辑、版权内容等需要安全保护的内容,都可以进行深度保护。
二、操作说明
2.1运行环境
下载并安装 1.06.2401020 或以上版本的开发者工具。
2.2安装流程
方式一:打开微信开发者工具,在菜单栏选择"工具-插件-编辑器扩展"或"设置-扩展设置-编辑器扩展",找到 "游戏深度保护" 点击"获取"进行安装。安装成功后,即可使用该插件功能。
方式二:打开微信开发者工具,直接点击"扩展"图标,在搜索栏中搜索"minigame-code-fortify" 并进行安装。安装成功后,可以在工具栏看到下图圈出的"游戏深度保护" 插件图标,即可使用该功能。
注意:安装成功后每次进开发者工具都能看到此插件图标,插件loading需1分钟左右。若超时没有显示插件图标,请尝试退出开发者工具再重进,或者联系小游戏助手。
2.3使用流程
方式一:
step1 在需要进行加固的 js 代码文件上,右键选择"添加到加固文件列表",此时会弹出插件面板,选择加固能力(注意:如果未弹出插件面板可退出开发者工具重试或者使用方式二)。
step2 选择「代码混淆」以及对应的加固程度「高」、「中」、「低」;「文件水印」可以选择性开启。
step3 配置好加固文件后,点击“全部加固”即可开始加固(已经加固过的文件会自动忽略)。
方式二:
step1 点击“初始配置文件”,创建一份加固配置文件。
step2 配置文件加固参数:
files 是字符串数组,每个字符串是相对于项目目录的文件路径,一个字符串是一个待加固的js文件;
level: 1低、2中、3高。
step3 编译/上传代码时将自动加固。
3. 常见问题及排查
3.1 插件加固报错
根据提示,点击报错的那个文件名,查看它的报错信息,自行解决。以下是一个常见的报错原因:待加固的代码中不能使用 eval。
3.2 加固插件异常
包括以下偶然发生的情况:
- 插件图标不出现
- 右键添加文件到加固文件列表无反应
- 点击 "还原全部" ,"加固全部" 没反应
如果使用者遇到此情况,可以等待1分钟,如果不能解决问题,选择重新启动开发者工具。
3.3 线上报错
- 使用 sourcemap 映射定位问题:进入 "We分析/性能质量/JS分析" 查看错误堆栈,此时已经是根据 sourcemap 映射后的错误信息了。(可参考后续 sourcemap 相关小节)
- 联系小游戏助手申请人工辅助。
4. 使用限制
4.1 适用范围
目前只针对于微信小游戏的 js 代码文件,其它类型的文件(如 ts, txt, wasm 等)暂不支持。
4.2 语法限制
- ⚠⚠⚠ 代码中不要使用 function.toString,function.name,class.name,或者 Object.getOwnPropertyDescriptor(function, 'name') 等获得函数/类的名称/代码,由于代码加固会对名字(函数名/类名/属性名/变量名 等,不包括属性名)rename 以及代码(函数体/类体/块 等)重写,因此无法与加固前的代码保持一致。如果你的代码依赖此逻辑,请修改代码,或者考虑不加固这部分代码。
- 不支持 eval、with 语法。插件会检测这些语法,如果包含,那么加固失败。这样处理是因为这些语法无法进行准确的变量依赖分析,无法加固。
- 不支持在暂时性死区(TDZ)里访问变量,本身这样的语法会在运行时抛出异常。而本插件会尽量地静态检测这样的代码:如果在 let/const 构成的 TDZ 中访问此变量,那么加固失败,这是为了最大限度保护代码正确性。得到的错误信息如下:{"error_code":10018,"error_msg":"语法错误, 或不支持的语法, 请检查: check_syntax_not_pass(tdz_access:a(3:14))"},请根据给出的变量名,括号里的行号、列号 自行修改代码。
// TDZ 示例
function func(){
console.info(a); // 访问 TDZ 里的 a 会抛异常:ReferenceError
const a = 100;
}
- 不支持对 const 变量赋值,这会导致运行时抛异常。而本插件会静态检测这样的代码:如果对 const 变量赋值,那么加固失败,这是为了最大限度保护代码正确性。得到的错误信息如下:{"error_code":10018,"error_msg":"语法错误, 或不支持的语法, 请检查: check_syntax_not_pass(assign_to_const:99(3:5))"},请根据给出的变量名,括号里的行号、列号 自行修改代码。
// 对 const 变量赋值示例
const a = 10;
a = 99; // 对 const 变量赋值会抛异常:TypeError
- 全局作用域里的变量名字不会 rename,这是为了应对使用者对代码进行"部分加固",另一部分没有加固,尽量保证加固代码与未加固代码合并后能正常运行。
4.3 关于备份和恢复
加固插件使用者务必做好原代码备份工作,插件提供的代码备份功能只用于插件本身 debug 目的,不保证原代码不丢失,请不要依赖插件提供的代码备份/还原功能来做代码备份和恢复工作。
4.4 操作注意
4.4.1 不可更改已加固的代码
已加固的代码中有特殊标记,请不要更改已加固的代码,可能破坏这个标记。加固和备份会依赖读出此标记,做以下判断:
- 已加固的代码不会再重复加固。
- 已加固的代码不会被备份。
4.4.2 不可在已加固的代码上继续开发
基于 4.4.1 中提到的 "两个判断",在已加固的代码上继续开发,这会有几个问题:
- 已加固代码不会重复加固,因此在里面新增加的代码,也不会被加固,将失去保护。
- 已加固代码不会被备份,因此在里面新增加的代码,可能丢失。
4.4.3 自动忽略
- 点击 "全部加固" 按钮发起加固,加固成功的文件会自动跳过,不会重复加固。
- 体积过小的 js (<20k)平台会忽略"文件水印"这个选项,不加水印。如使用者有这种情况,请将这个过小的 js 并入其它 js 一起加固。如有疑问,可咨询 "小游戏助手"。
4.4.4 加固超时与复用
- 超时:对于未压缩/混淆的 js,4M以下一般会在几分钟内完成。如果某个文件的加固超时了,可以继续等待(退出插件或者退出开发者工具,均无影响),后台仍然继续加固。只要这个文件没有更改,那么在 24h之内 再次发起加固,会自动复用前面加固的结果,当已生成加固结果时,加固会很快完成。
- 复用:如果使用者不想复用已加固的结果,则可以通过更改文件(例如某个地方加个空格),使文件 md5 有变化,再发起加固,此时会重新生成加固结果。
4.4.5 sourcemap
- sourcemap 用于当线上发生问题时,辅助使用者定位问题。可以在 we 分析里直观看到映射后的报错信息。
- 加固完成后,会得到加固的 js 文件和对应的 js.map 文件,请保持将它们放在一起(相同目录下),一并提审。map 文件对于代码包大小的计算是豁免的,不会因为它过大而导致提审受阻。
- 发起加固时,如果 js 文件有对应的 map 文件(例如 a.js 和 a.js.map),本插件会吸收已有的 map 文件,加固后生成的 map 含有此映射信息(也即会映射到最原始的文件上去)。如果你不想使用这个已有 map可以删除它,再触发一下 js 文件更改(见 4.4.4 中的复用),再发起加固。
4.4.6 提审上传
上传代码包时,插件会检查加固列表中的文件,是否全部完成了加固。全部完成时会静默上传,如果存在未完成加固的文件,插件会提醒,请使用者加固后再上传,避免漏掉保护某个文件。
4.4.7 发布建议
- 加固完成后一定要进行充分的测试和真机云测,请确保游戏运行正常后再进行发布。
- 初次加固,或者使用者的代码有较大变更后再次加固,建议走灰度发布。
可点击下方链接报名,报名后1-2个工作日内会刷新资格,开发者可以前往工具内查看。
【收集表】 游戏深度保护工具使用报名
https://doc.weixin.qq.com/forms/AJEAIQdfAAoASsA2Aa5ACkq1BnFkCeSSf
已申请,是不是还没通过的时候不能使用的,现在看不到保护的图标,右键点击代码也没有"添加到加固文件列表"菜单.