zoukankan      html  css  js  c++  java
  • PsSetCreateProcessNotifyRoutineEx 创建回调函数

    转载自http://blog.csdn.net/yushiqiang1688/article/details/5209597

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

    首先的第一想法,是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等。

        

  • 相关阅读:
    HDU 1160 dp中的路径问题
    zzuli 1907: 小火山的宝藏收益
    POJ 3414 dfs广搜直接应用
    http://acm.zzuli.edu.cn/zzuliacm/problem.php?cid=1158&pid=5 二分函数的间接应用
    LightOJ 1067 组合数取模
    九段美到极致的句子
    质数和分解
    codevs 1080 线段树练习
    codevs 2806 红与黑
    codevs 2152 滑雪
  • 原文地址:https://www.cnblogs.com/shercy/p/6699105.html
Copyright © 2011-2022 走看看