桌面管理绘图

上传人:飞*** 文档编号:5044342 上传时间:2017-08-28 格式:DOC 页数:12 大小:49KB
返回 下载 相关 举报
桌面管理绘图_第1页
第1页 / 共12页
桌面管理绘图_第2页
第2页 / 共12页
桌面管理绘图_第3页
第3页 / 共12页
桌面管理绘图_第4页
第4页 / 共12页
桌面管理绘图_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《桌面管理绘图》由会员分享,可在线阅读,更多相关《桌面管理绘图(12页珍藏版)》请在金锄头文库上搜索。

1、屏幕监控是远控软件的基本功能之一,现在很多远控程序的服务端通常为 DLL形式,通过远程线程注入等方法插入到 services、svchost 等 SYSTEM 权限的进程中去,而此时常规的屏幕监控就会失效(这是因为与 SYSTEM 权限进程关联的窗口站、桌面与普通进程不同) 。如何才能在 SYSTEM 权限下实现屏幕监控呢?一、 屏幕监控的基本原理屏幕监控简单说就是对进程的当前桌面进行截屏存成位图,然后将此位图数据传输到远程。对桌面进行截图需要通过一系列 Windows GDI API 来完成的。首先通过CreateDC,CreateCompatibleDC,CreateCompatibleB

2、itmap,SelectObject 等API 将“DISPLAY”驱动器的设备上下文与位图句柄关联起来。然后通过 GetStockObject,GetDC,SelectPalette 等 API 处理调色板。最后在一个循环中通过 GetDIBits 将所有水平线像素数据存入到缓冲区中去。这个缓冲区就是我们想要的位图数据,只要将这些数据组织一下,就可以当成位图显示出来了。通过连续传输位图,就可以实时对远程屏幕进行监控了。这个过程比较简单,就不浪费文字了。二、窗口站与桌面首先必须了解几个重要的概念:窗口站(WindowsStation)和桌面(Desktop)是 Windows 操作系统底层暴露

3、给Windows API 的执行体对象(Windows 内部有两种类型的对象:执行体对象和内核对象。执行体对象指由执行体的各种组件如进程管理器、内存管理器等等所实现的对象。内核对象是由 Windows 内核实现的一组更基本的对象) 。其中,窗口站对象包含了一个剪贴板、一组全局原子和一组桌面对象。桌面对象是一个被包含在窗口站内部的对象,桌面对象有一个逻辑显示器表面,其中包含了窗口、菜单和钩子。0 号窗口站(WinSta0)和默认的桌面对象(default desktop)是有 Winlogon进程创建的。窗口站是会话(Session)的下一层组织结构。一个会话可以有多个窗口站,但同一时刻只能有一

4、个窗口站可以与用户进行交互。每个窗口站有自己的剪贴板,可以有多个桌面。Winlogon 进程调用NtUserCreateWindowsStation 函数创建窗口站,再调用 NtUserCreateDesktop来创建桌面。它首先会创建一个名为 Winlogon 的桌面供自己使用(Windows 登录界面就属于属于这个桌面) ,然后再创建一个名为 Default 的桌面给应用程序使用。创建完桌面后,Winlogon 调用 SetActiveDesktop 函数将 Winlogon 桌面设置为当前的活动桌面。之后,Winlogon 会创建用于管理系统服务的服务管理器(Service.exe)和本

5、地安全认证子系统(LSASS.exe) 。用户登陆信息被验证后,Winlogon 会将应用程序桌面激活,启动 UserInit 程序,UserInit 会运行注册表中定义的登录脚本,然后启动操作系统外壳程序(Shell-默认是 explorer.exe) 。这是 SYSTEM权限进程和普通用户进程逻辑显示器桌面分离的开始。在以后进程创建CreateProcess 的过程中,如果没有指定桌面,那么进程就会与调用者的当前桌面关联在一起。在实际测试中,发现 services、svchost 这些进程似乎没有关联任何桌面(截的屏都是黑屏) 。普通的进程都是 Default 桌面,登录界面是 Winlo

6、gon 桌面。所以,当 dll 插入到 service.exe 等进程中的时候,要想实现截屏必须将进程与 Default 桌面关联,用户注销、离开或未登录时就要将进程与 Winlogon 桌面关联。Windows 给我们提供的一些 API 允许我们干这些事。首先可以通过 OpenWindowStation 打开一个窗口站对象,然后通过SetProcessWindowStation 将进程与窗口站关联,通过 OpenDesktop 打开一个桌面对象,再通过 SetThreadDesktop 将线程与这个桌面关联。这样 service.exe 就可以实现截屏了。但如何才能知道当前用户在哪个桌面呢?

7、可以通过下列函数实现:OpenInputDesktop(DF_ALLOWOTHERACCOUNTHOOK, FALSE, MAXIMUM_ALLOWED);/打开输入桌面GetUserObjectInformation(hActiveDesktop, UOI_NAME, pvInfo, sizeof(pvInfo), &dwLen); /获取指定桌面对象的信息,一般情况和屏保状态为 default,登陆界面为winlogonpvInfo 缓冲区包含的就是当前桌面。这样就可以放心的调用 OpenDesktop 打开它了。進行桌面切換需要有 System 權限,如果是以服務啟動的話就是了,也可以用

