首页
社区
课程
招聘
[讨论][讨论]远程控制软件隐私屏的实现原理?
2023-11-6 21:43 5219

[讨论][讨论]远程控制软件隐私屏的实现原理?

2023-11-6 21:43
5219

       现在很多远程控制软件都有一个隐私屏的功能,具体来说,就是连接到远程电脑的桌面,启用隐私屏功能后,对方在电脑前看到的是一个自定义的图像,而远程控制界面里面显示的还是原来的桌面而且可以继续控制。一部分软件是通过安装虚拟显示器驱动来实现的:就是说启用此功能的时候,新建一个虚拟的显示器,让其中一个成为当前显示器,另外一个作为控制。而另外有一些则是通过应用层实现的,对这个功能的实现很好奇,有人知道原理吗?


    以ToDesk为例,官方帮助文件:https://www.todesk.com/helpcenter/questions-101.html 说到 :(3)Windows 8,Windows 10以上系统则不需要安装额外驱动。然后我使用SPY++观察了一下窗口,如下:

可以看到,该窗口类名为“ToDesk_Private_Screen”,是由当前会话ID的SYSTEM用户进程创建的(一般远程控制软件会有三个进程:一个位于0会话的服务程序用于网络通信,然后它会使用当前会话的winlogon权限创建另外一个进程用于截取屏幕和控制,这个窗口就是该进程创建的)。来到被控制的电脑前面,可以看到如下图像:

从解锁说明可以看出来,它是先调用了API函数BlockInput锁定了所有的输入(调用该函数的线程不受限制),所以必须先按热键Ctrl+Alt+Del然后系统会自动解除锁定,然后用户第二步输入的Ctrl+Alt+P才会被该窗口接收后隐藏窗口并调用API函数LockWorkStation。

如果自己写一个程序ShowWindow(该窗口句柄,SW_HIDE),可以看到该窗口被隐藏从而出现真正的桌面(当然,键盘鼠标还是锁定的,必须按热键Ctrl+Alt+Del解除)。但是,如果自己写一个程序,类似的创建一个窗口,然后使用system权限启动到当前桌面,会发现整个桌面被覆盖了,所以,是否还需要调用什么新的API之类呢?



阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞0
打赏
分享
最新回复 (16)
雪    币: 30090
活跃值: (2117)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
bestbird 2023-11-6 22:29
2
0
关键字:MagSetWindowFilterList、CreateWindowInBand
雪    币: 12145
活跃值: (15575)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2023-11-7 09:46
3
0
rustdesk也有类似功能,而且是开源的,可以拿来研究
雪    币: 8146
活跃值: (2642)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
layerfsd 4 2023-11-7 10:39
4
0
T哥又开始搞科普文了?
雪    币: 333
活跃值: (1804)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
轻装前行 2023-11-7 11:43
5
0
这不就 类似网吧 挂机锁,屏幕锁吗
雪    币: 30090
活跃值: (2117)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
bestbird 2023-11-7 15:06
6
0
pureGavin rustdesk也有类似功能,而且是开源的,可以拿来研究
是的,就是看了那个帖子https://github.com/rustdesk/rustdesk/issues/65,但下载后在几个不同系统的虚拟机都跑过,没成功。要么提示创建进程runtimebroker.exe失败,要么提示CreateWindowInBand错误1314,所以根本不知道预期效果如何。源码是rust写的,根本看不懂。。。
雪    币: 30090
活跃值: (2117)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
bestbird 2023-11-7 15:07
7
0
layerfsd T哥又开始搞科普文了?
并没有,只是好奇。
雪    币: 30090
活跃值: (2117)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
bestbird 2023-11-7 18:36
8
0

已解决。

1、将窗口设置为最前(使用CreateWindowInBand),而且需要透明:WS_EX_TOPMOST or WS_EX_NOACTIVATE or WS_EX_TRANSPARENT,否则该窗口下的区域无法点击(比如说右键弹出菜单)。

2、调用API函数SetWindowDisplayAffinity将该窗口设置为不可捕获。


效果图如下:win7虚拟机运行客户端,连接win10虚拟机:


在我们的窗口位置鼠标右键弹出一个菜单,证明该窗口对覆盖的区域无影响:



