Loading...
Loading...
Compare original and translation side by side
Skill by ara.so — MCP Skills collection.
由ara.so开发的Skill — MCP Skills合集。
[[base+0x10]+0x20]+0x8AI Agent (Claude/Cursor)
↕ MCP Protocol (JSON-RPC over stdio)
Python MCP Server (mcp_cheatengine.py)
↕ Named Pipe (async)
Cheat Engine Lua Bridge (ce_mcp_bridge.lua)
↕ CE API
Target Process Memory[[base+0x10]+0x20]+0x8AI Agent (Claude/Cursor)
↕ MCP Protocol (JSON-RPC over stdio)
Python MCP Server (mcp_cheatengine.py)
↕ Named Pipe (async)
Cheat Engine Lua Bridge (ce_mcp_bridge.lua)
↕ CE API
Target Process Memorypywin32pywin32cd MCP_Server
pip install -r requirements.txtpip install mcp pywin32cd MCP_Server
pip install -r requirements.txtpip install mcp pywin32FileExecute ScriptMCP_Server/ce_mcp_bridge.luaExecuteTableShow Cheat Table Lua Scriptdofile([[C:\path\to\cheatengine-mcp-bridge\MCP_Server\ce_mcp_bridge.lua]])[MCP v12.0.0] MCP Server Listening on: CE_MCP_Bridge_v99文件执行脚本MCP_Server/ce_mcp_bridge.lua执行表格显示作弊表Lua脚本dofile([[C:\path\to\cheatengine-mcp-bridge\MCP_Server\ce_mcp_bridge.lua]])[MCP v12.0.0] MCP Server Listening on: CE_MCP_Bridge_v99~/.config/claude/claude_desktop_config.json{
"mcpServers": {
"cheatengine": {
"command": "python",
"args": ["C:/path/to/cheatengine-mcp-bridge/MCP_Server/mcp_cheatengine.py"]
}
}
}.cursorrules{
"mcp": {
"servers": {
"cheatengine": {
"command": "python",
"args": ["C:/path/to/cheatengine-mcp-bridge/MCP_Server/mcp_cheatengine.py"]
}
}
}
}~/.codex/config.toml[mcp_servers.cheatengine]
command = "python"
args = ['C:\path\to\cheatengine-mcp-bridge\MCP_Server\mcp_cheatengine.py']~/.config/claude/claude_desktop_config.json{
"mcpServers": {
"cheatengine": {
"command": "python",
"args": ["C:/path/to/cheatengine-mcp-bridge/MCP_Server/mcp_cheatengine.py"]
}
}
}.cursorrules{
"mcp": {
"servers": {
"cheatengine": {
"command": "python",
"args": ["C:/path/to/cheatengine-mcp-bridge/MCP_Server/mcp_cheatengine.py"]
}
}
}
}~/.codex/config.toml[mcp_servers.cheatengine]
command = "python"
args = ['C:\path\to\cheatengine-mcp-bridge\MCP_Server\mcp_cheatengine.py']User: "Attach to notepad.exe"
Agent uses: open_process
Args: {"process_name": "notepad.exe"}Tool: get_process_list
Returns: [{"pid": 1234, "name": "game.exe"}, ...]Tool: create_process
Args: {"path": "C:\\Games\\game.exe"}Tool: get_process_info
Returns: {"pid": 5678, "name": "game.exe", "base_address": "0x400000"}用户:"附加到notepad.exe"
Agent调用:open_process
参数:{"process_name": "notepad.exe"}工具:get_process_list
返回:[{"pid": 1234, "name": "game.exe"}, ...]工具:create_process
参数:{"path": "C:\\Games\\game.exe"}工具:get_process_info
返回:{"pid": 5678, "name": "game.exe", "base_address": "0x400000"}Tool: read_integer
Args: {"address": "0x12345678"}
Returns: {"value": 15000}Tool: read_float
Args: {"address": "game.exe+0x1234", "is_double": false}
Returns: {"value": 100.5}Tool: read_string
Args: {"address": "0x400000", "length": 64}
Returns: {"value": "PlayerName"}Tool: read_pointer_chain
Args: {"base": "game.exe+0x1000", "offsets": [0x10, 0x20, 0x8]}
Returns: {"final_address": "0x789ABC", "value": 42}Tool: read_memory
Args: {"address": "0x400000", "size": 16}
Returns: {"hex": "4D5A90000300000004000000FFFF0000", "bytes": [77, 90, ...]}工具:read_integer
参数:{"address": "0x12345678"}
返回:{"value": 15000}工具:read_float
参数:{"address": "game.exe+0x1234", "is_double": false}
返回:{"value": 100.5}工具:read_string
参数:{"address": "0x400000", "length": 64}
返回:{"value": "PlayerName"}工具:read_pointer_chain
参数:{"base": "game.exe+0x1000", "offsets": [0x10, 0x20, 0x8]}
返回:{"final_address": "0x789ABC", "value": 42}工具:read_memory
参数:{"address": "0x400000", "size": 16}
返回:{"hex": "4D5A90000300000004000000FFFF0000", "bytes": [77, 90, ...]}Tool: scan_all
Args: {
"value_type": "4byte",
"scan_type": "exact",
"value": "15000",
"writable": true,
"executable": false
}
Returns: {"count": 47, "addresses": ["0x123000", "0x456000", ...]}Tool: next_scan
Args: {"value": "15100"}
Returns: {"count": 3, "addresses": ["0x123000", ...]}Tool: aob_scan
Args: {
"pattern": "48 8B 05 ?? ?? ?? ?? 48 85 C0",
"writable": false,
"executable": true
}
Returns: {"addresses": ["0x401000", "0x402500"]}Tool: pointer_scan
Args: {
"address": "0x789000",
"max_level": 5,
"max_offset": 4096
}
Returns: {"count": 12, "results": [{"base": "game.exe+0x1000", "offsets": [0x10, 0x8]}]}工具:scan_all
参数:{
"value_type": "4byte",
"scan_type": "exact",
"value": "15000",
"writable": true,
"executable": false
}
返回:{"count": 47, "addresses": ["0x123000", "0x456000", ...]}工具:next_scan
参数:{"value": "15100"}
返回:{"count": 3, "addresses": ["0x123000", ...]}工具:aob_scan
参数:{
"pattern": "48 8B 05 ?? ?? ?? ?? 48 85 C0",
"writable": false,
"executable": true
}
返回:{"addresses": ["0x401000", "0x402500"]}工具:pointer_scan
参数:{
"address": "0x789000",
"max_level": 5,
"max_offset": 4096
}
返回:{"count": 12, "results": [{"base": "game.exe+0x1000", "offsets": [0x10, 0x8]}]}Tool: disassemble
Args: {"address": "0x401000", "count": 10}
Returns: {
"instructions": [
{"address": "0x401000", "bytes": "55", "disassembly": "push rbp"},
{"address": "0x401001", "bytes": "4889E5", "disassembly": "mov rbp,rsp"}
]
}Tool: analyze_function
Args: {"address": "0x401000"}
Returns: {
"prologue": "push rbp; mov rbp,rsp",
"calls_count": 3,
"references": ["0x402000", "0x403000"]
}Tool: get_rtti_classname
Args: {"address": "0x500000"}
Returns: {"classname": "CPlayerInventory"}Tool: find_references
Args: {"address": "0x600000"}
Returns: {"count": 5, "references": ["0x401234", "0x402567"]}工具:disassemble
参数:{"address": "0x401000", "count": 10}
返回:{
"instructions": [
{"address": "0x401000", "bytes": "55", "disassembly": "push rbp"},
{"address": "0x401001", "bytes": "4889E5", "disassembly": "mov rbp,rsp"}
]
}工具:analyze_function
参数:{"address": "0x401000"}
返回:{
"prologue": "push rbp; mov rbp,rsp",
"calls_count": 3,
"references": ["0x402000", "0x403000"]
}工具:get_rtti_classname
参数:{"address": "0x500000"}
返回:{"classname": "CPlayerInventory"}工具:find_references
参数:{"address": "0x600000"}
返回:{"count": 5, "references": ["0x401234", "0x402567"]}Tool: dissect_structure
Args: {"address": "0x500000", "size": 256}
Returns: {
"fields": [
{"offset": "0x00", "type": "vtable", "value": "0x401000"},
{"offset": "0x08", "type": "int32", "value": 15},
{"offset": "0x10", "type": "pointer", "value": "0x600000"}
]
}工具:dissect_structure
参数:{"address": "0x500000", "size": 256}
返回:{
"fields": [
{"offset": "0x00", "type": "vtable", "value": "0x401000"},
{"offset": "0x08", "type": "int32", "value": 15},
{"offset": "0x10", "type": "pointer", "value": "0x600000"}
]
}Tool: set_breakpoint
Args: {
"address": "0x401000",
"type": "hardware",
"condition": "rax==5"
}Tool: set_data_breakpoint
Args: {"address": "0x789000", "size": 4, "type": "write"}Tool: start_dbvm_watch
Args: {"address": "0x401000"}Tool: what_writes
Args: {"address": "0x789000"}Tool: what_accesses
Args: {"address": "0x789000", "type": "read"}工具:set_breakpoint
参数:{
"address": "0x401000",
"type": "hardware",
"condition": "rax==5"
}工具:set_data_breakpoint
参数:{"address": "0x789000", "size": 4, "type": "write"}工具:start_dbvm_watch
参数:{"address": "0x401000"}工具:what_writes
参数:{"address": "0x789000"}工具:what_accesses
参数:{"address": "0x789000", "type": "read"}Tool: write_integer
Args: {"address": "0x123000", "value": 9999, "size": 4}Tool: write_memory
Args: {"address": "0x401000", "bytes": [0x90, 0x90, 0x90]}Tool: freeze_address
Args: {"address": "0x123000", "value": 1000, "description": "Player Health"}工具:write_integer
参数:{"address": "0x123000", "value": 9999, "size": 4}工具:write_memory
参数:{"address": "0x401000", "bytes": [0x90, 0x90, 0x90]}工具:freeze_address
参数:{"address": "0x123000", "value": 1000, "description": "Player Health"}Tool: inject_dll
Args: {"dll_path": "C:\\mods\\trainer.dll"}Tool: execute_code
Args: {
"code": "mov rax, 1; ret",
"address": "0x500000"
}Tool: auto_assemble
Args: {
"script": "[ENABLE]\nalloc(hook,128)\nhook:\n mov [health],#999\n ret"
}工具:inject_dll
参数:{"dll_path": "C:\\mods\\trainer.dll"}工具:execute_code
参数:{
"code": "mov rax, 1; ret",
"address": "0x500000"
}工具:auto_assemble
参数:{
"script": "[ENABLE]\nalloc(hook,128)\nhook:\n mov [health],#999\n ret"
}Tool: register_symbol
Args: {"name": "PlayerHealth", "address": "0x789000"}Tool: get_symbol_info
Args: {"symbol": "PlayerHealth"}
Returns: {"address": "0x789000", "type": "int32"}Tool: enable_windows_symbols
Args: {"enable": true}工具:register_symbol
参数:{"name": "PlayerHealth", "address": "0x789000"}工具:get_symbol_info
参数:{"symbol": "PlayerHealth"}
返回:{"address": "0x789000", "type": "int32"}工具:enable_windows_symbols
参数:{"enable": true}Tool: load_table
Args: {"path": "C:\\cheats\\game.CT"}Tool: save_table
Args: {"path": "C:\\cheats\\backup.CT"}Tool: get_address_list
Returns: [
{"description": "Health", "address": "0x789000", "value": 100},
{"description": "Gold", "address": "0x789100", "value": 5000}
]工具:load_table
参数:{"path": "C:\\cheats\\game.CT"}工具:save_table
参数:{"path": "C:\\cheats\\backup.CT"}工具:get_address_list
返回:[
{"description": "Health", "address": "0x789000", "value": 100},
{"description": "Gold", "address": "0x789100", "value": 5000}
]User: "Find my gold amount, it's currently 15000"
Agent workflow:
1. scan_all(value_type="4byte", value="15000")
→ Returns 47 addresses
User: "I bought something, gold is now 14750"
2. next_scan(value="14750")
→ Filters to 3 addresses
User: "What writes to the first one?"
3. set_data_breakpoint(address=results[0], type="write")
4. [User triggers gold change in game]
5. get_debug_info()
→ Returns instruction that modified gold
User: "Disassemble that function"
6. disassemble(address=breakpoint_address, count=50)
→ Shows full AddGold/SubtractGold logic用户:"找到我的金币数量,当前是15000"
Agent工作流:
1. scan_all(value_type="4byte", value="15000")
→ 返回47个地址
用户:"我买了东西,现在金币是14750"
2. next_scan(value="14750")
→ 过滤到3个地址
用户:"第一个地址是被什么代码写入的?"
3. set_data_breakpoint(address=results[0], type="write")
4. [用户在游戏中触发金币变化]
5. get_debug_info()
→ 返回修改金币的指令
用户:"反汇编这个函数"
6. disassemble(address=breakpoint_address, count=50)
→ 显示完整的增减金币逻辑User: "Find the player's coordinates"
Agent workflow:
1. scan_all(value_type="float", value="125.5") # Current X position
2. next_scan(value="126.3") # After moving
3. pointer_scan(address=result_address, max_level=5)
→ Finds: [[game.exe+0x1234]+0x18]+0x30
User: "Verify that pointer is stable"
4. read_pointer_chain(base="game.exe+0x1234", offsets=[0x18, 0x30])
5. register_symbol(name="PlayerX", address=final_address)用户:"找到玩家的坐标"
Agent工作流:
1. scan_all(value_type="float", value="125.5") # 当前X坐标
2. next_scan(value="126.3") # 移动后的值
3. pointer_scan(address=result_address, max_level=5)
→ 找到:[[game.exe+0x1234]+0x18]+0x30
用户:"验证这个指针是否稳定"
4. read_pointer_chain(base="game.exe+0x1234", offsets=[0x18, 0x30])
5. register_symbol(name="PlayerX", address=final_address)User: "I found the health function at 0x401000, make it update-resistant"
Agent workflow:
1. disassemble(address="0x401000", count=20)
2. analyze_function(address="0x401000")
3. Identify unique byte pattern with wildcards:
"48 8B 05 ?? ?? ?? ?? 48 85 C0 74 ?? 8B 40 ??"
4. aob_scan(pattern=generated_pattern)
→ Verify only 1 result
5. Returns AOB for use in trainer scripts用户:"我在0x401000找到生命值函数,生成一个能抵御版本更新的签名"
Agent工作流:
1. disassemble(address="0x401000", count=20)
2. analyze_function(address="0x401000")
3. 识别带通配符的唯一字节模式:
"48 8B 05 ?? ?? ?? ?? 48 85 C0 74 ?? 8B 40 ??"
4. aob_scan(pattern=generated_pattern)
→ 验证仅返回1个结果
5. 返回可用于修改器脚本的AOB签名User: "What's at address 0x500000?"
Agent workflow:
1. get_rtti_classname(address="0x500000")
→ "CPlayerInventory"
2. dissect_structure(address="0x500000", size=256)
→ 0x00: vtable
→ 0x08: itemCount (int32) = 15
→ 0x10: itemArray (pointer) = 0x600000
3. read_pointer_chain(base="0x500000", offsets=[0x10])
4. dissect_structure(address="0x600000", size=64)
→ Array of CItem objects用户:"0x500000地址是什么内容?"
Agent工作流:
1. get_rtti_classname(address="0x500000")
→ "CPlayerInventory"
2. dissect_structure(address="0x500000", size=256)
→ 0x00: vtable
→ 0x08: itemCount (int32) = 15
→ 0x10: itemArray (pointer) = 0x600000
3. read_pointer_chain(base="0x500000", offsets=[0x10])
4. dissect_structure(address="0x600000", size=64)
→ CItem对象数组undefinedundefinedundefinedundefinedce_mcp_bridge.lua-- Change named pipe (if multiple instances needed)
local PIPE_NAME = "\\\\.\\pipe\\CE_MCP_Bridge_v99"
-- Adjust worker thread wait time
local WORKER_WAIT_MS = 10
-- Enable verbose logging
DEBUG_MODE = truece_mcp_bridge.lua-- 修改命名管道(需要多实例时使用)
local PIPE_NAME = "\\\\.\\pipe\\CE_MCP_Bridge_v99"
-- 调整工作线程等待时间
local WORKER_WAIT_MS = 10
-- 启用详细日志
DEBUG_MODE = truedofile()dofile([[C:\path\to\ce_mcp_bridge.lua]])dofile()dofile([[C:\path\to\ce_mcp_bridge.lua]])MCP Server Listening on: CE_MCP_Bridge_v99pip install mcp pywin32ping{"success": true, "version": "12.0.0"}MCP Server Listening on: CE_MCP_Bridge_v99pip install mcp pywin32ping{"success": true, "version": "12.0.0"}Tool: get_process_list
→ Find exact process name
Tool: open_process
Args: {"process_name": "exact_name.exe"} # Case-sensitive, include .exe工具:get_process_list
→ 找到精确的进程名称
工具:open_process
参数:{"process_name": "exact_name.exe"} # 区分大小写,需包含.exeTool: pointer_scan
Args: {
"address": "0x789000",
"max_level": 7, # Increase depth
"max_offset": 8192 # Increase offset range
}工具:pointer_scan
参数:{
"address": "0x789000",
"max_level": 7, # 增加扫描深度
"max_offset": 8192 # 增加偏移范围
}undefinedundefined
**Limit search scope:**undefined
**限制搜索范围:**undefinedcd MCP_Server
python test_mcp.py✅ Memory Reading: 6/6 tests passed
✅ Process Info: 4/4 tests passed
✅ Code Analysis: 8/8 tests passed
✅ Breakpoints: 4/4 tests passed
✅ DBVM Functions: 3/3 tests passed
✅ Utility Commands: 11/11 tests passed
────────────────────────────────────
Total: 36/37 PASSED (100% success)cd MCP_Server
python test_mcp.py✅ Memory Reading: 6/6 tests passed
✅ Process Info: 4/4 tests passed
✅ Code Analysis: 8/8 tests passed
✅ Breakpoints: 4/4 tests passed
✅ DBVM Functions: 3/3 tests passed
✅ Utility Commands: 11/11 tests passed
────────────────────────────────────
Total: 36/37 PASSED (100% success)User: "Create a health trainer for game.exe"
Agent executes:
1. open_process(process_name="game.exe")
2. scan_all(value_type="4byte", value="100") # Current health
3. [User takes damage]
4. next_scan(value="85")
5. [Repeat until 1-3 addresses remain]
6. set_data_breakpoint(address=result[0], type="write")
7. [User takes damage again]
8. disassemble(address=breakpoint_hit, count=30)
9. Identify health variable and function
10. generate_api_hook_script(address=health_function)
11. auto_assemble(script=hook_script)
12. freeze_address(address=health_addr, value=999, description="Infinite Health")
13. save_table(path="C:\\trainers\\game_trainer.CT")
Result: Cheat table with working infinite health用户:"为game.exe创建一个生命值修改器"
Agent执行步骤:
1. open_process(process_name="game.exe")
2. scan_all(value_type="4byte", value="100") # 当前生命值
3. [用户受到伤害]
4. next_scan(value="85")
5. [重复直到剩余1-3个地址]
6. set_data_breakpoint(address=result[0], type="write")
7. [用户再次受到伤害]
8. disassemble(address=breakpoint_hit, count=30)
9. 识别生命值变量与函数
10. generate_api_hook_script(address=health_function)
11. auto_assemble(script=hook_script)
12. freeze_address(address=health_addr, value=999, description="无限生命值")
13. save_table(path="C:\\trainers\\game_trainer.CT")
结果:生成带有可用无限生命值功能的作弊表