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

文档序号:6610011阅读:501来源:国知局
专利名称:一种通过Windows系统服务监控Windows系统剪贴板的方法
技术领域
本发明涉及一种通过Windows系统服务监控Windows系统剪贴板的方法,属于计算机 技术领域。
背景技术
目前,很多网站和应用软件对用户的剪切、复制、粘贴操作进行了一些控制,但这些 控制存在一些缺陷。有些网站只是进行禁止复制的单一控制,无法阻止用户通过其他方式 拷贝网站的文本内容;应用软件的操作控制功能有个体局限性,不具备普遍适用性。除此 之外,微软对Windows剪贴板提供了一套API,用来用户进行第二次开发和调用,有些厂 商为了对剪贴板进行监控,采取了H00K这些API或者WINDOWS消息的机制来实现这一功 能,但这种实现方式也只能针对部分特定的应用软件,无法对所有应用软件有效,更不能 做到与应用无关。

发明内容
为克服现有技术的上述缺陷,本发明提供了一种通过Windows系统服务监控Windows 系统剪贴板的方法,这种方法能对用户的剪切、复制、粘贴操作进行完全控制,并对各种 软件具有普遍适用性,而且与应用无关。
本发明实现上述目的的技术方案是 一种通过Windows系统服务监控Windows系统剪 贴板的方法,其特征在于采用WINDOWS内核H00K技术对剪贴板相关的系统服务进行HOOK, 从而达到对WINDOWS系统剪贴板监控的目的,该方法包括以下步骤
A、对与剪贴、复制和粘贴操作相关的系统服务信息初始化,找到两个系统描述符表 ServiceDescriptorTable 禾口 ServiceDescriptorTableShadow , 获得两个系统月艮务 NtUserGetClipboardData和NtUserSetClipboardData的服务号ID;
的地址偏移;C、 HOOK两个系统核心态服务NtUserGetClipboardData和NtUserSetClipboardData;
D、 有操作请求时,用户发htl的原进入系统服务NtUserSetClipboardData和 NtUserGetClipboardData的剪贴板操作信息就会进入HOOK的两个相应函数 NewNtUserGetClipboardData和NewNtUserSetClipboardData,在这两个函数中,实现监控 剪贴板的所有逻辑处理;
E、 退出监控驱动,对两个系统服务解除H00K。 其中,所述步骤A包括下列歩骤-
Al、找到已由Ntoskrnl. exe公开导出的系统描述符表ServiceDescriptorTable(简称 SDT);
A2、通过在系统内存空间的搜索方式找到ServiceDescriptorTableShadow在 win32k. sys中的基地址;
A3、通过辅助驱动程序LocalSystem. sys取得两个系统服务NtUserGetClipboardData 和NtUserSetClipboardData对应当前系统版本的服务号ID。
所述歩骤D中的逻辑处理包括以下步骤
(1) 获取当前发起剪切、复制、粘贴请求的进程号(PID);
(2) 获取当前发起剪切、复制、粘贴请求的进程进程名(ProcessNa鹏);
(3) 判断当前进程号是否是在受监控进程列表中,或者当前进程名是否是csrss. exe, 对请求做保留、丢弃或加密等处理。
该方法还在剪贴板H00K驱动中定义一个分支IRP,以实现操作的中断控制。 本发明通过Windows系统服务监控Windows系统剪贴板的方法采用以上步骤通过在 Windows系统核心级,运用Windows内核HOOK技术对剪贴板相关的系统服务进行H00K, 从而达到对Windows系统剪贴板全面的监控目的;由于本方法直接HOOK两个与剪贴板监控 相关的最重要的系统核心态服务NtUserGetClipboardData和NtUserSetClipboardData, 使对用户剪贴板操作请求的控制具有普遍性;本方法的处理过程不需其他额外的操作,由 于感觉不到计算机的底层运行情况,丝毫不影响用户的合法正常操作,而且做到与应用无关。


