本帖最后由 wjx8885577 于 2026-4-23 09:47 编辑
Cheat Engine MCP - AI 辅助逆向工程
MCP 桥接器,让 AI 助手直接控制 Cheat Engine 进行游戏修改和逆向工程。
架构
AI <--MCP/JSON-RPC--> ce_mcp_server.js <--命名管道--> ce_mcp_bridge.lua (CE)
↑
后台自动重连
安装
快速开始 (NPX) - 推荐
-
前提条件: Node.js 14+ (无需其他依赖项)
-
在 CE 中加载 (二选一):
-
配置 MCP :
{
"mcpServers": {
"cheat-engine": {
"command": "npx",
"args": ["-y", "cheatengine@latest"]
}
}
}
手动安装 (本地运行)
如果你希望从源码运行:
{
"mcpServers": {
"cheat-engine": {
"command": "node",
"args": ["D:/path/to/ce_mcp/ce_mcp_server.js"]
}
}
}
连接特性
- 自动重连: CE 重启后 MCP Server 自动重连
- 后台重试: 连接尝试在后台进行,使用指数退避
- 失败诊断:
ce_ping 在连接失败时返回详细诊断信息
- 线程安全: 所有管道操作都有锁保护
安全特性
认证令牌
可选的管道通信认证层。启用后,所有请求必须包含有效令牌。
设置:
-
在两端设置相同的环境变量:
# Windows CMD
set CE_MCP_AUTH_TOKEN=your_secret_token_here
# PowerShell
$env:CE_MCP_AUTH_TOKEN = "your_secret_token_here"
-
启动 CE 并加载桥接脚本
-
启动 MCP 服务器
令牌不匹配时,请求将被拒绝并返回 "Authentication failed" 错误。
自定义管道名称
为防止检测,可自定义管道名称:
set CE_MCP_PIPE_NAME=my_custom_pipe_name
Hook 名称验证
Hook 名称现在会验证以防止 AA 脚本注入:
- 必须以字母或下划线开头
- 只能包含字母数字和下划线
- 模式:
^[a-zA-Z_][a-zA-Z0-9_]*$
无效名称如 "my hook" 或 "hook;inject" 将被拒绝。
工具参考
系统与连接
ce_ping
测试与 CE 桥接的连接。连接失败时返回诊断信息和故障排除建议。
ce_get_process_info
获取已附加进程信息并刷新符号处理器。同时清除地址缓存。
ce_attach_process(target) ⭐ 新增
通过 PID 或名称附加到进程。附加后清除缓存和扫描会话。
参数:
target (string, 必需): 进程 ID (数字) 或进程名称 (如 "game.exe")
ce_auto_assemble(script, target_self?) ⭐ 新增
执行 Auto Assembler 脚本。支持启用/禁用脚本、代码注入等。
参数:
script (string, 必需): Auto Assembler 脚本内容
target_self (boolean, 可选): 目标为 CE 进程本身 (默认: false)
ce_execute_lua(code)
在 CE 中执行任意 Lua 代码。
参数:
code (string, 必需): 要执行的 Lua 代码
内存读写
ce_read_memory(address, type, size?)
读取单个内存值。
参数:
address (string, 必需): 地址表达式 (如 "game.exe+0x1234", "0x140001000")
type (string, 必需): byte, word, dword, qword, float, double, string, bytes
size (integer, 可选): string/bytes 类型的大小 (默认: 100)
ce_read_memory_batch(requests)
一次调用读取多个地址。始终优先使用此方法而非多次调用 ce_read_memory。
参数:
requests (array, 必需): {address, type, id?, size?} 数组
ce_write_memory(address, type, value)
向内存写入值。
参数:
address (string, 必需): 地址表达式
type (string, 必需): 值类型
value (string, 必需): 要写入的值
扫描与搜索
ce_aob_scan(aob_string, module?, protection?, start?, stop?, max_results?)
扫描内存中的字节数组模式。支持 ?? 通配符。
参数:
aob_string (string, 必需): 模式如 "48 89 5C 24 ?? 48 83 EC 20"
module (string, 可选): 限制扫描到模块 (如 "game.exe")
protection (string, 可选): 内存保护标志 (默认: "-C+X")
start (string, 可选): 起始地址(未指定 module 时使用)
stop (string, 可选): 结束地址(未指定 module 时使用)
max_results (integer, 可选): 最大结果数 (默认: 100)
ce_value_scan(value, type, module?, protection?)
扫描特定值。用于指针追踪。根据类型自动对齐扫描以优化性能。一次性扫描 - 迭代扫描请使用扫描会话。
参数:
value (string, 必需): 要搜索的值 (如 "0x255D5E758" 或 "12345")
type (string, 必需): byte, word, dword, qword, float, double, string
module (string, 可选): 限制到模块
protection (string, 可选): 默认 "+W-C" 用于可写内存
扫描会话 ⭐ 新增
实现 CE 核心的 "首次扫描 → 再次扫描" 工作流,带会话管理。会话在 5 分钟不活动后自动过期。
ce_scan_new(value, type, module?, protection?)
开始新的扫描会话。根据类型自动对齐扫描以优化性能(dword/float 用 4 字节对齐,qword/double 用 8 字节对齐)。
ce_scan_next(session_id, value, scan_type?, value2?)
继续扫描(过滤)现有会话。
scan_type 选项:
exact - 精确值匹配
increased / decreased - 值增加/减少
changed / unchanged - 值改变/未改变
bigger_than / smaller_than - 大于/小于
between - 在 value 和 value2 之间
ce_scan_results(session_id, start_index?, limit?)
获取扫描会话的分页结果。
ce_scan_close(session_id)
关闭扫描会话并释放资源。
ce_scan_list
列出所有活动的扫描会话。
ce_enum_modules
列出所有已加载的模块 (DLL)。
符号与地址
ce_get_address(expression)
将地址表达式解析为数字地址。
参数:
expression (string, 必需): 如 "game.exe+0x1234", "[[game.exe+100]+20]+8"
ce_get_symbol(address, include_module?)
从地址获取符号名称,包含 RTTI 类信息。
ce_resolve_pointer(base, offsets, read_value?, value_type?)
解析多级指针链,支持 CE 表示法。
参数:
base (string, 必需): 基地址或符号 (如 "game.exe+1234")
offsets (array, 必需): 偏移数组,如 [0x100, 0x20, 0x8]
read_value (boolean, 可选): 读取最终地址的值 (默认: false)
value_type (string, 可选): 值类型 (默认: "dword")
返回: 包含 ceNotation (CE 兼容指针表示法),可直接用于 CE 地址列表。
ce_auto_guess(address)
猜测地址处的值类型。
反汇编与代码分析
ce_disassemble(address, count?, direction?)
反汇编指令。
参数:
address (string, 必需): 起始地址
count (integer, 可选): 指令数量 (默认: 10)
direction (string, 可选): "forward" 或 "backward" (默认: forward)
ce_get_instruction_info(address)
获取单条指令的详细信息。
ce_analyze_code(address, count?)
代码块的静态分析 (调用、跳转、引用)。
调试与断点
ce_set_breakpoint(address, type?, size?)
设置硬件断点。
参数:
address (string, 必需): 地址表达式
type (string, 可选): "execute", "write", "access" (默认: execute)
size (integer, 可选): write/access 断点的大小 (默认: 1)
ce_break_and_get_regs(address, timeout?, include_xmm?, stack_depth?)
设置断点并在触发时捕获寄存器。同时返回调用栈。
ce_break_and_trace(address, max_steps?, timeout?, stop_on_ret?, trace_into_call?, end_address?, initial_regs?)
多步执行跟踪。 最强大的调试工具 - 逐步跟踪代码执行,捕获每条指令的完整寄存器状态。
参数:
address (string, 必需): 起始地址 (断点位置)
max_steps (integer, 可选): 最大跟踪指令数 (默认: 100)
timeout (integer, 可选): 超时毫秒数 (默认: 10000)
stop_on_ret (boolean, 可选): 遇到 ret 时停止 (默认: true)
trace_into_call (boolean, 可选): 步入调用 vs 步过 (默认: false)
end_address (string, 可选): 到达此地址时停止
initial_regs (object, 可选): 首次命中时设置寄存器值
停止原因: "ret", "end_address", "max_steps", "timeout"
ce_cleanup
移除所有断点和跟踪。游戏卡住时使用。
分析工具
ce_find_what_accesses(address, size?, duration_ms?, max_records?)
查找访问此地址的代码 (类似 CE 的 F5 功能)。监控读写。
ce_find_what_writes(address, size?, duration_ms?, max_records?)
查找写入此地址的代码 (类似 CE 的 F6 功能)。仅监控写入。
ce_find_pointer_path(address, max_depth?, strategy?)
自动指针链追踪。 为动态地址找到静态基地址。
参数:
address (string, 必需): 要追踪的动态地址
max_depth (integer, 可选): 最大指针深度 1-10 (默认: 7)
strategy (string, 可选): "hybrid", "f5", "value_scan" (默认: hybrid)
ce_find_references(address, limit?)
查找引用特定地址的所有代码位置。
ce_find_call_references(address, module?, limit?)
查找目标为特定函数的所有 CALL 指令。
ce_find_function_boundaries(address, max_search?)
通过分析序言/尾声模式检测函数起止。
ce_generate_signature(address)
为地址生成唯一的 AOB 特征码。用于游戏更新。
高级分析
ce_build_cfg(address, max_blocks?, max_instructions?, detect_loops?)
为函数构建控制流图。
ce_detect_patterns(address, max_instructions?, patterns?)
检测常见代码模式: switch 表、虚函数调用、字符串引用、加密常量。
ce_compare_functions(address1, address2, max_instructions?)
比较两个函数的相似度。
ce_trace_dataflow(address, register, direction?, max_instructions?)
在函数内追踪寄存器的数据流。
ce_program_slice(address, criterion, direction?, max_instructions?)
计算程序切片 - 查找影响或受变量影响的所有指令。
代码模拟
ce_symbolic_trace(address, count?, initial_state?, stop_on_call?, stop_on_ret?)
轻量级符号执行。解释指令语义而不实际执行。
参数:
address (string, 必需): 起始地址
count (integer, 可选): 要跟踪的指令数 (默认: 30)
initial_state (object, 可选): 初始寄存器符号,如 {"rcx": "this_ptr", "rdx": "arg1"}
ce_call_function(address, args?, return_type?, timeout?)
在目标进程中调用函数。警告: 执行真实代码!
函数 Hook
ce_hook_function(address, name, capture_args?, calling_convention?)
Hook 函数以拦截调用并捕获参数。
参数:
address (string, 必需): 函数地址
name (string, 必需): Hook 标识符
capture_args (integer, 可选): 要捕获的参数数量 0-4 (默认: 4)
calling_convention (string, 可选): "auto", "fastcall", "stdcall", "cdecl"
ce_get_hook_log(name, limit?, clear?)
获取捕获的函数调用参数。
ce_unhook_function(name)
移除函数 Hook。
ce_list_hooks
列出所有活动的 Hook。
作弊表
ce_get_address_list(include_script?)
获取作弊表中的所有记录。
ce_add_address_record(description, address, value_type?, script?)
向作弊表添加新记录。
推荐工作流
指针追踪
// 自动 (首选)
{"name": "ce_find_pointer_path", "arguments": {"address": "0x255D5E758", "user_prompted": true}}
// 返回: base_address, offsets, ce_pointer_notation
// 手动 (自动失败时)
// 1. 查找访问该地址的代码
{"name": "ce_find_what_accesses", "arguments": {"address": "0x255D5E758", "user_prompted": true}}
// 2. 从结果获取寄存器值 (如 RBX=0x255D5E658)
// 3. 搜索存储该值的指针
{"name": "ce_value_scan", "arguments": {"value": "0x255D5E658", "type": "qword"}}
// 4. 重复直到找到 game.exe+offset
函数分析
// 1. 查找函数边界
{"name": "ce_find_function_boundaries", "arguments": {"address": "0x14587EDB0"}}
// 2. 跟踪执行
{"name": "ce_break_and_trace", "arguments": {"address": "0x14587EDB0", "max_steps": 100}}
// 3. 生成特征码用于更新
{"name": "ce_generate_signature", "arguments": {"address": "0x14587EDB0"}}
逆向未知代码
// 1. 反汇编
{"name": "ce_disassemble", "arguments": {"address": "0x14587EDB0", "count": 20}}
// 2. 符号跟踪理解逻辑
{"name": "ce_symbolic_trace", "arguments": {"address": "0x14587EDB0", "initial_state": {"rcx": "this"}}}
// 3. 为复杂函数构建 CFG
{"name": "ce_build_cfg", "arguments": {"address": "0x14587EDB0"}}
// 4. 检测模式
{"name": "ce_detect_patterns", "arguments": {"address": "0x14587EDB0"}}
故障排除
| 问题 |
解决方案 |
| 连接失败 |
使用 ce_ping - 它会返回诊断信息和具体建议 |
| CE 重启 |
MCP Server 自动重连,只需在 CE 中重新加载 Lua 脚本 |
| 管道错误 |
在 CE 中运行 CE_MCP.stop() 然后 CE_MCP.start() |
| 权限拒绝 |
以管理员身份运行 CE |
| 游戏卡住 |
使用 ce_cleanup() 移除所有断点 |
| 断点未触发 |
确保代码路径在游戏中被执行 |
状态检查
CE_MCP.stats() -- 在 CE 中检查桥接状态
reloadMcpBridge() -- 代码更改后重新加载桥接
--------------------------------------------------------------------------------
# 常见问题
Q:需要学习 Lua 吗?
A:不需要,通过 AI 自然语言即可操作。
Q:支持哪些 AI 模型?
A:支持所有支持 MCP 协议的 AI(如 Claude)。
Q:能自动化游戏修改吗?
A:本工具为逆向分析工具,用于学习和研究。
Q:会封号吗?
A:本工具仅用于离线分析,不涉及联网操作。
--------------------------------------------------------------------------------
# 总结
CE MCP 通过 57 个精心设计的工具,将 Cheat Engine 的强大功能通过 MCP 协议暴露给 AI,
实现了自然语言驱动的逆向工程体验。
无论是初学者学习逆向,还是老手提高效率,都能从中受益。
🎉 享受 AI 辅助逆向后,你会发现逆向从未如此简单!
--------------------------------------------------------------------------------
ce_mcp.7z
(92.83 KB, 下载次数: 2046)
|