-
v1.3.9 Stable
released this
2026-09-02 17:16:59 +00:00 | 1 commits to main since this releasev1.3.9 (2026.9.2)
⚠️ 安全提示
本软件涉及远程控制功能,请谨慎下载,建议在虚拟机中测试。主控程序会连接授权服务器进行必要的通讯和防破解检测。下载并使用本软件,即视为接受上述条款。
MCP 服务端集成(AI 远程管理)& 远程控制与文件传输闭环 & 主控增强
本次发布历时约 28 天,跨 39 次提交,核心是引入 MCP(Model Context Protocol)服务端,为 YAMA 主控补齐一套完整的 AI 远程管理能力。MCP 服务端在本地
127.0.0.1:6544暴露 JSON-RPC 2.0 接口,通过 Bearer Token 鉴权,向任意 MCP 客户端(Claude、Cursor 等)提供 23 个工具,覆盖「观测 → 执行 → 控制 → 传输」全链路:主机搜索与只读观测(进程 / 窗口 / 文件 / 服务 / 注册表 / 截图 / 审计日志 / 客户端日志)、远程终端执行、屏幕操控注入(键盘 / 鼠标 / 剪贴板)、文件双向传输(download_file / upload_file)。同时带来客户端活动历史、日志右键菜单(在线通知 / 拉黑 / 解封)、列表排序记忆等主控增强,以及多项稳定性修复。
新功能
MCP 服务端集成(AI 远程管理框架)
- 本地 MCP 服务端:新增
McpServer,基于 httplib 实现 JSON-RPC 2.0 分派(initialize/ping/tools/list/tools/call),监听http://127.0.0.1:6544/mcp,通过Authorization: Bearer <token>鉴权;默认关闭 - MCP 设置对话框:主菜单「扩展 > MCP 设置」新增
McpSettingsDlg,运行时动态创建,可配置启用开关、端口、绑定地址与 Token;相关改动需重启主控生效 - 分级开关:
McpReadonly(默认开,隐藏执行类工具)、McpCmdWhitelist(命令白名单)、McpTerminal(持久终端,默认关)、McpRemoteControl(远程控制,默认关,需关闭只读)、McpFileTransfer(文件传输,默认关)逐项门控,操作全面审计记录 - FRP 端口暴露:绑定
0.0.0.0时,MCP 端口并入监听 / Web 端口联合暴露 - i18n:en_US / zh_TW 翻译同步补齐
安全边界:MCP 服务端默认关闭且仅本地回环监听,建议启用 Token 鉴权;执行类与操控类工具(终端 / 远程控制 / 文件传输)均为可选开关、默认关闭,请仅在信任的环境下开启。
MCP 观测类工具(只读)
- search_hosts / get_host_detail:按名称 / 备注、IP、分组、OS 组合过滤在线主机(纯内存实现,ASCII 大小写不敏感子串匹配);按 id 获取单台主机详情,非法 id 返回 -32602、离线或未知返回 -32002
- list_processes / list_windows:经
COMMAND_SYSTEM/COMMAND_WSLIST主连接请求,一次性子链路接收TOKEN_PSLIST/TOKEN_WSLIST;窗口标题按客户端 UTF-8 能力位解码 - list_files / get_screenshot:
COMMAND_LIST_DRIVE→TOKEN_DRIVE_LIST列驱动器,COMMAND_LIST_FILES→TOKEN_FILE_LIST列目录;截图复用屏幕预览 RPC 并按 host 的 reqId 关联;get_screenshot新增可选max_width参数(钳制 64..1920) - list_services:
COMMAND_SERVICES→TOKEN_SERVERLIST,5 字段解析(显示名 / 服务名 / 路径 / 状态 / 启动类型);非 Windows 主机直接返回 -32005 - get_client_log:
COMMAND_QUERY_LOG→TOKEN_REPORT_LOG,取首个全量包后即取消子链路;日志按 clientType 解码(Windows = 936) - list_registry:三阶段流程(
COMMAND_REGEDIT/COMMAND_REG_FIND/ PATH + KEY),空路径返回五个根键;客户端以KEY_READ枚举,完整映射值类型(REG_SZ / DWORD / BINARY / EXPAND_SZ / MULTI_SZ / QWORD / NONE),路径钳制 MAX_PATH 防栈溢出 - get_audit_log:主控审计日志(上线 / 离线 / 操作结果 / 告警)以线程安全镜像
m_MessageLog暴露,最多返回 1000 条、最新在前 - 单飞请求注册表:每 host 一个
m_Pending一次性挂起注册表,20s 超时,同 host 并发请求拒绝返回 -32003;解析器遇到首个空记录即停止以忽略尾部零填充 - 编码修正:进程名 / 路径 / 文件名在 Windows 客户端经 ANSI(A) 接口读取,按 clientType(LNX/MAC = UTF-8,Windows = 936)解码;窗口标题按 clientID 而非 peer IP 定位主连接,修复 FRP / NAT 反代下 UTF-8 标题乱码
MCP 远程终端工具
- exec_command(一次性执行):复用 Web 终端链路(主连接
COMMAND_SHELL+ shell 子连接 + 哨兵命令行),返回 stdout 与退出码;哨兵前置换行判定避免 ConPTY 回显误判;shell 元字符(& | < > ^)拒绝后再走白名单 - terminal_open / terminal_exec / terminal_close(持久终端):每台 Windows 主机可保持一个 shell 会话,cwd 与环境变量跨命令保留;
&/|及控制字符拒绝;空闲 300s 清扫;命令完成后刷新 lastActiveAt - 健壮性修复:
timeout_ms由GetStringArg改为GetIntArg(同时接受数字与数字字符串,1..600000 范围);哨兵同时接受\n与\r起始,修复无输出命令(ping > nul、Start-Sleep)误超时;shell 突发断线后悬空 subCtx 清理
MCP 远程控制工具(屏幕操控注入)
- remote_open / remote_close:复用
WebService::StartRemoteDesktop隐藏建立屏幕子连接(COMMAND_SCREEN_SPY→CScreenSpyDlg→RegisterScreenContext),轮询子连接与物理分辨率(TOKEN_BITMAPINFO→NotifyResolutionChange),记录会话并返回{session_id, screen_w, screen_h};单设备单会话,close 幂等;多显示器主机阶段一拒绝(-32008) - remote_keyboard:key_down / key_up / key_press(键名 → VK,支持 CTRL / ALT / SHIFT / WIN 修饰)与 type(逐字符
VkKeyScanA,仅 ASCII);提取共享BuildKeyMsg64与 Web 路径同源,杜绝漂移;非 ASCII 文本拒绝(-32602),CJK 走剪贴板 + Ctrl+V - remote_mouse:move / down / up / click / right_click / middle_click / drag / scroll;0..1 归一化坐标映射到会话捕获分辨率并钳制到屏幕边界;滚轮沿用 Web 控制台符号约定(正值向下);共享
BuildMouseMsg64 - remote_clipboard:经屏幕子连接
COMMAND_SCREEN_SET_CLIPBOARD写剪贴板;输入 UTF-8 转 GBK(ToAnsi 936)匹配客户端 CF_TEXT / ANSI 路径;非 GBK 字符(如 emoji)替换为 '?'(已在工具描述标注) - 会话状态机加固:
ScreenCtrlSession增加 busy / closed 标志与BeginScreenCtrlAction/EndScreenCtrlAction,注入进行中不擦除会话,与终端忙态纪律一致,杜绝注入与拆除竞争 - 双向互斥:MCP 远程控制会话与人工 Web 查看双向互斥——
m_McpTriggeredDevices标记在所有会话擦除点清除,防止标记滞留永久阻断人工查看
MCP 文件传输工具(V2 协议)
- download_file:经
COMMAND_LIST_DRIVE打开文件管理子链路,发送CMD_DOWN_FILES_V2,客户端在自有认证子连接上推送COMMAND_SEND_FILE_V2分块与逐文件COMMAND_FILE_COMPLETE_V2SHA-256 校验;每设备一个FileTransferSession,headless 路径不弹 GUI 进度框;文件名解析并校验始终落在 local_dir 内阻断..穿越;overwrite=false跳过已存在文件 - upload_file:服务端在主连接上同步驱动
FileBatchTransferWorkerV2(headless 回调),复用 list_files 链路做覆盖预检;McpFileTransfer=1且McpReadonly=0门控;返回files[{path,size,sha256}]与total_bytes / skipped,sha256 恒为空(V2 无接收方回执,完整性由客户端本地校验、失败仅记日志) - 客户端侧懒初始化:客户端主连接此前未初始化文件传输模块导致
g_status恒为 0、上传分块被静默丢弃(截断为 0 字节);在COMMAND_SEND_FILE_V2分支新增一次性InitFileUpload(与 FileManager 初始化一致,非阻塞、幂等、引用计数)
主控功能增强
- 客户端活动历史:客户端记录活跃窗口历史(开始时间、标题、驻留时长,跳过 <5s,空闲打断计时,上限 500 条,最新在前);主机「客户端管理」子菜单新增「活动历史」项,经主连接请求快照并在新对话框展示;对话框以 Unicode 窗口重建编辑控件,UTF-8 标题正确渲染
- 日志右键菜单三连:消息日志右键菜单新增「在线通知」(提取 IPv4 加入通知关键字,
NotifyManager::ShouldNotify增加 IP 列回退匹配)、「拉黑 IP」(校验白名单后加入黑名单并持久化,IOCPServer::OnAccept即时生效)、「解封 IP」(移出黑名单并将该 IP 的AUTH_FORBIDDEN主机恢复为待授权) - 列表排序记忆:主控主机列表、进程 / 窗口列表分别持久化排序列与方向(
list\OnlineListSort/ProcessListSort/WindowListSort),下次启动默认沿用;主机上下线时按排序位插入 - 在线主机右键图标:三个原无图标的菜单项(活动历史 / 浏览窗口 / 代理端口-自启动)新增 16x16 位图,主对话框位图数组 63→66
改进
- 重复连接 standby 处理:重复登录共享同一 clientID 时,新连接不再循环重连替换旧连接,而是暂存为 standby,待旧连接心跳超时或断线后晋升;修正心跳归属与晋升路径,避免误报「主机离线」
- 主机备注显示:远程桌面(「远程桌面控制」)与虚拟屏幕(「远程虚拟屏幕」)对话框标题在主机设有备注时显示备注而非 IP,无备注回退 IP
- 三态排序:主机列表点击同一列头循环「升序 → 降序 → 恢复默认」,默认序按在线时间(存活时长降序)重建,空值持久化以跨重启保留
- get_screenshot max_width:新增可选宽度参数覆盖缩略图档位(默认 1024),配合 RTT 自适应 jpegQuality,支持近原生分辨率截图
Bug 修复
- 客户端屏幕控制批解析错误:
ProcessCommand以%28==0优先判定 MSG 记录尺寸,48 字节批次的记录数是 7 的倍数时(28 / 48 最小公倍 336)被误判为 MSG32,字段整体错位导致注入输入被丢弃或错乱;改为%48==0优先,28 字节路径仅用于旧 32 位主控兼容 - 心跳延迟更新 use-after-free:重复 standby 频繁切换下,心跳处理器
PostMessageA裸传CONTEXT_OBJECT指针,RemoveStaleContext可能先回收复用导致 UI 线程读取陈旧对象,Authorization无界 memcpy 溢出 200 字节 HeartbeatACK 触发 0xC0000409(栈 cookie 覆盖);跨延迟消息持有 IoRefCount(fetch_add / fetch_sub 配对)保证对象存活,并对三处 memcpy 加显式截断 - ONLINELIST_PRIVILEGE 枚举错位损坏历史数据:权限列插入枚举值 9 后 INSTALLTIME / PATH 顺延,而 FileUpload_Lib 以旧枚举值读取
sClientInfo[],导致历史主机库读错权限 / 类型;权限列移至 16(MAX 前),恢复全部原始枚举值 - 远程桌面光标跨对话框污染:视图模式「禁止」光标用
SetClassLongPtr(GCLP_HCURSOR)作用于整个窗口类,打开第二个对话框即污染已控制对话框;改为OnSetCursor逐窗口路由,并清理死代码与 GetIconInfo 泄漏 - 客户端日志对话框停止刷新:Win32 EDIT 控件默认 ~32K / 64K 字符上限使日志静默停止追加,
SetLimitText(0)解除;统一Logger换行处理(每条源端恰一个\n),修复 TCP 日志查询环形缓冲分片错误;修复CClientLog::OnInitDialogCFont 泄漏 - 窗口管理器视图检查读取陈旧状态:右键显示 / 隐藏 / 最大化 / 最小化只更新
SetItemText未同步Data[2],恢复最小化窗口后仍报「该窗口已最小化」;四处处理器同步Data[2] - terminal_exec 误超时:数值型
timeout_ms被字符串解析器丢弃回落到 20s,且哨兵仅接受\n前缀导致无输出命令等待至超时(见远程终端章节) - 进程列表架构列排序无效:架构字符串仅存于
ItemData::Arch,Data[3]为空导致按架构列排序为空比较无效果;补填Data[3] - FRP / NAT 下窗口标题乱码:子连接按 peer IP 定位主连接失败(FRP 反代下 peer 为 127.0.0.1),UTF-8 窗口标题被按 GBK 解码乱码;改为优先按 clientID 定位(TOKEN_CONN_AUTH 后 SetID),peer IP 回退仅用于旧客户端
升级提示
- MCP 默认关闭:MCP 服务端及全部执行 / 操控 / 传输工具默认关闭,需在「扩展 > MCP 设置」手动开启并重启主控;开启后可在本地 127.0.0.1:6544 被任意 MCP 客户端调用,请妥善保管 Token
- MCP 为服务端特性:MCP 工具通过现有协议链路驱动客户端,绝大多数观测类工具无需客户端升级;
get_client_log、活动历史等依赖客户端侧实现,旧版客户端无数据(版本兼容差异,非 bug) - 文件传输需 V2 协议客户端:download_file / upload_file 走 V2 文件传输协议,需客户端支持
CMD_DOWN_FILES_V2/COMMAND_SEND_FILE_V2;建议客户端升级至 v1.3.9 - 远程控制仅支持单显示器:MCP remote_open 阶段一仅支持单显示器主机(多显示器返回 -32008),且与人工 Web 查看互斥;屏幕操控(键鼠 / 剪贴板)注入依赖已建立的 remote_open 会话
- 拉黑 / 解封即时生效:日志右键「拉黑 IP」写入黑名单后,新连接即被
OnAccept拒绝;「解封 IP」将被拉黑主机恢复为待授权状态(需重新授权),仅影响当前服务端
Downloads
- 本地 MCP 服务端:新增