CPU模拟工具

一个基于MCP协议的CPU模拟、反汇编和汇编工具,为LLM代理提供隔离的模拟会话和多种调试功能。

  • by LabGuy94
  • Python
  • 本地部署
  • 5 星标
  • 更新于
在 GitHub 查看 LabGuy94/MCPEmulate

使用说明

MCPEmulate

这个项目被否决了。

一 主控程序 该服务器将CPU仿真、反汇编和组装作为LLM代理的工具公开。建立在 独角兽 (仿真), 顶点 (拆卸), 基石 (组装),以及 科琳·利夫 (二进制解析)。

代理可以通过标准MCP工具界面创建隔离的仿真会话、加载代码或完整的可执行文件、设置断点、挂接系统调用、单步执行指令、检查内存和寄存器以及差异执行跟踪。

支持的体系结构

架构 仿真 拆卸 组装 系统调用挂钩
x86(32位) 是 是 int 0x80
x86-64 是 是 有 syscall
ARM(32位) 是 是 svc 0
AArch64 是 是 有 svc 0
MIPS32(LE) 是 是 有 syscall
MIPS32(BE) 是 是 syscall
RISC-V 32 是 是 否 ecall
RISC-V 64 是 是 否 ecall

RISC-V架构缺少Keystone后端,因此 assemble 工具为他们返回一个错误。拆卸和仿真工作正常。

安装

需要Python 3.10+。

# Run directly (no install needed)
uvx mcp-emulate

# Or install globally
uv pip install mcp-emulate

用法

克劳德桌面/MCP客户端

添加到MCP客户端配置中:

{
  "mcpServers": {
    "mcp-emulate": {
      "command": "uvx",
      "args": ["mcp-emulate"]
    }
  }
}

命令行界面

# Default: stdio transport (for MCP clients)
mcp-emulate

# SSE transport (network, for web-based clients)
mcp-emulate --transport sse

# Streamable HTTP transport (newer MCP protocol)
mcp-emulate --transport streamable-http

工具(41)

会话管理

工具 说明
create_emulator 为给定的体系结构创建新的仿真会话
destroy_emulator 销毁会话并释放资源
export_session 将完整会话状态(内存、寄存器、断点、符号)导出为JSON
import_session 创建新会话并从以前的导出还原状态

记忆

工具 说明
map_memory 映射具有指定权限的内存区域(r/w/x)
write_memory 将十六进制或base64数据写入内存
read_memory 以十六进制或base64读取内存
list_regions 列出所有映射区域
hexdump 带ASCII侧边栏的格式化十六进制转储(最大4KB)
search_memory 在映射的内存中搜索字节模式
snapshot_memory 捕获命名标签下的所有内存内容
diff_memory 比较两个快照并返回更改的字节范围
memory_map /proc/self/maps-带间隙和符号注释的样式布局

寄存器

工具 说明
set_registers 写入一个或多个寄存器
get_registers 读取寄存器(特定或全部)
get_stack 从SP读取堆栈条目,根据符号解析值

执行

工具 说明
emulate 使用停止地址、指令计数或超时运行模拟
step 执行一条带有完全反汇编的指令
add_breakpoint 设置断点,可选地使用注册条件
remove_breakpoint 删除断点
list_breakpoints 列出所有断点及其条件
save_context 在标签下保存寄存器快照
restore_context 从已保存的快照还原寄存器

断点条件

条件断点接受以下表达式:

eax == 42
rax > 0x1000 and rcx != 0
r0 == 0 or r1 & 0xff

支持的操作员: ==, !=, >, <, >=, <=, &.连接词: and, or.

系统调用挂钩

工具 说明
hook_syscall 安装系统调用挂钩(skip 记录并继续, stop 停止)
unhook_syscall 移除系统调用挂钩
get_syscall_log 使用分页检索记录的系统调用

每个记录的条目都包括系统调用号、参数寄存器值和PC。钩子是架构感知的——它会拦截 int 0x80 在x86_32上, syscall 在x86_64上, svc 0 在ARM/AArch64上, syscall 在MIPS上,以及 ecall RISC-V。