8、注入或其它的方式。附资料:(转自:http:/ winlogon 注册了 SAS 后,就调用 GINA 生成3个桌面系统,在用户需要的时候使用,它们分别为:Winlogon 桌面用户在进入登录界面时,就进入了 Winlogon 桌面。而我们看到的登录对话框,只是 GINA 负责显示的。如果用户取消以“欢迎屏幕”方式登录,在进入 WindowsXP 中任何时候按下“Ctrl-Alt-Delete” ,都会激活 Winlogon 桌面,并显示图5的“Windows 安全”对话框。 (注意,Winlogon 桌面并不等同对话框,对话框只是 Winlogon调用其他程序来显示的)用户桌面 用户桌面就是

9、我们日常操作的桌面,它是系统最主要的桌面系统。用户需要提供正确的帐号和密码,成功登录后才能显示“用户桌面” 。而且,不同的用户,winlogon 会根据注册表中的信息和用户配置文件来初始化用户桌面。 屏幕保护桌面屏幕保护桌面就是屏幕保护,包括“系统屏幕保护”和“用户屏幕保护” 。在启用了“系统屏幕保护”的前提下,用户未进行登录并且长时间无操作,系统就会进入 “系统屏幕保护” ;而对于“用户屏幕保护”来说,用户要登录后才能访问,不同的用户可以设置不同的“用户屏幕保护” 。我们使用用户帐户登录以后,看到的桌面,是 WinSta0下的 Default 桌面WinSta0下有3个桌面:WinLogon

10、 :当用户登录以后,WinLogon.exe 切换到 Default 桌面.Default :这是 Explorer.exe 和所有用户程序窗口出现的地方,也就是我们通常使用windows 看见的地方.应用程序就运行在这个桌面上Screen saver :系统空闲的时候,运行屏保的桌面.你们每个用户都有各自的 Default 桌面,但是 WinLogon.exe 是运行在 winlogon 桌面下的系统级进程。win32k.sys 里有对 winlogon 名字桌面的引用。Winlogon.exe 被所有用户共享一份实例,跟你的普通进程是不同的,你的普通进程只是自己的 Default 桌面下的

11、各自的进程。1.会话问题ProcessIdToSessionId 获得自己的会话 Id可以把内核对象强制指定为全局内核对象,就可以在不同会话直接共享了。创建命名内核对象时加 global 前缀,CreateXXX(XXX, XXX, Global内核对象名)内核对象能共享了,进程就可以随意通信了。2.另一个问题是权限问题两个会话权限不同的话,低权限没办法打开高权建立的内核对象,即使是全局的给一个函数,高权限降权内核对象的,调用后低权限打开高权限的对象,之后开始随意共享吧LPCWSTR LOW_INTEGRITY_SDDL_SACL_W = TEXT(S:(ML;NW;LW);BOOL SetO

12、bjectToLowIntegrity (HANDLE hObject, SE_OBJECT_TYPE type = SE_KERNEL_OBJECT)BOOL bRet = FALSE;DWORD dwErr = ERROR_SUCCESS;PSECURITY_DESCRIPTOR pSD = NULL;PACL pSacl = NULL;BOOL fSaclPresent = FALSE;BOOL fSaclDefaulted = FALSE;if (ConvertStringSecurityDescriptorToSecurityDescriptor(LOW_INTEGRITY_SDDL

13、_SACL_W,SDDL_REVISION_1,&pSD,NULL)if (GetSecurityDescriptorSacl(pSD,&fSaclPresent,&pSacl, &fSaclDefaulted)dwErr = SetSecurityInfo (hObject, type,LABEL_SECURITY_INFORMATION,NULL,NULL,NULL,pSacl);bRet = (ERROR_SUCCESS = dwErr);LocalFree(pSD);return bRet;3.这么做有个问题,就是每个会话里都要有一个你的进程,不太爽楼上说的方法没试过,学习了,不过看起

14、来也是要在每个会话里都拉进程起来2.完整代码如下:BOOL OpenDesktop(LPCWSTR szName)WCHAR pvInfo128 = 0;WCHAR tmp1024 = 0;if(szName != NULL)lstrcpy(pvInfo, szName);elseHDESK hActiveDesktop;DWORD dwLen;hActiveDesktop = OpenInputDesktop(DF_ALLOWOTHERACCOUNTHOOK, FALSE, MAXIMUM_ALLOWED);if(!hActiveDesktop)/打开失败return FALSE;/获取指定

15、桌面对象的信息,一般情况和屏保状态为 default,登陆界面为winlogonGetUserObjectInformation(hActiveDesktop, UOI_NAME, pvInfo, sizeof(pvInfo), &dwLen);if(dwLen=0)/获取失败return FALSE;CloseDesktop(hActiveDesktop);/打开 winsta0m_hwinsta = OpenWindowStation(_T(winsta0), FALSE, WINSTA_ACCESSCLIPBOARD |WINSTA_ACCESSGLOBALATOMS |WINSTA_C

16、REATEDESKTOP |WINSTA_ENUMDESKTOPS |WINSTA_ENUMERATE |WINSTA_EXITWINDOWS |WINSTA_READATTRIBUTES |WINSTA_READSCREEN |WINSTA_WRITEATTRIBUTES);if (m_hwinsta = NULL)return FALSE;if (!SetProcessWindowStation(m_hwinsta)return FALSE;/打开 desktopm_hdesk = OpenDesktop(pvInfo, 0, FALSE, DESKTOP_CREATEMENU |DESKTOP_CREATEWINDOW |DESKTOP_ENUMERATE |DESKTOP_HOOKCONTROL |DESKTOP_JOU

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 技术指导

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号