看一下Win10,我们的窗口没有全屏是为了方便测试:


雪    币: 3708
活跃值: (2602)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
文西哥 2023-11-7 19:31
9
0
类似网吧 挂机锁,屏幕锁吗
雪    币: 30090
活跃值: (2117)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
bestbird 2023-11-7 22:00
10
0
文西哥 类似网吧 挂机锁,屏幕锁吗
不知道,没有接触过你说的这些、
雪    币: 30090
活跃值: (2117)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
bestbird 2023-11-7 23:36
11
0

:)

再次启用隐私屏,

雪    币: 30090
活跃值: (2117)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
bestbird 2023-11-24 15:15
12
1
轻装前行 这不就 类似网吧 挂机锁,屏幕锁吗

百度了一下,这个跟挂机锁是两个不同的东西。



网吧挂机锁是最经典的网吧锁屏软件,使用这款网吧挂机锁可以让你一键锁定网吧的电脑屏幕,不知道密码不能随意操作,如果您需要在指定的时间挂机,




隐私屏的话,如果坐在被控制的电脑屏幕前,看到的效果的确跟挂机锁是一样的,但如果使用远程控制客户端连接过来,是看不到这个画面的,也可以继续控制。也就是说这个画面对于远程用户来说是不存在的。


另外,实际上win7一样可以在应用层实现这种效果的。只是需要使用另外一个API。


雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_aetscoms 2024-4-15 11:39
13
0
最近也在研究这个功能,请教楼主,窗口设置为最前:使用CreateWindowInBand创建时,应该使用哪个ZBID?我创建的要么不在最前,要么会创建失败,感谢
雪    币: 30090
活跃值: (2117)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
bestbird 2024-4-15 16:20
14
0
ZBID_UIACCESS
这个函数需要好像win8以上系统。win7一般使用虚拟显示器,我网站有一个演示:http://138soft.com/video/virtualdisplay.htm。否则好像放大镜接口好像也可以的,没有需求,所以每试验,感兴趣的话你可以试试。
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_aetscoms 2024-4-15 16:53
15
0
bestbird ZBID_UIACCESS 这个函数需要好像win8以上系统。win7一般使用虚拟显示器,我网站有一个演示:http://138soft.com/video/virtualdisplay.htm。否 ...
谢谢,现在我实现了窗口最前,远程不可捕获,但这个:(WS_EX_TOPMOST or WS_EX_NOACTIVATE or WS_EX_TRANSPARENT,否则该窗口下的区域无法点击),我在创建时传入的style,但还是拦截了鼠标,点击没有效果,请问这个是在创建时直接传入的吗
雪    币: 30090
活跃值: (2117)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
bestbird 2024-4-15 18:16
16
0
mb_aetscoms 谢谢,现在我实现了窗口最前,远程不可捕获,但这个:(WS_EX_TOPMOST or WS_EX_NOACTIVATE or WS_EX_TRANSPARENT,否则该窗口下的区域无法点击),我在创建 ...
WS_EX_TRANSPARENT是关键:能点击下面的窗口,但也无法截取消息了。意思是说,现在点击窗口,不会触发窗口的消息窗口,而是“漏”给窗口下面的窗口了。这个是创建的时候直接传递进去的。

另外,这个功能通常是配合键盘鼠标锁定函数使用的:
(BOOL BlockInput(
  [in] BOOL fBlockIt
);
调用后,除了调用线程(也就是远程控制线程)外的鼠标键盘消息都不再有效,
MSDN:
系统将在以下情况下解锁输入:

阻止输入的线程意外退出,而未调用BlockInput并且 fBlock设置为FALSE。在这种情况下,系统会正确清理并重新启用输入。
用户按 CTRL+ALT+DEL 或系统调用“ 硬系统错误”模式消息框(例如,当程序故障或设备故障时)。

所以,远程要解锁,一般是先输入CTRL+ALT+DEL,然后响应预先注册的热键(WS_EX_TRANSPARENT导致窗口无法收到键盘鼠标消息了)来ShowWindow(xx,SW_HIDE)来关闭。
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_aetscoms 2024-4-18 15:31
17
0
收到,现在明白了,感谢详细解答!
游客
登录 | 注册 方可回帖
返回