如何在SYSTEM权限下实现屏幕监控

2023-10-31

屏幕监控是远控软件的基本功能之一。
现在很多远控程序的服务端通常为DLL形式,通过远程线程注入等方法插入到services、svchost等SYSTEM权限的进程中去,而此时常规的屏幕监控就会失效(这是因为与SYSTEM权限进程关联的窗口站、桌面与普通进程不同)。
如何才能在SYSTEM权限下实现屏幕监控呢?

一、 屏幕监控的基本原理

屏幕监控简单说就是对进程的当前桌面进行截屏存成位图,然后将此位图数据传输到远程。

对桌面进行截图需要通过一系列Windows GDI API来完成的。

首先通过CreateDC,CreateCompatibleDC,CreateCompatibleBitmap,SelectObject等API将“DISPLAY”驱动器的设备上下文与位图句柄关联起来。

然后通过GetStockObject,GetDC,SelectPalette等API处理调色板。

最后在一个循环中通过GetDIBits将所有水平线像素数据存入到缓冲区中去。

这个缓冲区就是我们想要的位图数据,只要将这些数据组织一下,就可以当成位图显示出来了。通过连续传输位图,就可以实时对远程屏幕进行监控了。这个过程比较简单,就不浪费文字了。

二、窗口站与桌面

首先必须了解几个重要的概念:
窗口站(WindowsStation)和 桌面(Desktop)是Windows操作系统底层暴露给Windows API的执行体对象(Windows内部有两种类型的对象:执行体对象和内核对象。执行体对象指由执行体的各种组件如进程管理器、内存管理器等等所实现的对象。内核对象是由Windows内核实现的一组更基本的对象)。

其中,窗口站对象包含了一个剪贴板、一组全局原子和一组桌面对象。桌面对象是一个被包含在窗口站内部的对象,桌面对象有一个 逻辑显示器表面,其中包含了窗口、菜单和钩子。

0号窗口站(WinSta0)和默认的桌面对象(default desktop)是有Winlogon进程创建的。窗口站是会话(Session)的下一层组织结构。一个会话可以有多个窗口站,但同一时刻只能有一个窗口站可以与用户进行交互。每个窗口站有自己的剪贴板,可以有多个桌面。Winlogon进程调用NtUserCreateWindowsStation函数创建窗口站,再调用NtUserCreateDesktop来创建桌面。它首先会创建一个名为Winlogon的桌面供自己使用(Windows登录界面就属于属于这个桌面),然后再创建一个名为Default的桌面给应用程序使用。创建完桌面后,Winlogon调用SetActiveDesktop函数将Winlogon桌面设置为当前的活动桌面。

之后,Winlogon会创建用于管理系统服务的服务管理器(Service.exe)和本地安全认证子系统(LSASS.exe)。用户登陆信息被验证后,Winlogon会将应用程序桌面激活,启动UserInit程序,UserInit会运行注册表中定义的登录脚本,然后启动操作系统外壳程序(Shell-默认是explorer.exe)。这是SYSTEM权限进程和普通用户进程逻辑显示器桌面分离的开始。在以后进程创建CreateProcess的过程中,如果没有指定桌面,那么进程就会与调用者的当前桌面关联在一起。

在实际测试中,发现services、svchost这些进程似乎没有关联任何桌面(截的屏都是黑屏)。普通的进程都是Default桌面,登录界面是Winlogon桌面。所以,当dll插入到service.exe等进程中的时候,要想实现截屏必须将进程与Default桌面关联,用户注销、离开或未登录时就要将进程与Winlogon桌面关联。

Windows给我们提供的一些API允许我们干这些事。

首先可以通过OpenWindowStation打开一个窗口站对象,然后通过SetProcessWindowStation将进程与窗口站关联,通过OpenDesktop打开一个桌面对象,再通过SetThreadDesktop将线程与这个桌面关联。这样service.exe就可以实现截屏了。但如何才能知道当前用户在哪个桌面呢?可以通过下列函数实现:
OpenInputDesktop(DF_ALLOWOTHERACCOUNTHOOK, FALSE, MAXIMUM_ALLOWED);//打开输入桌面
GetUserObjectInformation(hActiveDesktop, UOI_NAME, pvInfo, sizeof(pvInfo), &dwLen); //获取指定桌面对象的信息,一般情况和屏保状态为default,登陆界面为winlogon
pvInfo缓冲区包含的就是当前桌面。这样就可以放心的调用OpenDesktop打开它了。

