C# Windows 安全桌面 初探

folder_open
comment1条评论

或许大家在刚刚接触到Windows7、Windows8或者Vista的时候,会发现它们比XP“麻烦”了不少,其中一个“麻烦”就是UAC,什么是UAC呢?UAC就是User Account Control(用户帐户控制),他对我们来说最直观的一个地方就是在你进行某些操作或者运行某些图标上有小盾牌图标的程序的时候,突然屏幕一黑,然后蹦个窗口出来,要询问你“允许该程序对你的电脑进行操作吗”,如果你点了否那么该程序就无法运行。

uac

这个操作过程看似只是一个请求权限的小窗口而已,其实不然,这个窗口并不是在你当前的桌面上生成的,而是在一个叫做安全桌面(secure desktop)的地方生成的,这个桌面没有壁纸,没有图标,什么都没有。那么这个“安全桌面”是用来做什么的呢?到底有什么用呢?

什么是安全桌面?

我们写过程序的人可能知道,如果我们调用系统的某些API(SetWindowsHookEx,WH_KEYBOARD_LL笑而不语),就可以利用钩子监视键盘,你输入的每一个字符全都被一览无余……

据我所知,Windows一共有3种不同的桌面,1是winlogon,2是屏幕保护(没错它也是个桌面),3才是我们平时用到的用户桌面。安全桌面是由“local system”用户所持有并通过winlogon运行,它几乎不响应大部分的其他程序的操作,所以在用户桌面上的键盘钩子,也不会捕获到你在安全桌面上面的按键,在这里看来安全桌面是相对安全的。

如何实现安全桌面?

大体来说,我们需要进行以下几个步骤(这几个函数可以在user32.dll里面找到):

  1. CreateDesktop,创建安全桌面
  2. SwitchDesktop,切换到安全桌面
  3. SetThreadDesktop,将安全新桌面关联到当前线程,然后进行操作
  4. SwitchDesktop,切换回原桌面
  5. CloseDesktop,关闭安全桌面

既然知道了要怎么做,那我们就来自己动手做一下(当然是使用我们最熟悉的C#):

声明上面的几个函数,如下:

然后是桌面操作:

如果运行不起来,可以看看 源代码 

总结:

当然了,时代在进步,有了安全桌面也不一定能保证你的系统或是程序是100%安全的,

作为一个用户:你需要做的就是养成一个良好的使用习惯,平时不知道的程序不要随意打开,把windows的文件后缀名显示出来,exe文件要尤其小心。

作为一个开发者:你做的软件可能会需要登录,将登陆事务放到安全桌面上虽然可以防止一些钩子,可是如果别人直接跑去黑你的数据库了呢?或者直接把你的程序反编译了呢?所以我们开发者,必须时时刻刻提高自己,多学习新知识,不要一直停滞不前,不然终究会被淘汰。

 

PS:我在使用的过程中发现在某些Win7系统中(Win8.1和Win10经测试没有发现这个问题),打开一次桌面就会打开一个输入法管理器进程(CtfMon.exe),而桌面关闭了以后它不会关闭,这样可能会出现进程中有好几个甚至N多CtfMon,要怎么解决这个问题呢?这个我们就到这篇文章里面去讨论吧。

Tags:

看看其他

1条评论. Leave new

  • […] 前几天当我还沉浸在学会怎样产生安全桌面并在里面放置登录事务的时候,在一次例行测试过程中我发现,如果在纯净版(使用官方镜像安装,没有打过补丁。之所以强调纯净版,是因为不排除微软会发布补丁修复这个问题的可能性)的Windows7上面生成安全桌面,会随之产生一个CtfMon.exe进程,但是当我们关闭了安全桌面的时候,这个进程不会被关闭,我测试了8次程序,进程列表里就出现了9个CtfMon(原本用户桌面上的那个当然也要算在内了),这怎么能行?要怎样解决这个问题? […]

    回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Fill out this field
Fill out this field
请输入有效的电子邮箱地址。