图1为本发明的逻辑流程图。
具体实施例方式
如附图所示,在剪贴板HOOK驱动入口函数中对需要HOOK的系统服务信息进行初始 化,经过深入分析研究windows内核,找到WINDOWS系统服务的入口,名为系统描述符表 (简称SDT),这是由Ntoskrnl.exe公开导出的结构体;在系统描述符表(SDT)中查找剪贴 板监控相关的系统服务ID;计算HOOK的系统服务在Windows中的地址偏移;对剪贴板监 控相关的系统服务进行HOOK ,当用户发起剪贴板相关操作时,在核心态会进入HOOK后的 函数中,在相关的H00K函数中进行剪贴板相关的监控请求逻辑处理。
1、在剪贴板H00K驱动入口函数DriverEntry()中对需要H00K的系统服务信息进行 初始化,例如在一个函数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) 定义系统相关的六个全局变量
UL0NG g—ServiceDescriptorTableShadowPtr; UL0NG g_oW32KServiceBasePtr; UL0NG g_CurrentW32KServiceTable; UINT g_W32KServiceCount; UINT g—GetClipboardDataServiceld; UINT g—SetClipboardDataServiceId。 各个变量代表意义描述如下
g一ServiceDescriptorTableShadowPtr:在win32k. sys中SDT的基地址; g—oW32KServiceBasePtr:原始的在win32k. sys中SDT的基地址; g—CurrentW32KServiceTable:当前在win32k. sys中SDT的基地址; g—W32KServiceCount: 在win32k. sys中系统服务的个数;
g一GetClipboardDataServiceld: 在win32k. sys中NtUserGetClipboaxdData.的月艮务
号;
g—SetClipboardDataServiceld: 在win32k. sys中NtUserSetClipboardData的月艮务号。
(4) 将b中找到的ServiceDescriptorTableShadow在WIN32K.SYS中的基地址保存 在全局变量ServiceDescriptorTableShadowPtr中;
将(ULONG) (*(PUL0NG) (g—ServiceDescriptorTableShadowPtr+0x10))的值保存在全 局变量g—oW32KServiceBasePtr中;
将(ULONG) (*(PUL0NG) (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
UL0NG NtUserSetClipboardDataServiceld; UU)NG NtUserGetClipboardDataServiceld; }LOCAL—SYSTEM, *PL0CAL—SYSTEM; extern LOCAL—SYSTEM g—LocalSystem; 并将g—LocalSystem导出,以供剪贴板HOOK驱动调用。
(7) 将g—LocalSystem. NtUserGetClipboardDataServiceld保存在(3)中定义的全 局变量g一GetClipboardDataServiceld中;
将g—LocalSystem. NtUserSetClipboardDataServiceld保存在c中定义的全局变量 g一SetClipboardDataServiceld中。
2、在剪贴板HOOK驱动中的IRP—MJ—DEVICE—CONTROL这个IRP中定义一个分支 I0CTL—HOOK—CLIPB0RAD—SERVICE,在这个分支IRP中实现如下操作 //禁止中断
O(PULONG)(g一ServiceDescriptorTableShadowPtr+0x10)) = (ULONG)g一nW32KServiceTable;〃允许中断
g—CurrentW32KServiceTable = (UL0NG)g_nW32KServiceTable;
3、对NU)serGetClipboardData禾Q NtUserSetCUpboardData两个系统服务进 行H00K:定义一个H00K这两个系统服务的函数HookServices (),在此函数中进行如下 实现-
伪代码
UL0NG ptrW32p = g—CurrentW32KServiceTable; OldNtUserGetClipboaxdData = (NTUSERGETCLIPBOARDDATA)(*(PUL0NG)(PtrW32p+g_GetClipboardDataServiceId*4) );
OldNtUserSetClipboardData = (NTUSERSETCLIPBOARDDATA)(*(PUL0NG)(ptrW32p+g—SetClipboardDataServiceId*4)
一asm
cli
roov eax, CRO and eax, not 0x10000 mov CR0, eax } //dissable interrupt (*(PUL0NG)(PVOID)(ptrW32p+g—GetClipboardDataServiceId*4)) = (DWORD)NewNtUserGetClipboardData;
(*(PULONG)(PVOID)(ptrW32p+g—SetClipboardDataServiceId*4)) = (DWORD)NewNtUserSetClipboardData; 一asmMOV EAX, CROOR EAX, 10000HMOV CRO, EAX STI//move CRO register into EAX〃enable bit //write register back //enable interrupt当系统有剪切、复制、粘贴操作请求时,从剪贴板取数据会进入系统服务 NtUserGetClipboardData,向剪贴板写数据会进入系统服务NtUserSetClipboardData , 我们的监控驱动对这两个系统服务进行了 HOOK ,所以用户发出的操作剪贴板信息就会进 入HOOK的两个函数New細serGetClipboardData, NewNtUserSetClipboardData ,在这 个函数中,实现了监控剪贴板所有的逻辑处理;4、退出剪贴板操作请求监控驱动时,在Unload()中对NtUserGetClipboardData和 NtUserSetClipboardData两个系统服务解除HOOK,定义一个解除HOOK这两个系统服务的 函数UnHookServices (),在此函数中进行如下实现伪代码-〃禁止中断 一asmclimov eax, CROand eax, not 0x10000mov CRO, eax(*(PUL0NG)(g—ServiceDescriptorTableShado邻Ptr+0x10)) = g一oW32KServiceBasePtr; 〃解除禁止中断3sm//move CR0 register into EAX〃enable WP bit //write register back //enable interruptMOV EAX, CRO OR EAX, 10000H MOV CRO, EAX STIg—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 〃此处返回,丢弃用户操作请求,或进行加密处理slss//donothing: b)如果a)的条件不满足,则进行如下逻辑处理 if (flag TRUE) 〃 flag为一个全局变量return FALSE: 〃此处返回,丢弃用户操作请求,或进行加密处理 (2)向剪贴板放数据(对应服务例程NewNtUserSetClipboardData)中处理逻辑如下A、 获取当前发起剪切、复制、粘贴请求的进程号(PID);B、 获取当前发起剪切、复制、粘贴请求的进程进程名(ProcessName);C、 判断当前PID是否是在受监控进程列表中,或者当前进程名是否是csrss.exe。a) 如果当前PID在受监控进程列表中或当前进程名是csrss.exe ,则进行如下处理Beginif(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 Endb) 如果a)的条件不满足,则进行如下逻辑处理-beginif(g—flag== TRUE) then〃 g_flag为一个全局变量return FALSE; 〃此处返回,丢弃用户操作请求,或进行加密处理Endif End
权利要求
1、一种通过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。
2、 如权利要求1所述的通过Windows系统服务监控Windows系统剪贴板的方法,其 特征在于所述步骤A包括下列步骤Al、找到已由Ntoskrnl. exe公开导出的系统描述符表ServiceDescriptorTable(简称 SDT);A2、找到ServiceDescriptorTableShadow在win32k. sys中的基地址', A3、取得两个系统服务NtUserGetClipboardData和NtUserSetClipboardData对应当 前系统版本的服务号ID。
3、 如权利要求2所述的通过Windows系统服务监控Windows系统剪贴板的方法,其 特征在于所述步骤A2是通过在系统内存空间的搜索方式,找到 ServiceDescriptorTableShadow在win32k. sys中的基地址的。
4、 如权利要求2所述的通过Windows系统服务监控Windows系统剪贴板的方法,其 特征在于所述步骤A3是通过辅助驱动程序LocalSystem. sys取得两个系统服务 NtUserGetClipboardData和NtUserSetClipboardData对应当前系统版本的服务号ID的。
5、 如权利要求1所述的通过Windows系统服务监控Windows系统剪贴板的方法,其特征在于所述步骤D中的逻辑处理包括以下步骤(1) 获取当前发起剪切、复制、粘贴请求的进程号(PID);(2) 获取当前发起剪切、复制、粘贴请求的进程进程名(ProcessName);(3) 判断当前进程号是否是在受监控进程列表中,或者当前进程名是否是csrss. exe, 对请求做保留、丢弃或加密等处理。
6、 如权利要求1所述的通过Windows系统服务监控Windows系统剪贴板的方法,其 特征在于在剪贴板HOOK驱动中定义一个分支IRP,以实现操作的中断控制。
全文摘要
本发明公开了一种通过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系统剪贴板的方法,能对用户的剪切、复制、粘贴操作进行全面控制,并对各种软件具有普遍适用性,而且不影响合法用户的正常操作,做到与应用无关。
文档编号G06F21/22GK101101621SQ20071011858
公开日2008年1月9日 申请日期2007年7月10日 优先权日2007年7月10日
发明者俊 吕, 姜斌斌, 磊 张, 文中领, 陈华平 申请人:北京鼎信高科信息技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1