完整代码如下:
BOOL OpenDesktop(LPCWSTR szName)
{
    WCHAR pvInfo[128] = {0};
    WCHAR tmp[1024] = {0};

    if(szName != NULL)
        lstrcpy(pvInfo, szName);
    else
    {

        HDESK hActiveDesktop;
        DWORD dwLen;
        hActiveDesktop = OpenInputDesktop(DF_ALLOWOTHERACCOUNTHOOK, FALSE, MAXIMUM_ALLOWED);
        if(!hActiveDesktop)//打开失败
        {
             return FALSE;
        }
        //获取指定桌面对象的信息,一般情况和屏保状态为default,登陆界面为winlogon
        GetUserObjectInformation(hActiveDesktop, UOI_NAME, pvInfo, sizeof(pvInfo), &dwLen);
        if(dwLen==0)//获取失败
        {
            return FALSE;
        }
        CloseDesktop(hActiveDesktop);
//打开winsta0
    m_hwinsta = OpenWindowStation(_T("winsta0"), FALSE,                          
                                  WINSTA_ACCESSCLIPBOARD   |
                                  WINSTA_ACCESSGLOBALATOMS |
                                  WINSTA_CREATEDESKTOP     |
                                  WINSTA_ENUMDESKTOPS      |
                                  WINSTA_ENUMERATE         |
                                  WINSTA_EXITWINDOWS       |
                                  WINSTA_READATTRIBUTES    |
                                  WINSTA_READSCREEN        |
                                  WINSTA_WRITEATTRIBUTES);
    if (m_hwinsta == NULL){
        return FALSE;
       }

    if (!SetProcessWindowStation(m_hwinsta)){
          return FALSE;
       }

//打开desktop
m_hdesk = OpenDesktop(pvInfo, 0, FALSE,                
                            DESKTOP_CREATEMENU |
                            DESKTOP_CREATEWINDOW |
                            DESKTOP_ENUMERATE    |
                            DESKTOP_HOOKCONTROL |
                            DESKTOP_JOURNALPLAYBACK |
                            DESKTOP_JOURNALRECORD |
                            DESKTOP_READOBJECTS |
                            DESKTOP_SWITCHDESKTOP |
                            DESKTOP_WRITEOBJECTS);
       if (m_hdesk == NULL){
           return FALSE;
       }

       SetThreadDesktop(m_hdesk);
       return TRUE;
}
代码有点乱,将就一下!

三、后记


上面的代码只是针对service.exe这样的进程,要想做的通用还要再加些代码。

 

转自 http://blog.csdn.net/lapcca/article/details/5984292
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在SYSTEM权限下实现屏幕监控 的相关文章

随机推荐

  • WordPress配置SMTP发送电子邮件(QQ邮箱)

    Wordpress通过PHP自带的mail函数实现电子邮件的发送成功率极低 现有的各类邮箱 例如QQ邮箱 新浪邮箱 163邮箱等 基本不支持PHP语言的mail函数实现的邮件发送 因此 需要配置基于SMTP协议的邮件发送环境 实现Wordp
  • 软件工程基础知识--软件项目管理

    软件项目管理是指软件生存周期中软件管理者所进行的一系列活动 其目的是在一定的时间和预设范围内有效地利用人力 资源 技术和工具 使软件系统或软件产品按原定计划和质量要求如期完成 一 软件项目管理涉及范围 二 软件项目估算 三 进度管理 四 软
  • AutoCAD 2021 for Mac(cad2021)中文版

    AutodeskAutoCAD 2021中文版目前已经正式发布了 CAD2021 全称为AutoCAD2021 这是目前Autodesk公司最新发布的一款非常好用且功能强大二维和三维CAD设计软件 同时该软件内置了专业强大的MEP MAP
  • Linux 之大数据定制篇-Shell 编程

    Linux 之大数据定制篇 Shell 编程 为什么要学习Shell 编程 Linux 运维工程师在进行服务器集群管理时 需要编写Shell 程序来进行服务器管理 对于JavaEE 和Python 程序员来说 工作的需要 你的老大会要求你编
  • 【音视频流媒体】1、图像YUV、视频编码H264、封装格式 FLV、网络协议RTSP 超详细介绍

    文章目录 一 从参数看视频图像 1 1 像素 1 2 分辨率 1 3 位深 1 4 stride 1 5 帧率 fps 帧 秒 1 6 码率 Kb s Mb s 二 颜色空间 YUV RGB YUV4 4 4 YUV4 2 2 YU16 或
  • Java jsp cannot be resolved to a type解决方法之一

    不要在一个文件夹下面建两个名字一样的包和类
  • 团队管理的四大挑战——招人篇

    团队管理的四大挑战 招人篇 招人篇 1 告诉 HR 你的团队需要什么样的人 2 尊重应聘者 3 你不需要套路 4 互补而不是趋同 5 如果犹豫 那么放弃 6 如何面试比你高阶的人 7 面试最重要的目的是识别风险 8 缺点易现 亮点难得 结语
  • 【chineseOCR】踩过的坑

    1 环境 ubuntu16 04 cuda10 tensorflow1 13 2 web py 0 40 dev0 这两个比较重要 不然会报好多奇怪的错 说明tensorflow必须1 13版本 低了不支持cudn10 高了chineseO
  • Android自定义轮播效果(优化)

    创作背景 本文是继上一篇 Android自定义轮播效果 优化问题而写 希望大家能有顺序的看 优化一 实现自动无线轮播 private class myPagerAdapter extends PagerAdapter Override pu
  • 【知识点】单片机USB转TTL模块的相关知识

    前言 USB转TTL模块的作用就是把电平转换到双方都能识别进行通信 单片机通信接口的电平逻辑和PC机通信接口的电平逻辑不同 PC机上的通信 接口有USB接口 相应电平逻辑遵照USB原则 还有DB9接口 九针口 相应电平逻辑遵照RS 232原
  • MFC的Brush与Pen的使用

    Brush的使用 void CMFCApplicationDlg OnBnClickedOk CDC pDC GetWindowDC CBrush brush1 Must initialize brush1 CreateSolidBrush
  • SonarQube代码质量检测的一点坑

    这里解决的问题有以下几点 1 之前用过sonarqube检测过代码的质量 因其自带的CFamily需要license 故在github上找到相关开源免费的C C 插件 针对特定的sonarqube版本都有相对应的sonar cxx c版本
  • 原生js实现导航条动画

    原生js实现毛毛虫导航 直接上代码
  • 计算机毕业设计选题推荐基于nodejs+Vue360学生宿舍系统

    管理员 首页 个人中心 宿舍信息管理 学生管理 宿舍报修管理 访客信息管理 水电费管理 管理员管理 交流论坛 系统管理 学生 首页 个人中心 宿舍报修管理 水电费管理 前台首页 首页 交流论坛 通知公告 个人中心 后台管理 在线沟通等 目
  • win 10 下cmd命令无法使用ssh命令

    在WIN 10 系统下出现cmd命令无法正常使用ssh命令 提示 ssh不是内部命令 出现这种情况要考虑到是环境变量出现问题 1 鼠标右键单击 我的电脑 进入 属性 2 点击 系统高级设置 选择 环境变量 3 找到 path 点击打开 4
  • Qt中使用QTextStream中文乱码的情况解决

    1 前言 今天在做一个文件编辑器 然后发现读取txt文件的时候 中文的显示乱码 然后在网上查了一些方法 没用 自己摸索了一下 找出了一个办法 2 解决办法 QTextStream in new QTextStream file in gt
  • Csharp:TinyMCE HTML Editor in .NET WindowsForms

  • STM32控制电机简易教程

    STM32控制电机简易教程 包教包会 近期 电赛临近 来补习一下电机的使用方式 使用起来非常的方便 首先是在CUBEMX里面配置一些基本内容 然后是使用PWM去调速 其他的时钟和调试配置就不多说了 然后就是初始化了 同样的 这里使用的是结构
  • 【华为OD机试真题 python】最大报酬【2022 Q4

    题目描述 最大报酬 小明每周上班都会拿到自己的工作清单 工作清单内包含 n 项工作 每项工作都有对应的耗时时间 单位 h 和报酬 工作的总报酬为所有已完成工作的报酬之和 那么请你帮小明安排一下工作 保证小明在指定的工作时间内工作收入最大化
  • 如何在SYSTEM权限下实现屏幕监控

    屏幕监控是远控软件的基本功能之一 现在很多远控程序的服务端通常为DLL形式 通过远程线程注入等方法插入到services svchost等SYSTEM权限的进程中去 而此时常规的屏幕监控就会失效 这是因为与SYSTEM权限进程关联的窗口站