-
-
[原创]通过PsSetCreateProcessNotifyRoutineEx和PsSetCreateThreadNotifyRoutine实现进程与线程监控
-
发表于:
2021-9-12 20:32
19007
-
[原创]通过PsSetCreateProcessNotifyRoutineEx和PsSetCreateThreadNotifyRoutine实现进程与线程监控
PsSetCreateProcessNotifyRoutineEx是Windows提供得一个可以通过设置回调函数实现进程监控的内核API。其在文档的定义如下:
参数NotifyRoutine指向了CREATE_PROCESS_NOTIFY_ROUTINE_EX的指针,来指定我们需要执行的回调函数。
参数Remove来指定是把回调函数加入回调列表中,为False则把例程添加进列表中,为True则把例程从列表中删除。当函数返回值为STATUS_SUCCESS时,则函数调用成功。
PCREATE_PROCESS_NOTIFY_EOUTINE_EX的回调函数定义如下:
参数Process是指向EPROCESS的指针。
参数ProcessId则是进程ID。
参数CreateInfo是一个指向PS_CREATE_NOTIFY_INFO的指针,当它为NULL时表明进程退出,不为NULL时表明进程创建,里面存储着要创建的进程信息。
PS_CREATE_NOTIFY_INFO的具体定义如下所示:
参数ImageFileName说明了要创建的进程的名字。
参数CreationStatus说明了进程创建操作返回的NTSTATUS值。我们可以通过把这个值修改为STATUS_UNSUCCESSFUL来阻止进程的创建。
根据上述内容我们可以写出相应的代码如下:
其中的CreateProcessNotifyEx的实现如下:
这里我将新创建的进程打印出来且拦截名为demo.exe的进程。
在卸载驱动时,必须要将例程从列表中删除,否则新创建或者退出的进程会因为找不到回调函数而蓝屏。所以卸载驱动的代码如下:
这里还必须说明的是,调用PsSetCreateProcessNotifyRoutineEx函数时,需要对强制完整性签名进行破解。破解的方法也很简单,只需要把驱动对象中的DriverSection中的Flags包含0x20就行,代码如下:
其中的KLDR_DATA_TABLE_ENTRY的定义如下:
代码的最终效果如下所示:
相比于进程监控,设置线程监控的API相对简单,定义如下:
参数NotifyRoutine指向了要设置的例程,而PCREATE_THREAD_NOTIFY_ROUTINE的定义如下:
参数ProcessId和ThreadId分别代表了进程与线程ID。
参数Create为True和False分别代表了线程的创建和销毁。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-10-17 17:12
被1900编辑
,原因: