PsSetCreateProcessNotifyRoutine妙用

转载 2013年12月02日 12:11:21

最近要做一个进程监控的程序,功能很简单,就是创建和退出进程的时候,能触发我们的事件。

首先的第一想法,是Hook ZwCreateProcess,结果调试的时候发现,很多创建进程的动作,并没有通过这个API执行,所以自然就是没办法监控进程的创建,于是回到本质,从创建进程的动作过程来分析,创建新的进程,其大致要经历以下步骤:

(1)打开可执行文件,以FILE_EXECUTE权限打开;

(2)将可执行文件加载到内存空间;

(3)进程的活动结构将被创建,如(EPROCESS,KPROCESS和PEB结构);

(4)为新创建的进程分配地址空间;

(5)为进程的主线程创建线程活动结构,如(ETHREAD,KTHREAD和TEB结构);

(6)主线程的栈将会被分配;

(7)进程的主线程的上下文将被创建;

(8)通知windows子系统;

以上总结下来,无非有下面几种办法获取进程创建的消息:

(1)HOOK ZeCreateSection,创建虚拟内存块的时候,根据传入的文件句柄,获取句柄对应的文件名是否为exe可执行文件;

(2)Hook NtReadVirtualMemory,为新创建的进程分配地址空间等操作时,需要读取进程空间,这样捕获,就能够获取进程的创建动作;

(3)通过windows提供的回调函数,注册回调事件;

方法对比:

(1)该方法能够准确的获取进程创建的操作,但是由于此时进程并没有创建完毕,一些进程的基本结构还没有创建,所以进程ID等信息无法获取;

(2)该方法能够获取进程的创建操作,但不准确。因为除了进程的创建会调用此操作外,人为的一些操作,例如某外部应用程序想读取另一个进程的内存空间,也会调用这个函数,这时候也会有事件响应,因此结果不准确;

(3)第三种方法更直观和简单。因为采用的回调事件,并不直接HOOK API,因此更稳定。

重点分析第三种回调方法。

注册回调事件,是通过PsSetCreateProcessNotifyRoutine来实现的,其函数原型如下:

  NTSTATUS   PsSetCreateProcessNotifyRoutine(  
          IN   PCREATE_PROCESS_NOTIFY_ROUTINE     NotifyRoutine,  
          IN   BOOLEAN     Remove   
  );

NotifyRoutine就是注册的回调函数,当有进程创建的时候,就会调用这个NotifyRoutine对应的函数,其函数定义原型如下:

VOID   (*PCREATE_PROCESS_NOTIFY_ROUTINE)   (  
          IN   HANDLE      ParentId,  
          IN   HANDLE      ProcessId,  
          IN   BOOLEAN     Create   
);  
其中,ParentId是父进程ID,ProcessId为子进程ID,而Create表示是创建进程还是结束进程,其中True表示创建进程,False表示结束进程。

通过这个函数,我们就能够完成进程创建和退出的监控,首先调用PsSetCreateProcessNotifyRoutine注册进程监控回调函数,然后在回调函数里面,判断Create参数,分别处理进程创建和退出操作。

 

其它类似的函数还有PsSetLoadImageNotifyRoutine,PsSetCreateThreadNotifyRoutine等函数,通过函数名,能够比较清晰的明白函数的意义,在此就不细讲了。

相关文章推荐

labview结构事件妙用

  • 2012年03月09日 17:15
  • 326KB
  • 下载

小标签妙用

  • 2013年06月05日 14:53
  • 155KB
  • 下载

GOLANG简单类型定义,在协议解析的妙用

在协议解析中,经常需要用到转换不同的含义,比如声音的采样率,在FLV中定义和AAC中定义是不同的。在FLV中只有4中采样率5512, 11025, 22050, 44100。而在AAC中有16种采样率...

sql语句妙用指导 sql的使用

  • 2011年08月02日 11:32
  • 427KB
  • 下载

网络基本功(十七):细说tcpdump的妙用(上)

转载自:https://community.emc.com/message/854940#854940 转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com...

For命令在Windows中的妙用

  • 2010年06月19日 09:23
  • 41KB
  • 下载

Dreamweaver标签选择器的妙用

  • 2015年02月14日 12:59
  • 181KB
  • 下载

Android学习之Service命令的妙用

Android系统不光在host上为我们提供了一些好用的命令, 同时device也有一些隐藏着的命令, 通常它是被系统调用,但是由于权限设置的原因, 普通的进程也能通过命令行去使用它们. 比如,我之...

js的另一妙用

  • 2011年11月17日 22:28
  • 6.52MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PsSetCreateProcessNotifyRoutine妙用
举报原因:
原因补充:

(最多只允许输入30个字)