• v1.3.9 b41b27bfe4

    v1.3.9 Stable

    yuanyuanxiang released this 2026-09-02 17:16:59 +00:00 | 1 commits to main since this release

    v1.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_screenshotCOMMAND_LIST_DRIVETOKEN_DRIVE_LIST 列驱动器,COMMAND_LIST_FILESTOKEN_FILE_LIST 列目录;截图复用屏幕预览 RPC 并按 host 的 reqId 关联;get_screenshot 新增可选 max_width 参数(钳制 64..1920)
    • list_servicesCOMMAND_SERVICESTOKEN_SERVERLIST,5 字段解析(显示名 / 服务名 / 路径 / 状态 / 启动类型);非 Windows 主机直接返回 -32005
    • get_client_logCOMMAND_QUERY_LOGTOKEN_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_msGetStringArg 改为 GetIntArg(同时接受数字与数字字符串,1..600000 范围);哨兵同时接受 \n\r 起始,修复无输出命令(ping > nulStart-Sleep)误超时;shell 突发断线后悬空 subCtx 清理

    MCP 远程控制工具(屏幕操控注入)

    • remote_open / remote_close:复用 WebService::StartRemoteDesktop 隐藏建立屏幕子连接(COMMAND_SCREEN_SPYCScreenSpyDlgRegisterScreenContext),轮询子连接与物理分辨率(TOKEN_BITMAPINFONotifyResolutionChange),记录会话并返回 {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_V2 SHA-256 校验;每设备一个 FileTransferSession,headless 路径不弹 GUI 进度框;文件名解析并校验始终落在 local_dir 内阻断 .. 穿越;overwrite=false 跳过已存在文件
    • upload_file:服务端在主连接上同步驱动 FileBatchTransferWorkerV2(headless 回调),复用 list_files 链路做覆盖预检;McpFileTransfer=1McpReadonly=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::OnInitDialog CFont 泄漏
    • 窗口管理器视图检查读取陈旧状态:右键显示 / 隐藏 / 最大化 / 最小化只更新 SetItemText 未同步 Data[2],恢复最小化窗口后仍报「该窗口已最小化」;四处处理器同步 Data[2]
    • terminal_exec 误超时:数值型 timeout_ms 被字符串解析器丢弃回落到 20s,且哨兵仅接受 \n 前缀导致无输出命令等待至超时(见远程终端章节)
    • 进程列表架构列排序无效:架构字符串仅存于 ItemData::ArchData[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