首页> 中国专利> 一种通过Windows系统服务监控Windows系统剪贴板的方法

一种通过Windows系统服务监控Windows系统剪贴板的方法

摘要

本发明公开了一种通过Windows系统服务监控Windows系统剪贴板的方法,包括以下步骤:A.对与剪贴、复制和粘贴操作相关的系统服务信息初始化,查找到系统描述符表及系统服务Nt、User、Get、Clipboard、Data和Nt、User、Set、Clipboard、Data的服务号ID;B.计算系统服务Nt、User、Get、Clipboard、Data和Nt、User、Set、Clipboard、Data在Windows中的地址偏移;C.HOOK两个系统核心态服务Nt、User、Get、Clipboard、Data和Nt、User、Set、Clipboard、Data;D.有操作请求时,用户发出的剪贴板操作信息进入HOOK的两个相应函数:New、Nt、User、Get、Clipboard、Data和New、Nt、User、Set、Clipboard、Data,从而监控剪贴板的所有操作,并通过逻辑判断作相应处理,采用本发明一种通过Windows系统服务监控Windows系统剪贴板的方法,能对用户的剪切、复制、粘贴操作进行全面控制,并对各种软件具有普遍适用性,而且不影响合法用户的正常操作,做到与应用无关。

著录项

  • 公开/公告号CN101101621A

    专利类型发明专利

  • 公开/公告日2008-01-09

    原文格式PDF

  • 申请/专利权人 北京鼎信高科信息技术有限公司;

    申请/专利号CN200710118584.2

  • 申请日2007-07-10

  • 分类号G06F21/22(20060101);

  • 代理机构11299 北京市卓华知识产权代理有限公司;

  • 代理人陈子英

  • 地址 100085 北京市海淀区上地信息路11号彩虹大厦北楼306室

  • 入库时间 2023-12-17 19:37:05

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-08-12

    未缴年费专利权终止 IPC(主分类):G06F21/22 专利号:ZL2007101185842 申请日:20070710 授权公告日:20090204

    专利权的终止

  • 2017-10-20

    专利权的转移 IPC(主分类):G06F21/22 登记生效日:20170926 变更前: 变更后: 申请日:20070710

    专利申请权、专利权的转移

  • 2017-09-15

    专利权保全的解除 IPC(主分类):G06F21/22 授权公告日:20090204 解除日:20170711 申请日:20070710

    专利权的保全及其解除

  • 2016-08-31

    专利权的保全 IPC(主分类):G06F21/22 授权公告日:20090204 登记生效日:20160711 申请日:20070710

    专利权的保全及其解除

  • 2013-07-03

    专利权的转移 IPC(主分类):G06F21/22 变更前: 变更后: 登记生效日:20130607 申请日:20070710

    专利申请权、专利权的转移

  • 2009-02-04

    授权

    授权

  • 2008-02-27

    实质审查的生效

    实质审查的生效

  • 2008-01-09

    公开

    公开

查看全部

说明书

技术领域

本发明涉及一种通过Windows系统服务监控Windows系统剪贴板的方法,属于计算机技术领域。

背景技术

目前,很多网站和应用软件对用户的剪切、复制、粘贴操作进行了一些控制,但这些控制存在一些缺陷。有些网站只是进行禁止复制的单一控制,无法阻止用户通过其他方式拷贝网站的文本内容;应用软件的操作控制功能有个体局限性,不具备普遍适用性。除此之外,微软对Windows剪贴板提供了一套API,用来用户进行第二次开发和调用,有些厂商为了对剪贴板进行监控,采取了HOOK这些API或者WINDOWS消息的机制来实现这一功能,但这种实现方式也只能针对部分特定的应用软件,无法对所有应用软件有效,更不能做到与应用无关。

发明内容

为克服现有技术的上述缺陷,本发明提供了一种通过Windows系统服务监控Windows系统剪贴板的方法,这种方法能对用户的剪切、复制、粘贴操作进行完全控制,并对各种软件具有普遍适用性,而且与应用无关。

本发明实现上述目的的技术方案是:一种通过Windows系统服务监控Windows系统剪贴板的方法,其特征在于采用WINDOWS内核HOOK技术对剪贴板相关的系统服务进行HOOK,从而达到对WINDOWS系统剪贴板监控的目的,该方法包括以下步骤:

