基于驱动的进程创建监控的实现
刘利;戚建亮
【摘 要】介绍了驱动开发技术背景及应用,讲述SSDT HOOK方法,实现监控NtCreateProcessEx系统服务.RING3应用程序和驱动程序的交互,RING3应用程序和驱动程序的同步实现基于驱动的进程创建监控.
【期刊名称】《智能计算机与应用》
【年(卷),期】2010(000)003
【总页数】2页(P119-120)
【关键词】驱动;进程创建
【作 者】刘利;戚建亮
【作者单位】大庆师范学院计算机系,黑龙江,大庆,163712;大庆师范学院计算机系,黑龙江,大庆,163712
【正文语种】中 文
【中图分类】TF311.1
1 背景简介
随着互联网的全民化,木马、病毒成为困扰网络安全的一个重要的因素,各主流安全软件推出了基于行为判断的主动防御技术,简易的实现其中功能之一:进程创建监控。
下面的实例是基于驱动程序的,监控的是进程的创建。当进程需要创建时,监控模块会弹出如图1所示的一个窗口,询问是否同意创建这个进程,点击“确定”,进程可以正常运行;点击“取消”,这个进程将无法运行,同时弹出拒绝运行窗口。
2 通过SSDT HOOK方法实现监控NtCreateProcessEx系统服务
要监控进程的创建,简单而有效的方法是SSDT HOOK。System Service Dispath Table是系统服务派送表,通过SSDT HOOK中的系统服务NtCreateProcessEx(),所有来自RING3的进程创建请求都会调用它。如果要更彻底的监控进程的创建,可以HOOK更深层的PspCreateProcess(),详细内容请参考相关资料。
SSDT HOOK时需要注意多线程安全性:可以用MDL来锁住SSDT后再修改,或者调用InterlockedExchange()来修改。系统服务NtCreateProcessEx()的参数如下:
当RING3的应用程序需要创建一个进程时,参数OUT PHANDLE ProcessHandle会在进程创建成功后返回该进程的HANDLE。
createprocessa通过该方法可以获取创建这个进程的父窗口的PID和即将创建的进程的路径。驱动程序是没有自己独立的进程的,而是“依附”在调用者的进程中,当RING3有进程创建进程而进入HOOK后的NtCreateProcessEx(),通过调用PsGetCurrentProcess()可获得调用 NtCreateProcessEx()进程的进程信息,调用PsGetCurrentProcessId()能获得调用NtCreateProcessEx()进程的进程PID(进程标识符);通过参数中的SectionHandle,获得对应的FileObject,再通过FileName获得即将创建的进程的路径。
3 RING3应用程序和驱动程序的交互
RING3应用程序要发信息给驱动程序,通过调用API DeviceIoControl,但是这种模式是单向的,即RING3应用程序可以主动与驱动交互,但是驱动却没有方法主动与RING3应用程
序交互,有大量数据需要交换时DeviceIoControl的效率不高。开辟一块驱动程序和RING3应用程序都可以同时访问的内存区域,直接共享数据可以提高效率,用MDL可以实现共享内存的开辟。下面是实现代码:
MDL是分配好了,但是怎么告诉RING3应用程序呢?还是让RING3应用程序通过DeviceIoControl来主动询问吧。下面的代码是驱动中DeviceIoControl中获得共享内存地址的IOCTL TRUEINFOCLIENT_INT_CONNECT对应的代码段。
接上面的代码,RING3应用程序调用DeviceIoControl后,可获得共享内存的地址。
4 RING3应用程序和驱动程序的同步
多线程下数据同步的控制是一个程序是否稳定的关键。前文分配了一块共享内存区域,如果驱动程序和RING3应用程序随意对共享内存区域进行读写,可能会导致异常。下面使用经典的同步方法来控制对共享内存区域的读写。基本过程如下:
首先,RING3应用程序用API CreateEvent()创建2个事件,第一个事件A用于表示共享内存是否可以读,第二个事件B用于表示共享内存是否已经读取完毕,并将事件的句柄通过
DeviceIoControl传给驱动,在驱动中通过ObReferenceObjectByHandle()将RING3态句柄转换成RING0中可以使用的事件,即KEVENT。
然后,RING3应用程序自己开一个线程,用API Wait-ForSingleObject()等待事件A,这时该线程是处于等待状态的。接着,当驱动程序截获NtCreateProcessEx()时,先将必要的信息(如父进程名,即将创建的进程名)复制到共享内存中,然后同过调用KeSetEvent()设置事件A,同时马上调用KeWaitForSingleObject()等待事件B,这时驱动也进入等待状态。KeSetEvent()设置事件A后,RING3应用程序中等待事件A的线程被唤醒,开始读取驱动写到共享内存中的信息,并显示如图1所示的询问窗口,询问是否允许该进程创建,当用户做出决定后,调用SetEvent()设置事件B,驱动被唤醒,然后根据用户的决定执行对应的操作(允许,拒绝)。
最后,不断重复这些操作就能实现持续监控进程的创建。
由于共享内存中储存的信息比较复杂,本文定义如下结构简化操作,具体如下:
5 结束语
虽然监控NtCreateProcessEx的意义并不是很大,但是基于本文介绍的技术,进一步修改后可以实现和主流安全软件类似的注册表监控、网络监控以及文件监控等功能。
参考文献
[1]谭文.从汇编语言到Windows内核编程[M].北京:电子工业出版社,2009-11:200-218.
[2]张帆.Windows驱动开发技术详解[M].北京:电子工业出版社,2008-07:218-249.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论