使用说明
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设置为入口点,并自动注册导出的符号。
工作流示例
典型的代理交互:
create_emulator(arch="x86_64")--启动会话assemble(arch="x86_64", code="mov rax, 60; syscall")--组装退出系统调用load_binary(session_id=..., data=..., address=0x1000, entry_point=0x1000)--负载代码hook_syscall(session_id=..., mode="stop")--拦截系统调用enable_trace(session_id=...)--开始录制emulate(session_id=..., address=0x1000, count=100)--奔跑get_trace(session_id=...)--检查执行了什么get_syscall_log(session_id=...)--查看尝试了哪些系统调用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