A、对与剪贴、复制和粘贴操作相关的系统服务信息初始化,找到两个系统描述符表ServiceDescriptorTable和ServiceDescriptorTableShadow,获得两个系统服务NtUserGetClipboardData和NtUserSetClipboardData的服务号ID;

B、计算系统服务NtUserGetClipboardData和NtUserSetClipboardData在Windows中的地址偏移;

C、HOOK两个系统核心态服务NtUserGetClipboardData和NtUserSetClipboardData;

D、有操作请求时,用户发出的原进入系统服务NtUserSetClipboardData和NtUserGetClipboardData的剪贴板操作信息就会进入HOOK的两个相应函数:NewNtUserGetClipboardData和NewNtUserSetClipboardData,在这两个函数中,实现监控剪贴板的所有逻辑处理;

E、退出监控驱动,对两个系统服务解除HOOK。

其中,所述步骤A包括下列步骤:

A1、找到已由Ntoskrnl.exe公开导出的系统描述符表ServiceDescriptorTable(简称:SDT);

A2、通过在系统内存空间的搜索方式找到ServiceDescriptorTableShadow在win32k.sys中的基地址;

A3、通过辅助驱动程序LocalSystem.sys取得两个系统服务NtUserGetClipboardData和NtUserSetClipboardData对应当前系统版本的服务号ID。

所述步骤D中的逻辑处理包括以下步骤:

(1)获取当前发起剪切、复制、粘贴请求的进程号(PID);

(2)获取当前发起剪切、复制、粘贴请求的进程进程名(ProcessName);

(3)判断当前进程号是否是在受监控进程列表中,或者当前进程名是否是csrss.exe,对请求做保留、丢弃或加密等处理。

该方法还在剪贴板HOOK驱动中定义一个分支IRP,以实现操作的中断控制。

本发明通过Windows系统服务监控Windows系统剪贴板的方法采用以上步骤通过在Windows系统核心级,运用Windows内核HOOK技术对剪贴板相关的系统服务进行HOOK,从而达到对Windows系统剪贴板全面的监控目的;由于本方法直接HOOK两个与剪贴板监控相关的最重要的系统核心态服务NtUserGetClipboardData和NtUserSetClipboardData,使对用户剪贴板操作请求的控制具有普遍性;本方法的处理过程不需其他额外的操作,由于感觉不到计算机的底层运行情况,丝毫不影响用户的合法正常操作,而且做到与应用无关。

附图说明

图1为本发明的逻辑流程图。

具体实施方式

如附图所示,在剪贴板HOOK驱动入口函数中对需要HOOK的系统服务信息进行初始化,经过深入分析研究windows内核,找到WINDOWS系统服务的入口,名为系统描述符表(简称:SDT),这是由Ntoskrnl.exe公开导出的结构体;在系统描述符表(SDT)中查找剪贴板监控相关的系统服务ID;计算HOOK的系统服务在Windows中的地址偏移;对剪贴板监控相关的系统服务进行HOOK,当用户发起剪贴板相关操作时,在核心态会进入HOOK后的函数中,在相关的HOOK函数中进行剪贴板相关的监控请求逻辑处理。

1、在剪贴板HOOK驱动入口函数DriverEntry()中对需要HOOK的系统服务信息进行初始化,例如在一个函数InitializeGlobalVariables()中对需要用到的HOOK相关的全局变量信息进行初始化,具体步骤如下:

(1)经过深入分析研究Windows内核,找到WINDOWS系统服务的入口,名为系统描述符表(简称:SDT),这是由Ntoskrnl.exe公开导出的结构体。在WINDOWS中为SDT定义了一个如下数据结构:

typedef struct ServiceDescriptorEntry

{

  unsigned int*ServiceTableBase;

  unsigned int*ServiceCounterTableBase;

  unsigned int NumberOfServices;

  unsigned char*ParamTableBase;

}ServiceDescriptorTableEntry_t,*PServiceDescriptorTableEntry_t;

定义一个全局的变量KeServiceDescriptorTable如下:

_declspec(dllimport)ServiceDescriptorTableEntry_t KeServiceDescriptorTable。

