专利名称:Windows操作系统中防止消息挂钩方法
技术领域:
本发明属于计算机领域,更进一步涉及一种Windows操作系统中防止消息挂钩方法。本发明通过对计算机的Windows操作环境下内核系统服务描述影子表进行修改,替换系统函数并对系统调用进行过滤,防止恶意软件通过消息挂钩操作对消息进行截获,提高了 Windows操作环境下进程运行的安全性。
背景技术:
消息挂钩是一种Windows消息处理方法,应用程序可以通过挂钩函数以监视指定窗口的消息,并且所监视的窗口可以是由其他进程所创建的。当消息到达后,挂钩函数可以在目标窗口处理之前处理它。消息挂钩方法允许应用程序截获处理Window消息或系统特定事件。消息挂钩实际上是一个处理消息的程序段,通过SetWindowsHookEx系统调用,把 它挂入系统。每当特定的消息发出,在没有到达目的窗口前,挂钩函数就先捕获该消息,即挂钩函数优先得到消息处理控制权。挂钩函数可以处理该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。通过消息挂钩,可以监视特定进程或系统的鼠标、键盘的操作,还能监视任意窗口的消息记录,从而对程序运行时的安全性造成威胁。目前,已经有一些防止消息挂钩方法。例如,段钢著《加密与解密》(电子工业出版社,2008年第三版,第13章第4节)中公开一种通过修改可执行文件镜像导入地址IAT防止消息挂钩方法。在此方法中,通过找到可执行文件镜像的IAT表,在此表中修改SetWindowsHookEx函数的导出地址,使进程在执行消息挂钩操作时所调用的函数不是系统的消息挂钩地址,而是修改后的挂钩函数,达到了防止消息挂钩的目的。但是,该方法存在的不足是,修改IAT表需要修改可执行文件镜像,并且对每一个需要保护的进程都需要修改其对应的IAT表,导致在防挂钩过程中对IAT表的修改过程较为繁琐,并且该方法无法过滤系统级消息挂钩。
发明内容
本发明的目的在于克服上述已有技术的不足,提出一种Windows操作系统中防止消息挂钩方法。本发明可以防止恶意软件通过调用SetWindowsHookEx系统函数对进程或者系统进行挂钩从而截获Windows消息或系统特定事件。本发明的具体步骤如下(I)设置初始信息用户在计算机屏幕初始界面所列出进程中选择与被保护进程对应的进程号。(2)读取挂钩函数地址2a)从中央处理器CPU段寄存器所指向内存中根据偏移量读取系统服务描述符影子SSDTShadow表基地址;2b)从系统服务描述符影子SSDTShadow表中根据偏移量定位挂钩函数地址;2c)将挂钩函数地址作为原始挂钩函数地址保存。
(3)覆盖挂钩函数地址使用过滤函数地址覆盖挂钩函数地址。(4)截获挂钩操作WindowS系统调用过滤函数,在过滤函数中获得被挂钩进程的进程号。(5)判断是否允许挂钩将被挂钩进程号与步骤Ia)中设置的保护进程号进行对t匕,如果相同,则禁止挂钩操作,否则,调用步骤2c)保存的原始挂钩函数。本发明与现有技术相比具有以下优点第一,由于本发明米用了修改系统服务描述符影子SSDTShadow表的方式,在整个操作系统只需对SSDTShadow表修改一次,克服了现有技术需要对每个进程的IAT表进行修改的不足,使得本发明修改过程简单,降低了对进程的影响,提高了进程的稳定性。第二,由于本发明采用了修改系统服务描述符影子SSDTShadow表的方式,使计算机中所有消息挂钩操作都将被拦截,克服了现有技术无法对系统级消息挂钩操作进行过滤的不足,使得本发明扩大了对消息挂钩操作过滤的范围。
图I是本发明的流程图;图2是本发明的防挂钩仿真图。
具体实施例方式下面结合附图I对本发明作进一步的描述
步骤I,设置初始信息在计算机屏幕初始界面上将系统中所有正在运行的进程根据进程名与进程号列出,用户通过进程名对应的进程号设置被保护进程。步骤2,读取挂钩函数地址中央处理器CPU段寄存器指向一个线程的TEB结构,在TEB结构中偏移量为0x204处保存这个线程系统服务描述符影子SSDTShadow表基地址,这张表记录了 Win32k. sys驱动所有导出函数的地址,而我们要过滤的挂钩函数SetWindowsHookEx也是位于Win32k.sys驱动中的。SetffindowsHookEx的地址位于系统服务描述符影子SSDTShadow表中偏移量为549处,由此可以得到原始函数地址。将挂钩函数地址作为原始挂钩函数地址保存,在允许挂钩的时候调用。步骤3,覆盖挂钩函数地址由于系统在调用Win32k. sys驱动中的函数时会在系统服务描述符影子SSDTShadow表中查询其地址,所以可以通过修改系统服务描述符影子SSDTShadow表过滤挂钩函数。创建一个过滤函数,这个替换函数应与挂钩函数SetWindowsHookEx声明相同。在系统服务描述符影子SSDTShadow表中使用过滤函数地址覆盖挂钩函数地址,这样系统将调用过滤函数而不是原始挂钩函数,从而达到过滤挂钩目的。步骤4,截获挂钩操作Windows系统调用过滤函数,在过滤函数中获得被挂钩进程的进程号。步骤5,判断是否允许挂钩
将被挂钩进程号与步骤I中设置的保护进程号进行对比,如果相同,则禁止挂钩操作,否则,调用步骤2保存的原始挂钩函数进行挂钩,并将执行后的返回值返回系统。下面结合附图2对本发明的效果作进一步描述附图2的仿真在Windows XP平台下进行,用来仿真本发明的防挂钩效果。本仿真在使用本发明前后分别调用SetWindowsHookEx函数,根据调用效果进行说明。附图2为信息输出记录,第一列表示信息序号,第二列表示输出时间,第三列为输出信息内容。(I)首先启动被保护进程,进程的进程号PID为2100。(2)此时并未启动防挂钩保护,在此条件下对被保护进程调用SetWindowsHookEx函数,调用结果为成功,如图2中序号O信息所示。(3)将进程号PID为2100的进程设置为保护进程,并启动防挂钩保护,如图2中序号I信息所不。 (4)在此时对被保护进程调用SetWindowsHookEx函数,本发明检测到调用,判断进程号为2100后,禁止进行挂钩操作,如图2中序号2信息。(5)挂钩函数调用结果为失败,如图2中序号3信息。通过仿真可看出,本发明能够防止消息挂钩,从而实现了对进程的保护。
权利要求
1.一种Windows操作系统中防止消息挂钩方法,具体实现的步骤是 (1)设置初始信息用户在计算机屏幕初始界面所列出进程中选择与被保护进程对应的进程号; (2)读取挂钩函数地址 .2a)从中央处理器CPU段寄存器所指向内存中根据偏移量读取系统服务描述符影子SSDTShadow表基地址; .2b)从系统服务描述符影子SSDTShadow表中根据偏移量定位挂钩函数地址; .2c)将挂钩函数地址作为原始挂钩函数地址保存; (3)覆盖挂钩函数地址使用过滤函数地址覆盖挂钩函数地址; (4)截获挂钩操作Windows系统调用过滤函数,在过滤函数中获得被挂钩进程的进程号; (5)判断是否允许挂钩将被挂钩进程号与步骤Ia)中设置的保护进程号进行对比,如果相同,则禁止挂钩操作,否则,调用步骤2c)保存的原始挂钩函数。
2.根据权利要求I所述的Windows操作系统中防止消息挂钩方法,其特征在于,步骤.2a)中所述的系统服务描述符影子SSDTShadow表基地址在内存中的偏移量为0x204。
3.根据权利要求I所述的Windows操作系统中防止消息挂钩方法,其特征在于,步骤.2b)中所述的挂钩函数地址在系统服务描述符影子SSDTShadow表中的偏移量为549。
全文摘要
本发明公开的一种Windows操作系统中防止消息挂钩方法。本发明通过对Windows操作环境下内核系统服务描述影子表进行修改,替换系统函数并对系统调用进行过滤,防止恶意软件通过消息挂钩操作对消息进行截获,提高了Windows操作环境下进程运行的安全性。
文档编号G06F21/22GK102722679SQ20121018475
公开日2012年10月10日 申请日期2012年6月6日 优先权日2012年6月6日
发明者周洪丞, 孙佳佳, 尹广学, 张坤, 张明月, 杨超, 董超 申请人:西安电子科技大学