-
-
[原创]通过PsSetLoadImageNotifyRoutine学习模块监控与反模块监控
-
发表于: 2021-10-23 18:36 22761
-
本文要实现的是对模块加载的监控,并卸载掉目标模块。实验是在WIN 7 X86系统上进行,需要使用的文件是InjectDll.dll和TestDriver.sys。这两个文件的内容非常简单,InjectDll.dll在加载进进程中以后只会弹出加载的对话框,而TestDriver.sys只是在驱动加载和卸载的时候打印字符提醒。
在内核中可以通过PsSetLoadImageNotifyRoutine来设置模块监控,监控系统中各个应用程序加载的DLL以及系统加载的驱动。在函数在中文档的定义如下
其中NotifyRoutine是一个LOAD_IMAGE_NOTIFY_ROUTINE的函数指针,该函数在文档中的定义如下
IMAGE_INFO在文档中的定义如下
最关键的两个是ImageBase和ImageSize,分别代表了模块的基地址和模块的大小。
而要卸载模块监控,则需要使用PsRemoveLoadImageNotifyRoutine,该函数在文档中的定义如下,参数含义和设置模块监控一样
驱动的卸载和DLL的卸载是不一样的。
对于驱动的卸载,只需要找到驱动入口点,并且直接返回STATUS_ACCESS_DENIED(0xC0000022)错误码就好。这样,已经加载的驱动就会在执行的时候出错,导致驱动启动失败
对于DLL的卸载则需要使用未到出函数MmUnmapViewOfSection用来进行卸载。当由于加载进程模块的时候,系统会有一个内部锁,为了避免死锁。要通过创建线程进程延迟等待,等待DLL加载完成以后在调用函数进行卸载
具体代码如下
对于DLL加载来说,当没有开起监控程序卸载的时候,在加载DLL文件以后可以在监控软件中查找到对应的DLL
而当开起监控完成DLL卸载以后,就没办法找到相应的DLL了
对于驱动来说,当没有开起监控的时候,可以正常的加载与卸载
而开起监控以后,驱动的加载就会被拦截
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [原创]CVE-2022-21882提权漏洞学习笔记 16409
- [原创]CVE-2021-1732提权漏洞学习笔记 19515
- [原创]CVE-2014-1767提权漏洞学习笔记 15203
- [原创]CVE-2018-8453提权漏洞学习笔记 18542
- [原创]CVE-2020-1054提权漏洞学习笔记 13551