给Claude装上"手":Exoproc开源MCP服务器实现活体进程钩子

Exoproc 通过 MCP 让 Claude Code 以线程劫持方式动态插桩 Windows 进程。
文章介绍了开源 MCP 服务器 Exoproc,它让 Claude Code 从静态反编译走向对活跃 Windows x64 进程的动态操作。Exoproc 基于 stdio 传输,采用线程劫持而非 DLL 注入,通过挂起目标线程、修改 RIP 并在现有上下文中执行代码,避免写入 DLL 文件或开放网络端口,从而降低 EDR 触发风险。它支持 5 字节 JMP trampoline 和 14 字节 far relay gate,并借助 TinyCC 将 C 代码在内存中编译为 shellcode。典型用例是对 SetWindowTextW 挂钩、读取 UTF-16 字符串后干净恢复。文章认为这扩展了 AI 代理的能力边界,同时提醒线程劫持属敏感技术,需在授权范围内使用。
静态分析之后,Claude需要能"动手"
REA项目展示了Claude在阅读反编译代码方面的能力,但静态分析只能告诉你代码"可能"做什么,无法观察运行时的真实行为。一位开发者在Reddit上发布了Exoproc——一个基于stdio的开源MCP服务器,让Claude Code能够直接接入活跃的Windows x64进程。
静态反编译给了Claude"眼睛",动态钩子给了它"手"。Exoproc的核心思路是:与其让Claude在提示词里模拟执行流程,不如让它直接操作活体内存。