(2)在WinNT中还有一个这样的结构体,名为ServiceDescriptorTableShadow,这个结构体未被导出,是一个未公开的不易访问的描述符,只在模块内部使用,这是Windows系统维护的第二个SDT,其在win32k.sys中定义。通过在系统内存空间中采用搜索的方式,找到ServiceDescriptorTableShadow在win32k.sys中的基地址指针。

(3)定义系统相关的六个全局变量:

ULONG g_ServiceDescriptorTableShadowPtr;

ULONG g_oW32KServiceBasePtr;

ULONG g_CurrentW32KServiceTable;

UINT  g_W32KServiceCount;

UINT  g_GetClipboardDataServiceId;

UINT  g_SetClipboardDataServiceId。

各个变量代表意义描述如下:

g_ServiceDescriptorTableShadowPtr:在win32k.sys中SDT的基地址;

g_oW32KServiceBasePtr:原始的在win32k.sys中SDT的基地址;

g_CurrentW32KServiceTable:当前在win32k.sys中SDT的基地址;

g_W32KServiceCount:在win32k.sys中系统服务的个数;

g_GetClipboardDataServiceId:在win32k.sys中NtUserGetClipboardData的服务号;

g_SetClipboardDataServiceId:在win32k.sys中NtUserSetClipboardData的服务号。

(4)将b中找到的ServiceDescriptorTableShadow在WIN32K.SYS中的基地址保存在全局变量ServiceDescriptorTableShadowPtr中;

将(ULONG)(*(PULONG)(g_ServiceDescriptorTableShadowPtr+0x10))的值保存在全局变量g_oW32KServiceBasePtr中;

将(ULONG)(*(PULONG)(g_ServiceDescriptorTableShadowPtr+0x18))的值保存在全局变量g_W32KServiceCount中;

进行如下赋值:g_CurrentW32KServiceTable=g_oW32KserviceBasePtr;

(5)因为windows系列的操作系统中各个版本(eg:windows 2000/xp/2003)的系统服务在SDT中的基地址不一致,所以为了得到NtUserGetClipboardData和NtUserSetClipboardData在WIN32K.SYS中的服务号,我们通过一个辅助的小驱动程序(LocalSystem.sys)来根据操作系统的不同版本取得对应的服务号。

(6)在LocalSystem.sys中的头文件内定义一个如下数据结构和变量:

typedef struct_LOCAL_SYSTEM

{

ULONG Version;//os version,such as 0x0501

ULONG NtUserSetClipboardDataServiceId;

ULONG NtUserGetClipboardDataServiceId;

}LOCAL_SYSTEM,*PLOCAL_SYSTEM;

extern LOCAL_SYSTEM g_LocalSystem;

并将g_LocalSystem导出,以供剪贴板HOOK驱动调用。

(7)将g_LocalSystem.NtUserGetClipboardDataServiceId保存在(3)中定义的全局变量g_GetClipboardDataServiceId中;

将g_LocalSystem.NtUserSetClipboardDataServiceId保存在c中定义的全局变量g_SetClipboardDataServiceId中。

2、在剪贴板HOOK驱动中的IRP_MJ_DEVICE_CONTROL这个IRP中定义一个分支IOCTL_HOOK_CLIPBORAD_SERVICE,在这个分支IRP中实现如下操作:

//禁止中断

(*(PULONG)(g_ServiceDescriptorTableShadowPtr+0x10))    =

(ULONG)g_nW32KServiceTable;

//允许中断

g_CurrentW32KServiceTable=(ULONG)g_nW32KServiceTable;

3、对NtUserGetClipboardData和NtUserSetClipboardData两个系统服务进行HOOK:定义一个HOOK这两个系统服务的函数HookServices(),在此函数中进行如下实现:

伪代码:

      ULONG ptrW32p=g_CurrentW32KServiceTable;

    OldNtUserGetClipboardData                                        =

(NTUSERGETCLIPBOARDDATA)(*(PULONG)(ptrW32p+g_GetClipboardDataServiceId*4)

);

       OldNtUserSetClipboardData                                     =

