# JS小游戏内存风险检测与辅助加固工具
《小游戏内存风险检测与辅助加固工具》是一个基于代码静态分析的内存篡改风险识别与辅助加固的工具,帮助开发者更全面地识别风险点,提升加固效率。由开发者指定加解密函数,对风险点的数值做内存隐藏,最终提升内存篡改挂成本。
本工具提供了两项功能:
- 检测提效:自动发现内存数值篡改风险点,呈现给使用者。
- 辅助加固:提供web交互,让开发者逐个确认风险点是否加固。
# 操作说明
# 运行环境
chrome 浏览器。
# 安装流程
请点击下载链接,获得安装包,安装后即可
# 使用流程

step1. 在浏览器中打开 index.html。
step2. 上传待保护的 js 文件,点击 “一键检测”。如果文件较大,耗时较多,耐心等待。
step3. 工具会对所有内存篡改风险点打上 getProxied 标记(使用 getProxied 包裹起来)。默认会加固这个保护点,如果需要取消这个保护点,那么点击 “取消加固”;否则确认下一个。
step4. 选择左侧,点击自定义加解密函数->启用函数编辑,开发者需实现数据加解密函数,否则代码将抛出异常,无法正常运行。
stpe5. 确认完毕后,点击 “下载参考代码”,若提示【你还未自定义加解密函数,是否确认下载】,则需要检查第四步是否有正确实现数据加解密函数。
# 加固验证
如果有条件,可以对加固效果做验证。在PC上推荐使用 Cheat Engine 工具。验证方法:
step1: 确认游戏外显数值,如分数、金币等。
step2: 打开Cheat Engine,选择进程,切换到进程显示页面。
step3: 选择进程页面的 WeChatAppEx.exe,可能会有多个,需逐个测试确认选择的游戏进程。
step4: 搜索游戏外显数值的两倍(或原值),未加固的游戏通过多次搜索可以定位到,已加固的则无法搜索到。


# 注意事项
- 为简化操作,开发者点击"取消加固"表示放弃某个风险点的加固,不点击表示确认加固。(全部不点击则表示对全部风险点做加固)
- 为安全考虑,开发者需要自行指定数值加解密函数(encode/decode),注意数值计算溢出与精度问题。
- 为安全考虑,最终生成代码,推荐使用《游戏深度保护插件》对代码保护,防止攻击者识别加解密函数做对抗。
# 常见问题排查
# 生成代码运行异常
若抛出异常:"You must implement this function",则提示开发者需自行实现 encode/decode 函数。
# 工具异常
以下偶发情况:
- 检测时间过长:往往是原代码体积较大引起,可以等待1分钟,如果不能解决问题,选择重新启动工具,或者点击咨询小助手。
- 检测弹窗报错:往往是原代码语法问题,请根据提示信息去修复语法问题。
# unity小游戏内存加固工具
《unity小游戏内存加固工具》可以保护unity小游戏的关键数值,防止被外挂修改,提升游戏安全性。加固工具目前已集成至unity小游戏转换工具中,开发者按照文档中的步骤做代码微调,即可实现unity小游戏的内存加固。
# 接入步骤
开发者需要在tuanjie引擎中添加来自git url的插件:https://github.com/wechat-miniprogram/minigame-tuanjie-transform-sdk.git#feat-wxmonitor,然后按照如下步骤接入使用,接入后务必做好充分测试再上线。
# 引入命名空间
using WeChatWASM.GameProtect.Monitor; # 基础用法
// 存储数据 WXDataPlugin.Instance.Set("coins", 1000); WXDataPlugin.Instance.Set("playerName", "Player1"); // 读取数据 int coins = WXDataPlugin.Instance.Get<int>("coins"); string name = WXDataPlugin.Instance.Get<string>("playerName"); # 安全读取(推荐)
// 安全读取,避免异常 if (WXDataPlugin.Instance.TryGet<int>("coins", out int coins)) { Debug.Log($"金币: {coins}"); } else { Debug.LogWarning("读取金币失败,可能被篡改"); } # 订阅篡改事件
using WeChatWASM.GameProtect.Monitor; private void Start() { // 订阅数据篡改事件 WXDataPlugin.Instance.DataTampered += OnDataTampered; } private void OnDataTampered(object sender, WXDataProtectionEventArgs e) { Debug.LogError($"检测到数据篡改!Key: {e.Key}"); // 实现反作弊逻辑 HandleTampering(e); } # API 参考
# 核心方法
| 方法 | 描述 |
|---|---|
| Set(string key, object value) | 存储数据 |
| Get<T>(string key) | 获取指定类型的数据 |
| Get(string key) | 获取数据(返回object) |
| TryGet<T>(string key, out T value) | 安全获取数据 |
| HasKey(string key) | 检查key是否存在 |
| Remove(string key) | 删除指定数据 |
| Clear() | 清空所有数据 |
# 事件
| 事件 | 描述 |
|---|---|
| DataTampered | 数据被篡改时触发 |
# 事件参数 (WXDataProtectionEventArgs)
| 属性 | 类型 | 描述 |
|---|---|---|
| Key | string | 被篡改的数据key |
| ExpectedValue | object | 期望的原始值 |
| ActualValue | object | 实际检测到的值 |
| ValueType | Type | 数据类型 |
| DetectedTime | DateTime | 检测到篡改的时间 |
| TamperDescription | string | 篡改描述信息 |
# 最佳实践
# 数据分类保护
// 重要货币数据 WXDataPlugin.Instance.Set("coins", playerCoins); WXDataPlugin.Instance.Set("diamonds", playerDiamonds); // 游戏进度数据 WXDataPlugin.Instance.Set("level", playerLevel); WXDataPlugin.Instance.Set("experience", playerExp); // 配置数据 WXDataPlugin.Instance.Set("settings", gameSettings); # 封装常用操作
using WeChatWASM.GameProtect.Monitor; public static class CurrencyManager { public static void AddCoins(int amount) { int current = WXDataPlugin.Instance.Get<int>("coins"); WXDataPlugin.Instance.Set("coins", current + amount); } public static bool SpendCoins(int amount) { int current = WXDataPlugin.Instance.Get<int>("coins"); if (current >= amount) { WXDataPlugin.Instance.Set("coins", current - amount); return true; } return false; } } # 篡改应对策略
private void HandleDataTampering(WXDataProtectionEventArgs e) { switch (e.Key) { case "coins": case "diamonds": // 货币被篡改:重置为0或从服务器同步 ResetCurrency(e.Key); break; case "level": // 等级被篡改:从服务器重新获取 SyncLevelFromServer(); break; default: // 记录日志并上报 LogTamperAttempt(e); break; } }