v1.3.7

Android 客户端 & 窗口捕获增强 & 安全加固

历时约 12 天,跨 17 次提交。本版本最重要的里程碑是首个 Android 受控端正式落地,打通安卓设备的完整管理链路。其余改动围绕三条副线:前台窗口精准捕获(PrintWindow + HWND 路由)、服务端安全加固(TOKEN_AUTH ECDSA 签名 / 反破解版本绑定 / 子授权连接数限制),以及多项性能与稳定性修复。

Android 客户端(全新平台支持)

  • 屏幕实时推流:MediaProjection + MediaCodec H.264 硬件编码,推流至服务端;支持 arm64-v8a / armeabi-v7a,最低 Android 5.0 (API 21)
  • 触控 / 按键注入:基于 AccessibilityService,支持点击、长按、滑动、文本输入
  • TV / 机顶盒 D-pad 导航:利用 AccessibilityService 焦点导航机制,方向键精准控制焦点移动与确认,无需 root 即可完整操控 Android TV
  • 设备分组:分组名支持编译期 APK binary patch 预置,服务端可通过 CMD_SET_GROUP 动态修改;分组名持久化至应用私有目录 filesDir/yama_group,App 重启后仍保留
  • APK 生成与重签:主控 BuildDlg「生成」对话框新增 ghost - Google Android 选项,填入服务端 IP / 端口一键生成可部署 APK,流程与 Linux / macOS ghost 完全一致;配套 android/sign_apk.bat 自动检测本机 Android SDK 完成重签,支持读取 YAMA_PWD 环境变量免交互
  • 服务端删除客户端:服务端发起删除(BYE 指令)后,Android Service 通过 JNI 回调 onNativeExit() 正常停止,不留僵尸进程

生成流程ghost.apk 模板随仓库提交;BuildDlg 在 APK 的 .so 中定位 FLAG_GHOST,直接 patch szServerIP / szPort / szGroupName,无需重新编译;patch 后需用 sign_apk.bat 重签才能安装。

前台窗口精准捕获

  • PrintWindow 窗口捕获:客户端新增对服务端 HWND 路由指令的支持,可针对指定窗口句柄调用 PrintWindow 捕获——即便目标窗口被其他窗口遮挡,也能获取完整画面,避免了 BitBlt 方案被遮挡时只能捕到背景的问题
  • 服务端 HWND 路由:服务端按 clientID 管理 HWND,精准将窗口捕获指令发送到持有该窗口的客户端连接
  • 在线主机右键查看活动窗口:主机列表右键菜单新增「查看活动窗口」,实时查询并显示当前目标机器前台窗口标题

安全加固

  • TOKEN_AUTH 响应 ECDSA 签名:服务端持有 V2 私钥时,对 "SN|valid(0/1)" 以 ECDSA P-256 签名,将 sig:<base64> 写入响应 reserved 字段;客户端可验证服务端身份,防止中间人伪造授权响应,且不改变请求格式(向前兼容)
  • TOKEN_SERVER_VERIFY(cmd 251)commands.h 新增常量,配合服务端 Challenge-Response 身份校验路径
  • 反破解版本绑定:主控二进制与核心库建立版本绑定关系,检测到版本不匹配时拒绝加载,阻断替换 DLL 的破解路径;同步更新依赖库版本
  • 子授权连接数限制licenses.ini 新增 LicenseLimit 字段(0 = 不限制);超管向子级发出 TOKEN_AUTH 响应时附带 |lic:N,子级超出上限后拒绝新连接;CLicenseDlg 右键菜单支持实时查看和设置限额(1–9999,清空 = 不限制),修改后在子级下次鉴权时生效

改进

  • H264 模式跳过首帧巨帧:H264 模式连接建立时,之前会先发送一帧 ~8MB 的 ARGB 原始帧;现已跳过,服务端在收到首个 IDR 帧后自动解锁画面显示,减少约 8MB 的冗余初始传输
  • 自适应尺寸渲染改进:优化自适应分辨率模式下的渲染逻辑,减少尺寸切换时的画面抖动
  • ScanScreen 窗口捕获逻辑拆分为 3 个独立私有方法,提升可读性

Bug 修复

  • ARGBToNV12 堆溢出:奇数尺寸窗口导致写越界堆溢出;修复为将维度钳制到上下文的偶数对齐宽高
  • 连接初始化时多余屏幕重启(双端修复)
    • 客户端(ScreenManager.cpp):用本地保存的质量配置初始化比特率,使相同比特率的 CMD_QUALITY_LEVEL 跳过重启
    • 服务端(ScreenSpyDlg.cpp):仅在自适应模式且有缓存 maxWidth 时才发送 CMD_SCREEN_SIZE,避免固定质量等级连接时触发第二次重启
  • 启动时内存 DLL 未正确还原:修复初始化顺序,确保依赖该 DLL 的功能可用
  • 授权客户端键盘日志目录冲突:多实例共享目录导致互相覆盖;现为每个授权客户端分配独立目录

升级提示

  • Android 客户端为全新功能:已有 Windows / Linux / macOS 客户端不受影响;Android 客户端通过独立 APK 分发,需在 Android 设备上单独安装
  • APK 每次更新后须重新 patch + 重签:APK 中的 IP / 端口 / 分组是编译期写死的,服务端迁移后需重新用 BuildDlg 生成并用 sign_apk.bat 签名
  • TOKEN_AUTH 签名向前兼容:旧版客户端忽略签名字段,不报错;新版客户端对旧服务端签名缺失同样静默兼容
  • LicenseLimit 默认不限制:不设置 LicenseLimit(或置 0)行为与以往完全一致,不影响现有子授权部署