(NTUSERSETCLIPBOARDDATA)(*(PULONG)(ptrW32p+g_SetClipboardDataServiceId*4)

);

       _asm

         {

           cli

           mov eax,CRO

           and eax,not 0x10000

           mov CRO,eax

          } //dissable interrupt

          (*(PULONG)(PVOID)(ptrW32p+g_GetClipboardDataServiceId*4))    =

(DWORD)NewNtUserGetClipboardData;

(*(PULONG)(PVOID)(ptrW32p+g_SetClipboardDataServiceId*4))              =

(DWORD)NewNtUserSetClipboardData;

          _asm

{

           MOV EAX,CRO      //move CRO register into EAX

           OR  EAX,10000H     //enable WP bit

           MOV CRO,EAX      //write register back

           STI               //enable interrupt

         }

当系统有剪切、复制、粘贴操作请求时,从剪贴板取数据会进入系统服务NtUserGetClipboardData,向剪贴板写数据会进入系统服务NtUserSetClipboardData,我们的监控驱动对这两个系统服务进行了HOOK,所以用户发出的操作剪贴板信息就会进入HOOK的两个函数:NewNtUserGetClipboardData,NewNtUserSetClipboardData,在这个函数中,实现了监控剪贴板所有的逻辑处理;

4、退出剪贴板操作请求监控驱动时,在Unload()中对NtUserGetClipboardData和NtUserSetClipboardData两个系统服务解除HOOK,定义一个解除HOOK这两个系统服务的函数UnHookServices(),在此函数中进行如下实现:

伪代码:

//禁止中断

_asm

    {

     cli

     mov eax,CRO

     and eax,not 0x10000

     mov CRO,eax

}

(*(PULONG)(g_ServiceDescriptorTableShadowPtr+0x10))              =

g_oW32KServiceBasePtr;

//解除禁止中断

_asm

{

     MOV EAX,CRO         //move CRO register into EAX

     OR  EAX,10000H       //enable WP bit

     MOV CRO,EAX         //write register back

     STI                  //enable interrupt

}

g_CurrentW32KServiceTable=g_oW32KServiceBasePtr;

5、两个HOOK的系统服务内部处理逻辑如下:

(1)从剪贴板取数据(对应的服务例程:NewNtUserGetClipboardData)中逻辑如下:

A、获取当前发起剪切、复制、粘贴请求的进程号(PID);

B、获取当前发起剪切、复制、粘贴请求的进程进程名(ProcessName);

C、判断当前PID是否是在受监控进程列表中,或者当前进程名是否是csrss.exe。

a)如果当前PID在受监控进程列表中或当前进程名是csrss.exe,则进行如下处理:

if(flag==FALSE)//flag为一个全局变量

         return FALSE;//此处返回,丢弃用户操作请求,或进行加密处理

else if(flag==TRUE&&strcmp(ProcessName,″csrss.exe″)==0)

         return FALSE//此处返回,丢弃用户操作请求,或进行加密处理

else

     //donothing;

b)如果a)的条件不满足,则进行如下逻辑处理:

if(flag==TRUE)//flag为一个全局变量

        return FALSE;//此处返回,丢弃用户操作请求,或进行加密处理

(2)向剪贴板放数据(对应服务例程:NewNtUserSetClipboardData)中处理逻辑如下:

A、获取当前发起剪切、复制、粘贴请求的进程号(PID);

B、获取当前发起剪切、复制、粘贴请求的进程进程名(ProcessName);

C、判断当前PID是否是在受监控进程列表中,或者当前进程名是否是csrss.exe。

a)如果当前PID在受监控进程列表中或当前进程名是csrss.exe,则进行如下处理:

     Begin

     if(g_flag==FALSE)then//g_flag为一个全局变量

          return FALSE;//此处返回,丢弃用户操作请求,或进行加密处理

     else if(g_flag==TRUE&&strcmp(ProcessName,″csrss.exe″)==0)then

     return FALSE;//此处返回,丢弃用户操作请求,或进行加密处理

else then

       //donothing;

     Endif

     End

b)如果a)的条件不满足,则进行如下逻辑处理:

  begin

  if(g_flag==TRUE)then//g_flag为一个全局变量

           return FALSE;//此处返回,丢弃用户操作请求,或进行加密处理

     Endif

     End

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号