观察点

工具 说明
add_watchpoint 监视内存地址的读取、写入或两者兼而有之
remove_watchpoint 删除观察点
list_watchpoints 列出所有活动观察点

追踪

工具 说明
enable_trace 开始记录已执行的指令
disable_trace 停止记录(保留日志)
get_trace 通过反汇编和分页检索跟踪条目
save_trace 将当前跟踪日志保存在命名标签下
diff_trace 逐个指令比较两个保存的跟踪

Trace diff报告了通用前缀长度、分歧点以及多达50个不同的条目,并进行了完整的反汇编。

符号

工具 说明
add_symbol 将姓名与地址相关联
remove_symbol 删除符号
list_symbols 列出所有符号

符号用于注释堆栈条目、跟踪输出、内存映射和步骤结果。

加载中

工具 说明
load_binary 在地址处加载原始机器代码,自动映射内存
load_executable 加载具有正确段权限、入口点和符号的ELF、PE或Mach-O二进制文件
assemble 将指令汇编到机器代码(独立,无会话)
disassemble 将机器代码分解为指令(独立,无会话)

load_executable 使用LIEF进行格式检测。它将每个可加载段映射到正确的权限,将PC设置为入口点,并自动注册导出的符号。

工作流示例

典型的代理交互:

  1. create_emulator(arch="x86_64") --启动会话
  2. assemble(arch="x86_64", code="mov rax, 60; syscall") --组装退出系统调用
  3. load_binary(session_id=..., data=..., address=0x1000, entry_point=0x1000) --负载代码
  4. hook_syscall(session_id=..., mode="stop") --拦截系统调用
  5. enable_trace(session_id=...) --开始录制
  6. emulate(session_id=..., address=0x1000, count=100) --奔跑
  7. get_trace(session_id=...) --检查执行了什么
  8. get_syscall_log(session_id=...) --查看尝试了哪些系统调用
  9. export_session(session_id=...) --保存状态以备后用

建筑

src/mcp_emulate/
  architectures.py   Architecture configs, register maps, syscall conventions
  session.py         EmulationSession (Unicorn wrapper), SessionManager
  server.py          41 MCP tool handlers via FastMCP

tests/
  test_emulate.py              132 pytest unit tests
  test_server_integration.py   112 checks over JSON-RPC (23 phases)

关键设计决策

  • EmulationSession 用途 __slots__ 为了提高内存效率和捕捉拼写错误。每个新属性都必须声明。
  • 断点为 dict[int, str | None] (地址为可选条件),而不是一组。这支持条件断点,同时保持相同的查找语义。
  • 系统调用约定是数据,而不是代码。 每个架构的冻结数据类描述了钩子类型、中断号过滤器、nr/args/return的寄存器名。挂钩逻辑是通用的。
  • ks_arch/ks_mode 是 Optional 上 ArchConfig 因此,没有Keystone(RISC-V)的架构可以在没有虚拟值的情况下存在。这 assemble 工具检查此项并返回一个明确的错误。
  • load_executable 通过写入 uc.mem_write() 直接,绕过权限检查 write_memory这是有意的——二进制加载器需要填充只读段。
  • 会话序列化已版本化 ("version": 1)为了向前兼容。

发展

git clone https://github.com/LabGuy94/MCPEmulate.git
cd MCPEmulate
uv venv .venv
uv pip install -e ".[dev]"

测试

# Unit tests (132 tests, ~1s)
uv run pytest tests/test_emulate.py -v

# Integration tests (112 checks over JSON-RPC subprocess, ~30s)
uv run python tests/test_server_integration.py

# Both
uv run pytest tests/ -v && uv run python tests/test_server_integration.py

依赖项

包装 用途
主控程序 >=1.18.0 MCP协议/FastMCP服务器框架
独角兽 >=2.0.0 CPU仿真引擎
顶点石 >=5.0.0 拆卸发动机
梯形发动机 >=0.9.2 装配发动机
亲爱的 >=0.14.0 ELF/PE/Mach-O二进制解析

许可证

仅限GPL-2.0