首页
社区
课程
招聘
[原创]通过PsSetLoadImageNotifyRoutine学习模块监控与反模块监控
发表于: 2021-10-23 18:36 22761

[原创]通过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直播授课

最后于 2021-11-30 10:00 被1900编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//