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

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

2023-11-6 21:43
11011

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


    以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之类呢?



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

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

已解决。

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

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


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


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



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


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

:)

再次启用隐私屏,

2023-11-7 23:36
0
雪    币: 30050
活跃值: (2432)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
轻装前行 这不就 类似网吧 挂机锁,屏幕锁吗

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



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




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


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


2023-11-24 15:15
1
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
最近也在研究这个功能,请教楼主,窗口设置为最前:使用CreateWindowInBand创建时,应该使用哪个ZBID?我创建的要么不在最前,要么会创建失败,感谢
2024-4-15 11:39
0
雪    币: 30050
活跃值: (2432)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
ZBID_UIACCESS
这个函数需要好像win8以上系统。win7一般使用虚拟显示器,我网站有一个演示:http://138soft.com/video/virtualdisplay.htm。否则好像放大镜接口好像也可以的,没有需求,所以每试验,感兴趣的话你可以试试。
2024-4-15 16:20
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
bestbird ZBID_UIACCESS 这个函数需要好像win8以上系统。win7一般使用虚拟显示器,我网站有一个演示:http://138soft.com/video/virtualdisplay.htm。否 ...
谢谢,现在我实现了窗口最前,远程不可捕获,但这个:(WS_EX_TOPMOST or WS_EX_NOACTIVATE or WS_EX_TRANSPARENT,否则该窗口下的区域无法点击),我在创建时传入的style,但还是拦截了鼠标,点击没有效果,请问这个是在创建时直接传入的吗
2024-4-15 16:53
0
雪    币: 30050
活跃值: (2432)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
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)来关闭。
2024-4-15 18:16
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
收到,现在明白了,感谢详细解答!
2024-4-18 15:31
0
雪    币: 8
活跃值: (144)
能力值: ( LV2,RANK:16 )
在线值:
发帖
回帖
粉丝
18
大佬,有个问题请教,麻烦问下可以加个联系方式么?
2024-6-28 01:12
0
雪    币: 30050
活跃值: (2432)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
wx_HELLO_454786 大佬,有个问题请教,麻烦问下可以加个联系方式么?
留下你的扣扣
2024-7-9 18:36
0
雪    币: 8
活跃值: (144)
能力值: ( LV2,RANK:16 )
在线值:
发帖
回帖
粉丝
20
已回复您
2024-8-14 22:35
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
可以加下你吗 请教下你问他。 我窗口置顶说明都OK  但是按你说的方法  窗口之下的还是无法点击
2024-9-17 14:55
0
雪    币: 30050
活跃值: (2432)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
我网站上面有QQ号码。
2024-9-19 20:42
0
雪    币: 3868
活跃值: (3643)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
普通API的使用    隐私屏界面模拟系统更新 ->远程操作
2024-9-19 22:10
0
游客
登录 | 注册 方可回帖
返回
//