Skip to content

变量调试

变量调试是调试器的核心功能,允许你实时监听动态修改游戏内部的所有混淆变量。

工作原理

Tanki Online 的代码经过高度混淆,变量名如 ranks 会被重命名为 Z_1a2b3c。调试器通过解析游戏脚本,自动建立混淆名与真实名的映射关系:

游戏实际代码:         调试器解析后:
this.Z_1a2b3c    →    BattleUsers.ranks

然后通过 Object.defineProperty 在原型链上 Hook 这些属性,实现:

  • 监听:变量被赋值时自动记录
  • 修改:变量被读取时返回自定义值

搜索与添加参数

搜索参数

  1. 在顶部搜索框中输入关键词
  2. 支持空格分隔多个关键词(如 BattleChat messages
  3. 结果会实时显示
┌─────────────────────────────────────────────────────┐
│ 🔍 BattleUsers                                       │
├─────────────────────────────────────────────────────┤
│ ☐  BattleUsers.uids         this._obf_uid           │
│ ☐  BattleUsers.ranks        this._obf_rank          │
│ ☐  BattleUsers.usersPremium this._obf_premium       │
│ ☐  BattleUsers.clanTags     this._obf_clan          │
│ ☐  BattleUsers.teams        this._obf_team          │
└─────────────────────────────────────────────────────┘

添加参数

方式一:单击添加

  • 点击任意搜索结果项,直接添加到当前预设

方式二:批量添加

  • 勾选多个结果左侧的复选框
  • 点击「添加选中」按钮

方式三:全部添加

  • 点击「全部添加」按钮(慎用,可能添加上百个参数)

参数格式

类名.参数名
示例说明
BattleUsers.uids玩家 ID 列表
BattleUsers.ranks玩家等级列表
BattleChatState.messages聊天消息对象
State.userTeam当前用户队伍
State.inBattle是否在战斗中

查看原值

实时预览

每个参数卡片右侧会显示实时原值

┌─────────────────────────────────────────────────────┐
│ BattleUsers.uids                                    │
│ [输入框........] 🔧 原值: Array(15) (15) 🔒        │
└─────────────────────────────────────────────────────┘
  • 第一个数字是当前值的简要表示
  • 括号中的数字是历史记录数量

历史记录窗口

点击「原值」按钮打开详情窗口:

┌─────────────────────────────────────────────────────┐
│ BattleUsers.uids                         [×]        │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 记录 #15                            [📋][💾]    │ │
│ │ [                                                   │
│ │   { "userId": "12345", "name": "Player1" },        │
│ │   { "userId": "67890", "name": "Player2" }         │
│ │ ]                                                   │
│ └─────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 记录 #14                            [📋][💾]    │ │
│ │ ...                                               │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘

功能按钮:

按钮功能
🔍(过滤)隐藏重复内容
📷(媒体)提取图片/音频文件
💾(保存)导出为 .txt 文件
📋(复制)复制到剪贴板
🗑️(清空)删除所有历史记录

修改值

方式一:直接输入(最简单)

  1. 在输入框中填入你想要的
  2. 点击锁头图标 🔒 启用注入

输入格式示例:

类型输入示例
数字100
字符串"hello"(需要引号)
布尔值true
数组[1, 2, 3]
对象{"key": "value"}
nullnull
undefinedundefined

方式二:JS 脚本注入(高级)

使用 js: 前缀,$ 代表原始值:

js: return $ + 100
js: return { ...$, extra: "new" }
js: if($ > 100) { return 0 } else { return $ }

示例:

目标输入
把数值翻倍js: return $ * 2
保留原始结构,添加新属性js: return { ...$, custom: "value" }
条件修改js: return $ === null ? "default" : $
执行复杂逻辑js: return (function(x){ ... })(\$)

方式三:可视化编辑(推荐)

点击 🔧(齿轮)图标 打开可视化编辑器:

┌─────────────────────────────────────────────────────┐
│ 可视化配置: uids                                     │
├─────────────────────────────────────────────────────┤
│ userId (string)                                     │
│ [输入框: 12345..............................]       │
├─────────────────────────────────────────────────────┤
│ rank (number)                                       │
│ [输入框: 15................................]       │
├─────────────────────────────────────────────────────┤
│ clan (string)                                       │
│ [输入框: "WARRIORS"........................]       │
├─────────────────────────────────────────────────────┤
│ premium (boolean)                                   │
│ [🔘 true] false                                     │
├─────────────────────────────────────────────────────┤
│                     [清除注入] [取消] [保存并注入]   │
└─────────────────────────────────────────────────────┘

特点:

  • 自动解析对象结构
  • 表单化编辑,无需手写 JSON
  • 支持数字、字符串、布尔值
  • 嵌套对象可递归编辑

锁定与解锁

锁头状态

图标状态说明
🔓解锁仅监听,不修改
🔒锁定启用注入,修改生效

优先级

多个预设同时启用时,后启用的预设会覆盖冲突参数。系统会提示冲突信息:

⚠️ 无法启用预设!
检测到同名参数冲突:
与 [战斗配置] 冲突:
BattleUsers.ranks
BattleUsers.uids

参数状态说明

状态颜色说明
已定位参数青色正常可用
正在扫描源码灰色解析中,请稍候
参数已失效红色源代码中找不到,可能已过时

失效参数的处理:

  • 输入框会被禁用
  • 锁定按钮不可用
  • 建议删除后重新搜索添加

实战示例

示例1:监听玩家等级变化

  1. 搜索 ranks
  2. 添加 BattleUsers.ranks
  3. 锁定启用,输入框留空(只监听不修改)
  4. 游戏中打开原值窗口查看

示例2:强制修改自己的队伍

  1. 搜索 userTeam
  2. 添加 State.userTeam
  3. 输入 TEAM_REDTEAM_BLUE(注意大写)
  4. 锁定启用

示例3:给聊天消息添加前缀

  1. 搜索 messages
  2. 添加 BattleChatState.messages
  3. 输入 JS 脚本:
    javascript
    js: return $.map(msg => {
        msg.text = "[DEBUG] " + msg.text;
        return msg;
    })
  4. 锁定启用

示例4:修改数组中的特定元素

使用 JS 脚本:

javascript
js: return $.map((item, i) => {
    if (i === 0) {
        item.someProperty = "new value";
    }
    return item;
})

注意事项

注意说明
值类型修改后的值类型必须与原值兼容,否则可能导致游戏崩溃
数组索引修改数组时注意不要越界
游戏版本游戏更新可能导致参数失效,重新扫描即可
性能影响监听大量参数可能影响游戏性能
服务端校验某些值由服务端控制,客户端修改无效

下一步

内部技术交流 · 禁止外传