cheatengine 5.8.18 → 5.8.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README_CN.md +450 -450
- package/ce_mcp_server.js +4 -1
- package/package.json +1 -1
package/README_CN.md
CHANGED
|
@@ -1,450 +1,450 @@
|
|
|
1
|
-
[English](README.md) | 中文
|
|
2
|
-
|
|
3
|
-
# Cheat Engine MCP - AI 辅助逆向工程
|
|
4
|
-
|
|
5
|
-
MCP 桥接器,让 AI 助手直接控制 Cheat Engine 进行游戏修改和逆向工程。
|
|
6
|
-
|
|
7
|
-
## 架构
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
AI <--MCP/JSON-RPC--> ce_mcp_server.
|
|
11
|
-
↑
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## 安装
|
|
16
|
-
|
|
17
|
-
### 快速开始 (NPX) - 推荐
|
|
18
|
-
|
|
19
|
-
1.
|
|
20
|
-
|
|
21
|
-
2. **在 CE 中加载** (二选一):
|
|
22
|
-
- **自动加载**: 将 `ce_mcp_bridge.lua` 复制到 CE 的 `autorun` 文件夹 (如 `D:\Cheat Engine\autorun\`)
|
|
23
|
-
- **手动加载**: 按 `Ctrl+Alt+L`,执行:
|
|
24
|
-
```lua
|
|
25
|
-
dofile([[D:\path\to\ce_mcp_bridge.lua]])
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
3. **配置 MCP** (`.kiro/settings/mcp.json`):
|
|
29
|
-
```json
|
|
30
|
-
{
|
|
31
|
-
"mcpServers": {
|
|
32
|
-
"cheat-engine": {
|
|
33
|
-
"command": "npx",
|
|
34
|
-
"args": ["--yes", "cheatengine"]
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### 手动安装 (本地运行)
|
|
41
|
-
|
|
42
|
-
如果你希望从源码运行:
|
|
43
|
-
|
|
44
|
-
```json
|
|
45
|
-
{
|
|
46
|
-
"mcpServers": {
|
|
47
|
-
"cheat-engine": {
|
|
48
|
-
"command": "
|
|
49
|
-
"args": ["D:/path/to/ce_mcp/ce_mcp_server.
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## 连接特性
|
|
56
|
-
|
|
57
|
-
- **自动重连**: CE 重启后 MCP Server 自动重连
|
|
58
|
-
- **后台重试**: 连接尝试在后台进行,使用指数退避
|
|
59
|
-
- **失败诊断**: `ce_ping` 在连接失败时返回详细诊断信息
|
|
60
|
-
- **线程安全**: 所有管道操作都有锁保护
|
|
61
|
-
|
|
62
|
-
## 安全特性
|
|
63
|
-
|
|
64
|
-
### 认证令牌
|
|
65
|
-
|
|
66
|
-
可选的管道通信认证层。启用后,所有请求必须包含有效令牌。
|
|
67
|
-
|
|
68
|
-
**设置:**
|
|
69
|
-
1. 在两端设置相同的环境变量:
|
|
70
|
-
```bash
|
|
71
|
-
# Windows CMD
|
|
72
|
-
set CE_MCP_AUTH_TOKEN=your_secret_token_here
|
|
73
|
-
|
|
74
|
-
# PowerShell
|
|
75
|
-
$env:CE_MCP_AUTH_TOKEN = "your_secret_token_here"
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
2. 启动 CE 并加载桥接脚本
|
|
79
|
-
3. 启动 MCP 服务器
|
|
80
|
-
|
|
81
|
-
令牌不匹配时,请求将被拒绝并返回 "Authentication failed" 错误。
|
|
82
|
-
|
|
83
|
-
### 自定义管道名称
|
|
84
|
-
|
|
85
|
-
为防止检测,可自定义管道名称:
|
|
86
|
-
```bash
|
|
87
|
-
set CE_MCP_PIPE_NAME=my_custom_pipe_name
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### Hook 名称验证
|
|
91
|
-
|
|
92
|
-
Hook 名称现在会验证以防止 AA 脚本注入:
|
|
93
|
-
- 必须以字母或下划线开头
|
|
94
|
-
- 只能包含字母数字和下划线
|
|
95
|
-
- 模式: `^[a-zA-Z_][a-zA-Z0-9_]*$`
|
|
96
|
-
|
|
97
|
-
无效名称如 `"my hook"` 或 `"hook;inject"` 将被拒绝。
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
## 工具参考
|
|
102
|
-
|
|
103
|
-
### 系统与连接
|
|
104
|
-
|
|
105
|
-
#### `ce_ping`
|
|
106
|
-
测试与 CE 桥接的连接。**连接失败时返回诊断信息和故障排除建议。**
|
|
107
|
-
|
|
108
|
-
#### `ce_get_process_info`
|
|
109
|
-
获取已附加进程信息并刷新符号处理器。同时清除地址缓存。
|
|
110
|
-
|
|
111
|
-
#### `ce_attach_process(target)` ⭐ 新增
|
|
112
|
-
通过 PID 或名称附加到进程。附加后清除缓存和扫描会话。
|
|
113
|
-
|
|
114
|
-
**参数:**
|
|
115
|
-
- `target` (string, 必需): 进程 ID (数字) 或进程名称 (如 `"game.exe"`)
|
|
116
|
-
|
|
117
|
-
#### `ce_auto_assemble(script, target_self?)` ⭐ 新增
|
|
118
|
-
执行 Auto Assembler 脚本。支持启用/禁用脚本、代码注入等。
|
|
119
|
-
|
|
120
|
-
**参数:**
|
|
121
|
-
- `script` (string, 必需): Auto Assembler 脚本内容
|
|
122
|
-
- `target_self` (boolean, 可选): 目标为 CE 进程本身 (默认: false)
|
|
123
|
-
|
|
124
|
-
#### `ce_execute_lua(code)`
|
|
125
|
-
在 CE 中执行任意 Lua 代码。
|
|
126
|
-
|
|
127
|
-
**参数:**
|
|
128
|
-
- `code` (string, 必需): 要执行的 Lua 代码
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
### 内存读写
|
|
133
|
-
|
|
134
|
-
#### `ce_read_memory(address, type, size?)`
|
|
135
|
-
读取单个内存值。
|
|
136
|
-
|
|
137
|
-
**参数:**
|
|
138
|
-
- `address` (string, 必需): 地址表达式 (如 `"game.exe+0x1234"`, `"0x140001000"`)
|
|
139
|
-
- `type` (string, 必需): `byte`, `word`, `dword`, `qword`, `float`, `double`, `string`, `bytes`
|
|
140
|
-
- `size` (integer, 可选): string/bytes 类型的大小 (默认: 100)
|
|
141
|
-
|
|
142
|
-
#### `ce_read_memory_batch(requests)`
|
|
143
|
-
一次调用读取多个地址。**始终优先使用此方法而非多次调用 ce_read_memory。**
|
|
144
|
-
|
|
145
|
-
**参数:**
|
|
146
|
-
- `requests` (array, 必需): `{address, type, id?, size?}` 数组
|
|
147
|
-
|
|
148
|
-
#### `ce_write_memory(address, type, value)`
|
|
149
|
-
向内存写入值。
|
|
150
|
-
|
|
151
|
-
**参数:**
|
|
152
|
-
- `address` (string, 必需): 地址表达式
|
|
153
|
-
- `type` (string, 必需): 值类型
|
|
154
|
-
- `value` (string, 必需): 要写入的值
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
### 扫描与搜索
|
|
159
|
-
|
|
160
|
-
#### `ce_aob_scan(aob_string, module?, protection?, max_results?)`
|
|
161
|
-
扫描内存中的字节数组模式。支持 `??` 通配符。
|
|
162
|
-
|
|
163
|
-
**参数:**
|
|
164
|
-
- `aob_string` (string, 必需): 模式如 `"48 89 5C 24 ?? 48 83 EC 20"`
|
|
165
|
-
- `module` (string, 可选): 限制扫描到模块 (如 `"game.exe"`)
|
|
166
|
-
- `protection` (string, 可选): 内存保护标志 (默认: `"-C+X"`)
|
|
167
|
-
- `max_results` (integer, 可选): 最大结果数 (默认: 100)
|
|
168
|
-
|
|
169
|
-
#### `ce_value_scan(value, type, module?, protection?)`
|
|
170
|
-
扫描特定值。用于指针追踪。**一次性扫描 - 迭代扫描请使用扫描会话。**
|
|
171
|
-
|
|
172
|
-
**参数:**
|
|
173
|
-
- `value` (string, 必需): 要搜索的值 (如 `"0x255D5E758"` 或 `"12345"`)
|
|
174
|
-
- `type` (string, 必需): `byte`, `word`, `dword`, `qword`, `float`, `double`, `string`
|
|
175
|
-
- `module` (string, 可选): 限制到模块
|
|
176
|
-
- `protection` (string, 可选): 默认 `"+W-C"` 用于可写内存
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
### 扫描会话 ⭐ 新增
|
|
181
|
-
|
|
182
|
-
实现 CE 核心的 "首次扫描 → 再次扫描" 工作流,带会话管理。会话在 5 分钟不活动后自动过期。
|
|
183
|
-
|
|
184
|
-
#### `ce_scan_new(value, type, module?, protection?)`
|
|
185
|
-
开始新的扫描会话。
|
|
186
|
-
|
|
187
|
-
#### `ce_scan_next(session_id, value, scan_type?, value2?)`
|
|
188
|
-
继续扫描(过滤)现有会话。
|
|
189
|
-
|
|
190
|
-
**scan_type 选项:**
|
|
191
|
-
- `exact` - 精确值匹配
|
|
192
|
-
- `increased` / `decreased` - 值增加/减少
|
|
193
|
-
- `changed` / `unchanged` - 值改变/未改变
|
|
194
|
-
- `bigger_than` / `smaller_than` - 大于/小于
|
|
195
|
-
- `between` - 在 value 和 value2 之间
|
|
196
|
-
|
|
197
|
-
#### `ce_scan_results(session_id, start_index?, limit?)`
|
|
198
|
-
获取扫描会话的分页结果。
|
|
199
|
-
|
|
200
|
-
#### `ce_scan_close(session_id)`
|
|
201
|
-
关闭扫描会话并释放资源。
|
|
202
|
-
|
|
203
|
-
#### `ce_scan_list`
|
|
204
|
-
列出所有活动的扫描会话。
|
|
205
|
-
|
|
206
|
-
#### `ce_enum_modules`
|
|
207
|
-
列出所有已加载的模块 (DLL)。
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
### 符号与地址
|
|
212
|
-
|
|
213
|
-
#### `ce_get_address(expression)`
|
|
214
|
-
将地址表达式解析为数字地址。
|
|
215
|
-
|
|
216
|
-
**参数:**
|
|
217
|
-
- `expression` (string, 必需): 如 `"game.exe+0x1234"`, `"[[game.exe+100]+20]+8"`
|
|
218
|
-
|
|
219
|
-
#### `ce_get_symbol(address, include_module?)`
|
|
220
|
-
从地址获取符号名称,包含 RTTI 类信息。
|
|
221
|
-
|
|
222
|
-
#### `ce_resolve_pointer(base, offsets, read_value?, value_type?)`
|
|
223
|
-
解析多级指针链,支持 CE 表示法。
|
|
224
|
-
|
|
225
|
-
**参数:**
|
|
226
|
-
- `base` (string, 必需): 基地址或符号 (如 `"game.exe+1234"`)
|
|
227
|
-
- `offsets` (array, 必需): 偏移数组,如 `[0x100, 0x20, 0x8]`
|
|
228
|
-
- `read_value` (boolean, 可选): 读取最终地址的值 (默认: false)
|
|
229
|
-
- `value_type` (string, 可选): 值类型 (默认: "dword")
|
|
230
|
-
|
|
231
|
-
**返回:** 包含 `ceNotation` (CE 兼容指针表示法),可直接用于 CE 地址列表。
|
|
232
|
-
|
|
233
|
-
#### `ce_auto_guess(address)`
|
|
234
|
-
猜测地址处的值类型。
|
|
235
|
-
|
|
236
|
-
---
|
|
237
|
-
|
|
238
|
-
### 反汇编与代码分析
|
|
239
|
-
|
|
240
|
-
#### `ce_disassemble(address, count?, direction?)`
|
|
241
|
-
反汇编指令。
|
|
242
|
-
|
|
243
|
-
**参数:**
|
|
244
|
-
- `address` (string, 必需): 起始地址
|
|
245
|
-
- `count` (integer, 可选): 指令数量 (默认: 10)
|
|
246
|
-
- `direction` (string, 可选): `"forward"` 或 `"backward"` (默认: forward)
|
|
247
|
-
|
|
248
|
-
#### `ce_get_instruction_info(address)`
|
|
249
|
-
获取单条指令的详细信息。
|
|
250
|
-
|
|
251
|
-
#### `ce_analyze_code(address, count?)`
|
|
252
|
-
代码块的静态分析 (调用、跳转、引用)。
|
|
253
|
-
|
|
254
|
-
---
|
|
255
|
-
|
|
256
|
-
### 调试与断点
|
|
257
|
-
|
|
258
|
-
#### `ce_set_breakpoint(address, type?, size?)`
|
|
259
|
-
设置硬件断点。
|
|
260
|
-
|
|
261
|
-
**参数:**
|
|
262
|
-
- `address` (string, 必需): 地址表达式
|
|
263
|
-
- `type` (string, 可选): `"execute"`, `"write"`, `"access"` (默认: execute)
|
|
264
|
-
- `size` (integer, 可选): write/access 断点的大小 (默认: 1)
|
|
265
|
-
|
|
266
|
-
#### `ce_break_and_get_regs(address, timeout?, include_xmm?, stack_depth?)`
|
|
267
|
-
设置断点并在触发时捕获寄存器。同时返回调用栈。
|
|
268
|
-
|
|
269
|
-
#### `ce_break_and_trace(address, max_steps?, timeout?, stop_on_ret?, trace_into_call?, end_address?, initial_regs?)`
|
|
270
|
-
**多步执行跟踪。** 最强大的调试工具 - 逐步跟踪代码执行,捕获每条指令的完整寄存器状态。
|
|
271
|
-
|
|
272
|
-
**参数:**
|
|
273
|
-
- `address` (string, 必需): 起始地址 (断点位置)
|
|
274
|
-
- `max_steps` (integer, 可选): 最大跟踪指令数 (默认: 100)
|
|
275
|
-
- `timeout` (integer, 可选): 超时毫秒数 (默认: 10000)
|
|
276
|
-
- `stop_on_ret` (boolean, 可选): 遇到 `ret` 时停止 (默认: true)
|
|
277
|
-
- `trace_into_call` (boolean, 可选): 步入调用 vs 步过 (默认: false)
|
|
278
|
-
- `end_address` (string, 可选): 到达此地址时停止
|
|
279
|
-
- `initial_regs` (object, 可选): 首次命中时设置寄存器值
|
|
280
|
-
|
|
281
|
-
**停止原因:** `"ret"`, `"end_address"`, `"max_steps"`, `"timeout"`
|
|
282
|
-
|
|
283
|
-
#### `ce_cleanup`
|
|
284
|
-
移除所有断点和跟踪。游戏卡住时使用。
|
|
285
|
-
|
|
286
|
-
---
|
|
287
|
-
|
|
288
|
-
### 分析工具
|
|
289
|
-
|
|
290
|
-
#### `ce_find_what_accesses(address, size?, duration_ms?, max_records?)`
|
|
291
|
-
查找访问此地址的代码 (类似 CE 的 F5 功能)。监控读写。
|
|
292
|
-
|
|
293
|
-
#### `ce_find_what_writes(address, size?, duration_ms?, max_records?)`
|
|
294
|
-
查找写入此地址的代码 (类似 CE 的 F6 功能)。仅监控写入。
|
|
295
|
-
|
|
296
|
-
#### `ce_find_pointer_path(address, max_depth?, strategy?)`
|
|
297
|
-
**自动指针链追踪。** 为动态地址找到静态基地址。
|
|
298
|
-
|
|
299
|
-
**参数:**
|
|
300
|
-
- `address` (string, 必需): 要追踪的动态地址
|
|
301
|
-
- `max_depth` (integer, 可选): 最大指针深度 1-10 (默认: 7)
|
|
302
|
-
- `strategy` (string, 可选): `"hybrid"`, `"f5"`, `"value_scan"` (默认: hybrid)
|
|
303
|
-
|
|
304
|
-
#### `ce_find_references(address, limit?)`
|
|
305
|
-
查找引用特定地址的所有代码位置。
|
|
306
|
-
|
|
307
|
-
#### `ce_find_call_references(address, module?, limit?)`
|
|
308
|
-
查找目标为特定函数的所有 CALL 指令。
|
|
309
|
-
|
|
310
|
-
#### `ce_find_function_boundaries(address, max_search?)`
|
|
311
|
-
通过分析序言/尾声模式检测函数起止。
|
|
312
|
-
|
|
313
|
-
#### `ce_generate_signature(address)`
|
|
314
|
-
为地址生成唯一的 AOB 特征码。用于游戏更新。
|
|
315
|
-
|
|
316
|
-
---
|
|
317
|
-
|
|
318
|
-
### 高级分析
|
|
319
|
-
|
|
320
|
-
#### `ce_build_cfg(address, max_blocks?, max_instructions?, detect_loops?)`
|
|
321
|
-
为函数构建控制流图。
|
|
322
|
-
|
|
323
|
-
#### `ce_detect_patterns(address, max_instructions?, patterns?)`
|
|
324
|
-
检测常见代码模式: switch 表、虚函数调用、字符串引用、加密常量。
|
|
325
|
-
|
|
326
|
-
#### `ce_compare_functions(address1, address2, max_instructions?)`
|
|
327
|
-
比较两个函数的相似度。
|
|
328
|
-
|
|
329
|
-
#### `ce_trace_dataflow(address, register, direction?, max_instructions?)`
|
|
330
|
-
在函数内追踪寄存器的数据流。
|
|
331
|
-
|
|
332
|
-
#### `ce_program_slice(address, criterion, direction?, max_instructions?)`
|
|
333
|
-
计算程序切片 - 查找影响或受变量影响的所有指令。
|
|
334
|
-
|
|
335
|
-
---
|
|
336
|
-
|
|
337
|
-
### 代码模拟
|
|
338
|
-
|
|
339
|
-
#### `ce_symbolic_trace(address, count?, initial_state?, stop_on_call?, stop_on_ret?)`
|
|
340
|
-
轻量级符号执行。解释指令语义而不实际执行。
|
|
341
|
-
|
|
342
|
-
**参数:**
|
|
343
|
-
- `address` (string, 必需): 起始地址
|
|
344
|
-
- `count` (integer, 可选): 要跟踪的指令数 (默认: 30)
|
|
345
|
-
- `initial_state` (object, 可选): 初始寄存器符号,如 `{"rcx": "this_ptr", "rdx": "arg1"}`
|
|
346
|
-
|
|
347
|
-
#### `ce_call_function(address, args?, return_type?, timeout?)`
|
|
348
|
-
在目标进程中调用函数。**警告: 执行真实代码!**
|
|
349
|
-
|
|
350
|
-
---
|
|
351
|
-
|
|
352
|
-
### 函数 Hook
|
|
353
|
-
|
|
354
|
-
#### `ce_hook_function(address, name, capture_args?, calling_convention?)`
|
|
355
|
-
Hook 函数以拦截调用并捕获参数。
|
|
356
|
-
|
|
357
|
-
**参数:**
|
|
358
|
-
- `address` (string, 必需): 函数地址
|
|
359
|
-
- `name` (string, 必需): Hook 标识符
|
|
360
|
-
- `capture_args` (integer, 可选): 要捕获的参数数量 0-4 (默认: 4)
|
|
361
|
-
- `calling_convention` (string, 可选): `"auto"`, `"fastcall"`, `"stdcall"`, `"cdecl"`
|
|
362
|
-
|
|
363
|
-
#### `ce_get_hook_log(name, limit?, clear?)`
|
|
364
|
-
获取捕获的函数调用参数。
|
|
365
|
-
|
|
366
|
-
#### `ce_unhook_function(name)`
|
|
367
|
-
移除函数 Hook。
|
|
368
|
-
|
|
369
|
-
#### `ce_list_hooks`
|
|
370
|
-
列出所有活动的 Hook。
|
|
371
|
-
|
|
372
|
-
---
|
|
373
|
-
|
|
374
|
-
### 作弊表
|
|
375
|
-
|
|
376
|
-
#### `ce_get_address_list(include_script?)`
|
|
377
|
-
获取作弊表中的所有记录。
|
|
378
|
-
|
|
379
|
-
#### `ce_add_address_record(description, address, value_type?, script?)`
|
|
380
|
-
向作弊表添加新记录。
|
|
381
|
-
|
|
382
|
-
---
|
|
383
|
-
|
|
384
|
-
## 推荐工作流
|
|
385
|
-
|
|
386
|
-
### 指针追踪
|
|
387
|
-
```
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
```
|
|
400
|
-
|
|
401
|
-
### 函数分析
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
```
|
|
412
|
-
|
|
413
|
-
### 逆向未知代码
|
|
414
|
-
```
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
---
|
|
429
|
-
|
|
430
|
-
## 故障排除
|
|
431
|
-
|
|
432
|
-
| 问题 | 解决方案 |
|
|
433
|
-
|------|----------|
|
|
434
|
-
| 连接失败 | 使用 `ce_ping` - 它会返回诊断信息和具体建议 |
|
|
435
|
-
| CE 重启 | MCP Server 自动重连,只需在 CE 中重新加载 Lua 脚本 |
|
|
436
|
-
| 管道错误 | 在 CE 中运行 `CE_MCP.stop()` 然后 `CE_MCP.start()` |
|
|
437
|
-
| 权限拒绝 | 以管理员身份运行 CE |
|
|
438
|
-
| 游戏卡住 | 使用 `ce_cleanup()` 移除所有断点 |
|
|
439
|
-
| 断点未触发 | 确保代码路径在游戏中被执行 |
|
|
440
|
-
|
|
441
|
-
## 状态检查
|
|
442
|
-
|
|
443
|
-
```lua
|
|
444
|
-
CE_MCP.stats() -- 在 CE 中检查桥接状态
|
|
445
|
-
reloadMcpBridge() -- 代码更改后重新加载桥接
|
|
446
|
-
```
|
|
447
|
-
|
|
448
|
-
## 参考
|
|
449
|
-
|
|
450
|
-
- [CE Wiki](https://wiki.cheatengine.org/)
|
|
1
|
+
[English](README.md) | 中文
|
|
2
|
+
|
|
3
|
+
# Cheat Engine MCP - AI 辅助逆向工程
|
|
4
|
+
|
|
5
|
+
MCP 桥接器,让 AI 助手直接控制 Cheat Engine 进行游戏修改和逆向工程。
|
|
6
|
+
|
|
7
|
+
## 架构
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
AI <--MCP/JSON-RPC--> ce_mcp_server.py <--命名管道--> ce_mcp_bridge.lua (CE)
|
|
11
|
+
↑
|
|
12
|
+
后台自动重连
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 安装
|
|
16
|
+
|
|
17
|
+
### 快速开始 (NPX) - 推荐
|
|
18
|
+
|
|
19
|
+
1. **安装依赖**: `pip install pywin32`
|
|
20
|
+
|
|
21
|
+
2. **在 CE 中加载** (二选一):
|
|
22
|
+
- **自动加载**: 将 `ce_mcp_bridge.lua` 复制到 CE 的 `autorun` 文件夹 (如 `D:\Cheat Engine\autorun\`)
|
|
23
|
+
- **手动加载**: 按 `Ctrl+Alt+L`,执行:
|
|
24
|
+
```lua
|
|
25
|
+
dofile([[D:\path\to\ce_mcp_bridge.lua]])
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
3. **配置 MCP** (`.kiro/settings/mcp.json`):
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"mcpServers": {
|
|
32
|
+
"cheat-engine": {
|
|
33
|
+
"command": "npx",
|
|
34
|
+
"args": ["--yes", "cheatengine"]
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 手动安装 (本地运行)
|
|
41
|
+
|
|
42
|
+
如果你希望从源码运行:
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"mcpServers": {
|
|
47
|
+
"cheat-engine": {
|
|
48
|
+
"command": "python",
|
|
49
|
+
"args": ["D:/path/to/ce_mcp/ce_mcp_server.py"]
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## 连接特性
|
|
56
|
+
|
|
57
|
+
- **自动重连**: CE 重启后 MCP Server 自动重连
|
|
58
|
+
- **后台重试**: 连接尝试在后台进行,使用指数退避
|
|
59
|
+
- **失败诊断**: `ce_ping` 在连接失败时返回详细诊断信息
|
|
60
|
+
- **线程安全**: 所有管道操作都有锁保护
|
|
61
|
+
|
|
62
|
+
## 安全特性
|
|
63
|
+
|
|
64
|
+
### 认证令牌
|
|
65
|
+
|
|
66
|
+
可选的管道通信认证层。启用后,所有请求必须包含有效令牌。
|
|
67
|
+
|
|
68
|
+
**设置:**
|
|
69
|
+
1. 在两端设置相同的环境变量:
|
|
70
|
+
```bash
|
|
71
|
+
# Windows CMD
|
|
72
|
+
set CE_MCP_AUTH_TOKEN=your_secret_token_here
|
|
73
|
+
|
|
74
|
+
# PowerShell
|
|
75
|
+
$env:CE_MCP_AUTH_TOKEN = "your_secret_token_here"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
2. 启动 CE 并加载桥接脚本
|
|
79
|
+
3. 启动 MCP 服务器
|
|
80
|
+
|
|
81
|
+
令牌不匹配时,请求将被拒绝并返回 "Authentication failed" 错误。
|
|
82
|
+
|
|
83
|
+
### 自定义管道名称
|
|
84
|
+
|
|
85
|
+
为防止检测,可自定义管道名称:
|
|
86
|
+
```bash
|
|
87
|
+
set CE_MCP_PIPE_NAME=my_custom_pipe_name
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Hook 名称验证
|
|
91
|
+
|
|
92
|
+
Hook 名称现在会验证以防止 AA 脚本注入:
|
|
93
|
+
- 必须以字母或下划线开头
|
|
94
|
+
- 只能包含字母数字和下划线
|
|
95
|
+
- 模式: `^[a-zA-Z_][a-zA-Z0-9_]*$`
|
|
96
|
+
|
|
97
|
+
无效名称如 `"my hook"` 或 `"hook;inject"` 将被拒绝。
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 工具参考
|
|
102
|
+
|
|
103
|
+
### 系统与连接
|
|
104
|
+
|
|
105
|
+
#### `ce_ping`
|
|
106
|
+
测试与 CE 桥接的连接。**连接失败时返回诊断信息和故障排除建议。**
|
|
107
|
+
|
|
108
|
+
#### `ce_get_process_info`
|
|
109
|
+
获取已附加进程信息并刷新符号处理器。同时清除地址缓存。
|
|
110
|
+
|
|
111
|
+
#### `ce_attach_process(target)` ⭐ 新增
|
|
112
|
+
通过 PID 或名称附加到进程。附加后清除缓存和扫描会话。
|
|
113
|
+
|
|
114
|
+
**参数:**
|
|
115
|
+
- `target` (string, 必需): 进程 ID (数字) 或进程名称 (如 `"game.exe"`)
|
|
116
|
+
|
|
117
|
+
#### `ce_auto_assemble(script, target_self?)` ⭐ 新增
|
|
118
|
+
执行 Auto Assembler 脚本。支持启用/禁用脚本、代码注入等。
|
|
119
|
+
|
|
120
|
+
**参数:**
|
|
121
|
+
- `script` (string, 必需): Auto Assembler 脚本内容
|
|
122
|
+
- `target_self` (boolean, 可选): 目标为 CE 进程本身 (默认: false)
|
|
123
|
+
|
|
124
|
+
#### `ce_execute_lua(code)`
|
|
125
|
+
在 CE 中执行任意 Lua 代码。
|
|
126
|
+
|
|
127
|
+
**参数:**
|
|
128
|
+
- `code` (string, 必需): 要执行的 Lua 代码
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
### 内存读写
|
|
133
|
+
|
|
134
|
+
#### `ce_read_memory(address, type, size?)`
|
|
135
|
+
读取单个内存值。
|
|
136
|
+
|
|
137
|
+
**参数:**
|
|
138
|
+
- `address` (string, 必需): 地址表达式 (如 `"game.exe+0x1234"`, `"0x140001000"`)
|
|
139
|
+
- `type` (string, 必需): `byte`, `word`, `dword`, `qword`, `float`, `double`, `string`, `bytes`
|
|
140
|
+
- `size` (integer, 可选): string/bytes 类型的大小 (默认: 100)
|
|
141
|
+
|
|
142
|
+
#### `ce_read_memory_batch(requests)`
|
|
143
|
+
一次调用读取多个地址。**始终优先使用此方法而非多次调用 ce_read_memory。**
|
|
144
|
+
|
|
145
|
+
**参数:**
|
|
146
|
+
- `requests` (array, 必需): `{address, type, id?, size?}` 数组
|
|
147
|
+
|
|
148
|
+
#### `ce_write_memory(address, type, value)`
|
|
149
|
+
向内存写入值。
|
|
150
|
+
|
|
151
|
+
**参数:**
|
|
152
|
+
- `address` (string, 必需): 地址表达式
|
|
153
|
+
- `type` (string, 必需): 值类型
|
|
154
|
+
- `value` (string, 必需): 要写入的值
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
### 扫描与搜索
|
|
159
|
+
|
|
160
|
+
#### `ce_aob_scan(aob_string, module?, protection?, max_results?)`
|
|
161
|
+
扫描内存中的字节数组模式。支持 `??` 通配符。
|
|
162
|
+
|
|
163
|
+
**参数:**
|
|
164
|
+
- `aob_string` (string, 必需): 模式如 `"48 89 5C 24 ?? 48 83 EC 20"`
|
|
165
|
+
- `module` (string, 可选): 限制扫描到模块 (如 `"game.exe"`)
|
|
166
|
+
- `protection` (string, 可选): 内存保护标志 (默认: `"-C+X"`)
|
|
167
|
+
- `max_results` (integer, 可选): 最大结果数 (默认: 100)
|
|
168
|
+
|
|
169
|
+
#### `ce_value_scan(value, type, module?, protection?)`
|
|
170
|
+
扫描特定值。用于指针追踪。**一次性扫描 - 迭代扫描请使用扫描会话。**
|
|
171
|
+
|
|
172
|
+
**参数:**
|
|
173
|
+
- `value` (string, 必需): 要搜索的值 (如 `"0x255D5E758"` 或 `"12345"`)
|
|
174
|
+
- `type` (string, 必需): `byte`, `word`, `dword`, `qword`, `float`, `double`, `string`
|
|
175
|
+
- `module` (string, 可选): 限制到模块
|
|
176
|
+
- `protection` (string, 可选): 默认 `"+W-C"` 用于可写内存
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
### 扫描会话 ⭐ 新增
|
|
181
|
+
|
|
182
|
+
实现 CE 核心的 "首次扫描 → 再次扫描" 工作流,带会话管理。会话在 5 分钟不活动后自动过期。
|
|
183
|
+
|
|
184
|
+
#### `ce_scan_new(value, type, module?, protection?)`
|
|
185
|
+
开始新的扫描会话。
|
|
186
|
+
|
|
187
|
+
#### `ce_scan_next(session_id, value, scan_type?, value2?)`
|
|
188
|
+
继续扫描(过滤)现有会话。
|
|
189
|
+
|
|
190
|
+
**scan_type 选项:**
|
|
191
|
+
- `exact` - 精确值匹配
|
|
192
|
+
- `increased` / `decreased` - 值增加/减少
|
|
193
|
+
- `changed` / `unchanged` - 值改变/未改变
|
|
194
|
+
- `bigger_than` / `smaller_than` - 大于/小于
|
|
195
|
+
- `between` - 在 value 和 value2 之间
|
|
196
|
+
|
|
197
|
+
#### `ce_scan_results(session_id, start_index?, limit?)`
|
|
198
|
+
获取扫描会话的分页结果。
|
|
199
|
+
|
|
200
|
+
#### `ce_scan_close(session_id)`
|
|
201
|
+
关闭扫描会话并释放资源。
|
|
202
|
+
|
|
203
|
+
#### `ce_scan_list`
|
|
204
|
+
列出所有活动的扫描会话。
|
|
205
|
+
|
|
206
|
+
#### `ce_enum_modules`
|
|
207
|
+
列出所有已加载的模块 (DLL)。
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
### 符号与地址
|
|
212
|
+
|
|
213
|
+
#### `ce_get_address(expression)`
|
|
214
|
+
将地址表达式解析为数字地址。
|
|
215
|
+
|
|
216
|
+
**参数:**
|
|
217
|
+
- `expression` (string, 必需): 如 `"game.exe+0x1234"`, `"[[game.exe+100]+20]+8"`
|
|
218
|
+
|
|
219
|
+
#### `ce_get_symbol(address, include_module?)`
|
|
220
|
+
从地址获取符号名称,包含 RTTI 类信息。
|
|
221
|
+
|
|
222
|
+
#### `ce_resolve_pointer(base, offsets, read_value?, value_type?)`
|
|
223
|
+
解析多级指针链,支持 CE 表示法。
|
|
224
|
+
|
|
225
|
+
**参数:**
|
|
226
|
+
- `base` (string, 必需): 基地址或符号 (如 `"game.exe+1234"`)
|
|
227
|
+
- `offsets` (array, 必需): 偏移数组,如 `[0x100, 0x20, 0x8]`
|
|
228
|
+
- `read_value` (boolean, 可选): 读取最终地址的值 (默认: false)
|
|
229
|
+
- `value_type` (string, 可选): 值类型 (默认: "dword")
|
|
230
|
+
|
|
231
|
+
**返回:** 包含 `ceNotation` (CE 兼容指针表示法),可直接用于 CE 地址列表。
|
|
232
|
+
|
|
233
|
+
#### `ce_auto_guess(address)`
|
|
234
|
+
猜测地址处的值类型。
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
### 反汇编与代码分析
|
|
239
|
+
|
|
240
|
+
#### `ce_disassemble(address, count?, direction?)`
|
|
241
|
+
反汇编指令。
|
|
242
|
+
|
|
243
|
+
**参数:**
|
|
244
|
+
- `address` (string, 必需): 起始地址
|
|
245
|
+
- `count` (integer, 可选): 指令数量 (默认: 10)
|
|
246
|
+
- `direction` (string, 可选): `"forward"` 或 `"backward"` (默认: forward)
|
|
247
|
+
|
|
248
|
+
#### `ce_get_instruction_info(address)`
|
|
249
|
+
获取单条指令的详细信息。
|
|
250
|
+
|
|
251
|
+
#### `ce_analyze_code(address, count?)`
|
|
252
|
+
代码块的静态分析 (调用、跳转、引用)。
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
### 调试与断点
|
|
257
|
+
|
|
258
|
+
#### `ce_set_breakpoint(address, type?, size?)`
|
|
259
|
+
设置硬件断点。
|
|
260
|
+
|
|
261
|
+
**参数:**
|
|
262
|
+
- `address` (string, 必需): 地址表达式
|
|
263
|
+
- `type` (string, 可选): `"execute"`, `"write"`, `"access"` (默认: execute)
|
|
264
|
+
- `size` (integer, 可选): write/access 断点的大小 (默认: 1)
|
|
265
|
+
|
|
266
|
+
#### `ce_break_and_get_regs(address, timeout?, include_xmm?, stack_depth?)`
|
|
267
|
+
设置断点并在触发时捕获寄存器。同时返回调用栈。
|
|
268
|
+
|
|
269
|
+
#### `ce_break_and_trace(address, max_steps?, timeout?, stop_on_ret?, trace_into_call?, end_address?, initial_regs?)`
|
|
270
|
+
**多步执行跟踪。** 最强大的调试工具 - 逐步跟踪代码执行,捕获每条指令的完整寄存器状态。
|
|
271
|
+
|
|
272
|
+
**参数:**
|
|
273
|
+
- `address` (string, 必需): 起始地址 (断点位置)
|
|
274
|
+
- `max_steps` (integer, 可选): 最大跟踪指令数 (默认: 100)
|
|
275
|
+
- `timeout` (integer, 可选): 超时毫秒数 (默认: 10000)
|
|
276
|
+
- `stop_on_ret` (boolean, 可选): 遇到 `ret` 时停止 (默认: true)
|
|
277
|
+
- `trace_into_call` (boolean, 可选): 步入调用 vs 步过 (默认: false)
|
|
278
|
+
- `end_address` (string, 可选): 到达此地址时停止
|
|
279
|
+
- `initial_regs` (object, 可选): 首次命中时设置寄存器值
|
|
280
|
+
|
|
281
|
+
**停止原因:** `"ret"`, `"end_address"`, `"max_steps"`, `"timeout"`
|
|
282
|
+
|
|
283
|
+
#### `ce_cleanup`
|
|
284
|
+
移除所有断点和跟踪。游戏卡住时使用。
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
### 分析工具
|
|
289
|
+
|
|
290
|
+
#### `ce_find_what_accesses(address, size?, duration_ms?, max_records?)`
|
|
291
|
+
查找访问此地址的代码 (类似 CE 的 F5 功能)。监控读写。
|
|
292
|
+
|
|
293
|
+
#### `ce_find_what_writes(address, size?, duration_ms?, max_records?)`
|
|
294
|
+
查找写入此地址的代码 (类似 CE 的 F6 功能)。仅监控写入。
|
|
295
|
+
|
|
296
|
+
#### `ce_find_pointer_path(address, max_depth?, strategy?)`
|
|
297
|
+
**自动指针链追踪。** 为动态地址找到静态基地址。
|
|
298
|
+
|
|
299
|
+
**参数:**
|
|
300
|
+
- `address` (string, 必需): 要追踪的动态地址
|
|
301
|
+
- `max_depth` (integer, 可选): 最大指针深度 1-10 (默认: 7)
|
|
302
|
+
- `strategy` (string, 可选): `"hybrid"`, `"f5"`, `"value_scan"` (默认: hybrid)
|
|
303
|
+
|
|
304
|
+
#### `ce_find_references(address, limit?)`
|
|
305
|
+
查找引用特定地址的所有代码位置。
|
|
306
|
+
|
|
307
|
+
#### `ce_find_call_references(address, module?, limit?)`
|
|
308
|
+
查找目标为特定函数的所有 CALL 指令。
|
|
309
|
+
|
|
310
|
+
#### `ce_find_function_boundaries(address, max_search?)`
|
|
311
|
+
通过分析序言/尾声模式检测函数起止。
|
|
312
|
+
|
|
313
|
+
#### `ce_generate_signature(address)`
|
|
314
|
+
为地址生成唯一的 AOB 特征码。用于游戏更新。
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
### 高级分析
|
|
319
|
+
|
|
320
|
+
#### `ce_build_cfg(address, max_blocks?, max_instructions?, detect_loops?)`
|
|
321
|
+
为函数构建控制流图。
|
|
322
|
+
|
|
323
|
+
#### `ce_detect_patterns(address, max_instructions?, patterns?)`
|
|
324
|
+
检测常见代码模式: switch 表、虚函数调用、字符串引用、加密常量。
|
|
325
|
+
|
|
326
|
+
#### `ce_compare_functions(address1, address2, max_instructions?)`
|
|
327
|
+
比较两个函数的相似度。
|
|
328
|
+
|
|
329
|
+
#### `ce_trace_dataflow(address, register, direction?, max_instructions?)`
|
|
330
|
+
在函数内追踪寄存器的数据流。
|
|
331
|
+
|
|
332
|
+
#### `ce_program_slice(address, criterion, direction?, max_instructions?)`
|
|
333
|
+
计算程序切片 - 查找影响或受变量影响的所有指令。
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
### 代码模拟
|
|
338
|
+
|
|
339
|
+
#### `ce_symbolic_trace(address, count?, initial_state?, stop_on_call?, stop_on_ret?)`
|
|
340
|
+
轻量级符号执行。解释指令语义而不实际执行。
|
|
341
|
+
|
|
342
|
+
**参数:**
|
|
343
|
+
- `address` (string, 必需): 起始地址
|
|
344
|
+
- `count` (integer, 可选): 要跟踪的指令数 (默认: 30)
|
|
345
|
+
- `initial_state` (object, 可选): 初始寄存器符号,如 `{"rcx": "this_ptr", "rdx": "arg1"}`
|
|
346
|
+
|
|
347
|
+
#### `ce_call_function(address, args?, return_type?, timeout?)`
|
|
348
|
+
在目标进程中调用函数。**警告: 执行真实代码!**
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
### 函数 Hook
|
|
353
|
+
|
|
354
|
+
#### `ce_hook_function(address, name, capture_args?, calling_convention?)`
|
|
355
|
+
Hook 函数以拦截调用并捕获参数。
|
|
356
|
+
|
|
357
|
+
**参数:**
|
|
358
|
+
- `address` (string, 必需): 函数地址
|
|
359
|
+
- `name` (string, 必需): Hook 标识符
|
|
360
|
+
- `capture_args` (integer, 可选): 要捕获的参数数量 0-4 (默认: 4)
|
|
361
|
+
- `calling_convention` (string, 可选): `"auto"`, `"fastcall"`, `"stdcall"`, `"cdecl"`
|
|
362
|
+
|
|
363
|
+
#### `ce_get_hook_log(name, limit?, clear?)`
|
|
364
|
+
获取捕获的函数调用参数。
|
|
365
|
+
|
|
366
|
+
#### `ce_unhook_function(name)`
|
|
367
|
+
移除函数 Hook。
|
|
368
|
+
|
|
369
|
+
#### `ce_list_hooks`
|
|
370
|
+
列出所有活动的 Hook。
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
### 作弊表
|
|
375
|
+
|
|
376
|
+
#### `ce_get_address_list(include_script?)`
|
|
377
|
+
获取作弊表中的所有记录。
|
|
378
|
+
|
|
379
|
+
#### `ce_add_address_record(description, address, value_type?, script?)`
|
|
380
|
+
向作弊表添加新记录。
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## 推荐工作流
|
|
385
|
+
|
|
386
|
+
### 指针追踪
|
|
387
|
+
```python
|
|
388
|
+
# 自动 (首选)
|
|
389
|
+
result = ce_find_pointer_path(address="0x255D5E758")
|
|
390
|
+
# 返回: base_address, offsets, ce_pointer_notation
|
|
391
|
+
|
|
392
|
+
# 手动 (自动失败时)
|
|
393
|
+
# 1. 查找访问该地址的代码
|
|
394
|
+
accesses = ce_find_what_accesses(address="0x255D5E758")
|
|
395
|
+
# 2. 获取寄存器值 (如 rcx = 0x255D5E658)
|
|
396
|
+
# 3. 搜索存储该值的指针
|
|
397
|
+
pointers = ce_value_scan(value="0x255D5E658", type="qword")
|
|
398
|
+
# 4. 重复直到找到 game.exe+offset
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### 函数分析
|
|
402
|
+
```python
|
|
403
|
+
# 1. 查找函数边界
|
|
404
|
+
bounds = ce_find_function_boundaries(address="0x14587EDB0")
|
|
405
|
+
|
|
406
|
+
# 2. 跟踪执行
|
|
407
|
+
trace = ce_break_and_trace(address="0x14587EDB0", max_steps=100)
|
|
408
|
+
|
|
409
|
+
# 3. 生成特征码用于更新
|
|
410
|
+
sig = ce_generate_signature(address="0x14587EDB0")
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### 逆向未知代码
|
|
414
|
+
```python
|
|
415
|
+
# 1. 反汇编
|
|
416
|
+
code = ce_disassemble(address="0x14587EDB0", count=20)
|
|
417
|
+
|
|
418
|
+
# 2. 符号跟踪理解逻辑
|
|
419
|
+
symbolic = ce_symbolic_trace(address="0x14587EDB0", initial_state={"rcx": "this"})
|
|
420
|
+
|
|
421
|
+
# 3. 为复杂函数构建 CFG
|
|
422
|
+
cfg = ce_build_cfg(address="0x14587EDB0")
|
|
423
|
+
|
|
424
|
+
# 4. 检测模式
|
|
425
|
+
patterns = ce_detect_patterns(address="0x14587EDB0")
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
## 故障排除
|
|
431
|
+
|
|
432
|
+
| 问题 | 解决方案 |
|
|
433
|
+
|------|----------|
|
|
434
|
+
| 连接失败 | 使用 `ce_ping` - 它会返回诊断信息和具体建议 |
|
|
435
|
+
| CE 重启 | MCP Server 自动重连,只需在 CE 中重新加载 Lua 脚本 |
|
|
436
|
+
| 管道错误 | 在 CE 中运行 `CE_MCP.stop()` 然后 `CE_MCP.start()` |
|
|
437
|
+
| 权限拒绝 | 以管理员身份运行 CE |
|
|
438
|
+
| 游戏卡住 | 使用 `ce_cleanup()` 移除所有断点 |
|
|
439
|
+
| 断点未触发 | 确保代码路径在游戏中被执行 |
|
|
440
|
+
|
|
441
|
+
## 状态检查
|
|
442
|
+
|
|
443
|
+
```lua
|
|
444
|
+
CE_MCP.stats() -- 在 CE 中检查桥接状态
|
|
445
|
+
reloadMcpBridge() -- 代码更改后重新加载桥接
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
## 参考
|
|
449
|
+
|
|
450
|
+
- [CE Wiki](https://wiki.cheatengine.org/)
|
package/ce_mcp_server.js
CHANGED
|
@@ -9,6 +9,9 @@ const { Config, TimeoutManager, MetricsCollector, log } = require('./src/base');
|
|
|
9
9
|
const { PipeClient } = require('./src/pipe-client');
|
|
10
10
|
const { ToolRegistry } = require('./src/tool-registry');
|
|
11
11
|
|
|
12
|
+
// Get version from package.json
|
|
13
|
+
const PACKAGE_VERSION = require('./package.json').version;
|
|
14
|
+
|
|
12
15
|
// ============ MCP Server ============
|
|
13
16
|
class CEMCPServer {
|
|
14
17
|
constructor() {
|
|
@@ -189,7 +192,7 @@ class CEMCPServer {
|
|
|
189
192
|
result: {
|
|
190
193
|
protocolVersion: '2024-11-05',
|
|
191
194
|
capabilities: { tools: {} },
|
|
192
|
-
serverInfo: { name: 'cheatengine-mcp-bridge', version:
|
|
195
|
+
serverInfo: { name: 'cheatengine-mcp-bridge', version: PACKAGE_VERSION },
|
|
193
196
|
instructions: (
|
|
194
197
|
'# Cheat Engine MCP - AI Usage Guide\n\n' +
|
|
195
198
|
'## Tool Selection Decision Tree\n\n' +
|