变量调试
变量调试是调试器的核心功能,允许你实时监听和动态修改游戏内部的所有混淆变量。
工作原理
Tanki Online 的代码经过高度混淆,变量名如 ranks 会被重命名为 Z_1a2b3c。调试器通过解析游戏脚本,自动建立混淆名与真实名的映射关系:
游戏实际代码: 调试器解析后:
this.Z_1a2b3c → BattleUsers.ranks然后通过 Object.defineProperty 在原型链上 Hook 这些属性,实现:
- 监听:变量被赋值时自动记录
- 修改:变量被读取时返回自定义值
搜索与添加参数
搜索参数
- 在顶部搜索框中输入关键词
- 支持空格分隔多个关键词(如
BattleChat messages) - 结果会实时显示
┌─────────────────────────────────────────────────────┐
│ 🔍 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 文件 |
| 📋(复制) | 复制到剪贴板 |
| 🗑️(清空) | 删除所有历史记录 |
修改值
方式一:直接输入(最简单)
- 在输入框中填入你想要的值
- 点击锁头图标 🔒 启用注入
输入格式示例:
| 类型 | 输入示例 |
|---|---|
| 数字 | 100 |
| 字符串 | "hello"(需要引号) |
| 布尔值 | true |
| 数组 | [1, 2, 3] |
| 对象 | {"key": "value"} |
null | null |
undefined | undefined |
方式二: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:监听玩家等级变化
- 搜索
ranks - 添加
BattleUsers.ranks - 锁定启用,输入框留空(只监听不修改)
- 游戏中打开原值窗口查看
示例2:强制修改自己的队伍
- 搜索
userTeam - 添加
State.userTeam - 输入
TEAM_RED或TEAM_BLUE(注意大写) - 锁定启用
示例3:给聊天消息添加前缀
- 搜索
messages - 添加
BattleChatState.messages - 输入 JS 脚本:javascript
js: return $.map(msg => { msg.text = "[DEBUG] " + msg.text; return msg; }) - 锁定启用
示例4:修改数组中的特定元素
使用 JS 脚本:
javascript
js: return $.map((item, i) => {
if (i === 0) {
item.someProperty = "new value";
}
return item;
})注意事项
| 注意 | 说明 |
|---|---|
| 值类型 | 修改后的值类型必须与原值兼容,否则可能导致游戏崩溃 |
| 数组索引 | 修改数组时注意不要越界 |
| 游戏版本 | 游戏更新可能导致参数失效,重新扫描即可 |
| 性能影响 | 监听大量参数可能影响游戏性能 |
| 服务端校验 | 某些值由服务端控制,客户端修改无效 |
