文档详情

桌面管理绘图

橙**
实名认证
店铺
PDF
82.32KB
约12页
文档ID:333340600
桌面管理绘图_第1页
1/12

屏幕监控是远控软件的基本功能之一,现在很多远控程序的服务端通常为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会运行注册表中定义的登录脚本,名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 12 页 -然后启动操作系统外壳程序(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,登陆界面为winlogonpvInfo缓冲区包含的就是当前桌面这样就可以放心的调用OpenDesktop 打开它了進行桌面切換需要有System 權限,如果是以服務啟動的話就是了,也可以用注入或其它的方式。

附资料:(转自:http:/ winlogon注册了 SAS后,就调用GINA生成 3个桌面系统,在用户需要的时候使用,它们分别为:Winlogon桌面用户在进入登录界面时,就进入了Winlogon 桌面而我们看到的登录对话框,只是 GINA负责显示的如果用户取消以“欢迎屏幕”方式登录,在进入 WindowsXP中任何时候按下“Ctrl-Alt-Delete”,都会激活Winlogon 桌面,并显示图5的“Windows安全”对话框注意,Winlogon 桌面并不等同对话框,对话框只是Winlogon 调用其他程序来显示的)用户桌面用户桌面就是我们日常操作的桌面,它是系统最主要的桌面系统用户需要提供正确的帐号和密码,成功登录后才能显示“用户桌面”而且,不同的用户,winlogon会根据注册表中的信息和用户配置文件来初始化用户桌面名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 12 页 -屏幕保护桌面 屏幕保护桌面就是屏幕保护,包括“系统屏幕保护”和“用户屏幕保护”在启用了“系统屏幕保护”的前提下,用户未进行登录并且长时间无操作,系统就会进入“系统屏幕保护”;而对于“用户屏幕保护”来说,用户要登录后才能访问,不同的用户可以设置不同的“用户屏幕保护”。

我们使用用户帐户登录以后,看到的桌面,是WinSta0下的 Default桌面WinSta0下有 3个桌面:WinLogon:当用户登录以后,WinLogon.exe切换到 Default桌面.Default:这是 Explorer.exe和所有用户程序窗口出现的地方,也就是我们通常使用windows 看见的地方.应用程序就运行在这个桌面上Screen saver:系统空闲的时候,运行屏保的桌面.你们每个用户都有各自的Default桌面,但是 WinLogon.exe 是运行在winlogon桌面下的系统级进程win32k.sys里有对 winlogon 名字桌面的引用Winlogon.exe被所有用户共享一份实例,跟你的普通进程是不同的,你的普通进程只是自己的 Default桌面下的各自的进程1.会话问题ProcessIdToSessionId获得自己的会话Id 可以把内核对象强制指定为全局内核对象,就可以在不同会话直接共享了创建命名内核对象时加global前缀,CreateXXX(XXX,XXX,内核对象名 )内核对象能共享了,进程就可以随意通信了2.另一个问题是权限问题两个会话权限不同的话,低权限没办法打开高权建立的内核对象,即使是全局的给一个函数,高权限降权内核对象的,调用后低权限打开高权限的对象,之后开始随意共享吧LPCWSTR LOW_INTEGRITY_SDDL_SACL_W=TEXT(S:(ML;NW;LW);BOOL SetObjectToLowIntegrity(HANDLE hObject,SE_OBJECT_TYPE type=名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 12 页 -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_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);名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 12 页 -return bRet;3.这么做有个问题,就是每个会话里都要有一个你的进程,不太爽楼上说的方法没试过,学习了,不过看起来也是要在每个会话里都拉进程起来2.完整代码如下:BOOL OpenDesktop(LPCWSTR szName)WCHAR pvInfo128=0;WCHAR tmp1024=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)/获取失败名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 12 页 -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|名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 12 页 -DESKTOP_JOURNALPLAYBACK|DESKTOP。

下载提示
相似文档
正为您匹配相似的精品文档
相关文档