绕过EDR:线程劫持而非DLL注入
传统的DLL注入方式噪音太大,容易触发EDR告警。Exoproc采用了线程劫持(thread hijacking)方案:挂起目标线程,将RIP移动到sleep stub处,在现有上下文中执行代码。
这种做法的巧妙之处在于,它不向目标进程写入新的DLL文件,也不打开网络端口,从而降低了被安全软件检测的概率。作者提到,Exoproc能够处理5字节的JMP trampoline以及14字节的far relay gate,并通过TinyCC将C代码直接编译为内存中的shellcode。
线程劫持(Thread Hijacking)与 DLL 注入的区别
DLL 注入通常需要将 DLL 文件路径或完整映像写入目标进程,再通过 LoadLibrary、CreateRemoteThread 或 APC 注入等方式让目标加载并执行新模块。这一过程会调用 VirtualAllocEx、WriteProcessMemory、CreateRemoteThread 等 API,并可能在磁盘上留下 DLL 文件或产生新的模块加载记录,因此容易被 EDR 的 API 钩子与模块加载监控捕获。
线程劫持则不同:它借助 OpenThread、SuspendThread、GetThreadContext/SetThreadContext 修改目标已有线程的指令指针(RIP/RVC),让该线程转去执行攻击者布置在进程内存中的代码片段(如 sleep stub 或 shellcode),执行完再恢复原上下文。整个过程不创建新线程、不加载新模块,也不依赖 CreateRemoteThread,因此绕过了针对远程线程注入的常见检测点。代价是它更依赖目标线程的调度时机,且对线程上下文寄存器的精确操作要求较高,稳定性与兼容性比 DLL 注入更难保证。
MCP(Model Context Protocol)与 stdio 传输
MCP 是 Anthropic 提出的一种开放协议,用于让 AI 模型以标准化方式调用外部工具和数据源。它采用客户端—服务器架构:Claude Code 作为 MCP 客户端,通过 JSON-RPC 消息与 MCP 服务器通信,服务器则把“读取进程内存”“下钩子”等能力暴露为工具,由模型按需调用。
Exoproc 基于 stdio 传输,意味着客户端把服务器作为子进程启动,双方通过标准输入输出交换 JSON-RPC 消息,无需开放网络端口,这也与其“不打开网络连接”的设计目标一致。MCP 的价值在于把动态分析能力封装成模型可发现、可调用的工具接口,使 Claude 不必依赖提示词模拟,而是直接发起工具调用并拿到结构化结果。
实际能做什么:一个钩子示例
作者给出的典型用法是:让Claude对PID 4120进程的SetWindowTextW函数下钩子,用5字节trampoline记录字符串缓冲区,完成后恢复原始字节。
Claude执行的操作包括:在函数序言处挂钩、从活体内存中读取UTF-16字符串、最后干净地解除钩子。整个过程不落地DLL文件,也不开放网络连接。这意味着Claude不仅能"理解"代码,还能在受控范围内"观察"代码运行时到底传了什么参数、走了哪条分支。
Inline Hook、Trampoline 与 Far Relay Gate 的技术背景
Inline hook(又称 trampoline hook)是在目标函数入口覆写若干个字节,改为跳转到自定义处理函数的经典插桩方式。由于 x64 函数需要保留至少 5 字节用于一条 JMP rel32 指令,如果函数序言剩余空间不足,就需要更长的跳转方案。
14 字节的 far relay gate 对应 FF 25 00000000 加 8 字节绝对地址的形式,可在整个 64 位地址空间内跳转,适合目标函数与 shellcode 距离超过 ±2GB 的场景。挂钩时需要先保存被覆写的原始字节,执行完自定义逻辑后再恢复,即所谓“干净解除钩子”。SetWindowTextW 是 Win32 中设置窗口标题的 Unicode 版本,其第二个参数为 UTF-16 字符串指针,因此在该函数入口挂钩即可拦截所有传入的标题字符串,是演示字符串缓冲区记录的典型目标。
TinyCC 作为内存内 JIT 编译器
TinyCC(tcc)是一个轻量级 C 编译器,可被嵌入到其他程序中,将 C 源码在运行时直接编译为机器码。Exoproc 利用它将 C 代码编译为位置无关的 shellcode 并写入目标进程内存,省去了在本地构建 DLL 再注入的步骤。
相比 MSVC 或 GCC,TinyCC 编译速度快、依赖少、可作为库链接,适合需要即时生成小型代码片段的场景。但它的优化能力有限,生成的代码体积与性能不如主流编译器,因此更适合钩子处理函数这类短小逻辑,而非复杂模块。
安全与边界的思考
Exoproc将AI代理的能力从静态分析扩展到了动态插桩,这既是能力提升,也带来了新的安全考量。线程劫持本身是一种敏感技术,虽然作者强调其规避EDR的特性,但这类工具在合法逆向工程、恶意软件分析和软件调试中都有正当用途。
对于安全研究人员来说,让Claude直接操作活体进程可以大幅减少在提示词中反复描述执行流程的token消耗,把精力集中在分析结论上。不过,使用此类工具时仍需确保目标进程和操作环境符合授权范围。
Exoproc已在GitHub开源,项目地址为github.com/w0ldan/exoproc。对于正在探索AI辅助逆向工程和动态分析的开发者,这是一个值得关注的实验性工具。
相关推荐

Ollama+RAG本地知识库搭建实战:AnythingLLM喂饭教程
基于B站教程整理,详解Ollama+AnythingLLM搭建本地RAG知识库的完整流程:从通用大模型的知识局限、RAG检索增强生成原理,到文档上传、向量化入库与效果验证的实操步骤。

Ollama保姆级教程:本地免费跑大模型入门指南
Ollama是一款开源的本地大模型管理工具,支持免费下载部署DeepSeek等模型,提供命令行和Web UI,跨平台且能自动调度GPU/CPU资源,适合AI开发入门与私有化部署。

本地AI智能体入门:模型与工具怎么选?
本地AI智能体入门指南:核显平台如何选择编码与工具调用模型,Ollama、LM Studio、llama.cpp 各自适合什么场景,以及从 Python 手写工具调用循环到 n8n、LangGraph 框架的学习路径,附 AMD 平台调优要点。