监视并控制进程的创建

       我们都知道,进程的创建会涉及比较多的行为,从开始的创建进程空间,创建句柄表等内核功能,之后映射可执行文件、主线程的运行,如果我们可以在其中的一个位置做手脚,进程的创建应该就会失败。这里我们使用的是系统回调函数的方法。

  • 基本函数。
// 可以通知我们进程的创建
NTSTATUS
  PsSetCreateProcessNotifyRoutine(
    IN PCREATE_PROCESS_NOTIFY_ROUTINE  NotifyRoutine,
    IN BOOLEAN  Remove
    );
    // 函数声明
    VOID
(*PCREATE_PROCESS_NOTIFY_ROUTINE) (
    IN HANDLE  ParentId,
    IN HANDLE  ProcessId,
    IN BOOLEAN  Create
    );

// 创建进程之前通知我们,可以阻止进程创建
    NTSTATUS
  PsSetCreateProcessNotifyRoutineEx(
    IN PCREATE_PROCESS_NOTIFY_ROUTINE_EX  NotifyRoutine,
    IN BOOLEAN  Remove
    );
//回调函数
VOID
  CreateProcessNotifyEx(
    __inout PEPROCESS  Process,            //要创建的进程的进程体
    __in HANDLE  ProcessId,                //进程的ID
    __in_opt PPS_CREATE_NOTIFY_INFO  CreateInfo  //新进程的信息
    );
typedef struct _PS_CREATE_NOTIFY_INFO {
  __in SIZE_T  Size;      //_PS_CREATE_NOTIFY_INFO结构体的大小
  union {
    __in ULONG  Flags;
    struct {
      __in ULONG  FileOpenNameAvailable : 1;
      __in ULONG  Reserved : 31;
    };
  };
  __in HANDLE  ParentProcessId;           //新进程的父进程ID
  __in CLIENT_ID  CreatingThreadId;        //结构体中包含进程ID和线程ID
  __inout struct _FILE_OBJECT  *FileObject;   //新进程的exe文件的文件对象
  __in PCUNICODE_STRING  ImageFileName;       //exe文件名称
  __in_opt PCUNICODE_STRING  CommandLine;
  __inout NTSTATUS  CreationStatus;           //进程创建的状态,设置这个值为STATUS_UNSUCCESSFUL即可组织进程创建
} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;

       显然,要想监视的同时控制进程的创建过程,需要使用后面的函数。由于实现进程监控的过程的时候,PEB 没有建立,因此需要通过文件对象来得到进程完整路径。参考以下链接:
http://www.cnblogs.com/lanrenxinxin/p/4388935.html

typedef struct _PS_CREATE_NOTIFY_INFO {
  SIZE_T              Size;
  union {
    ULONG  Flags;
    struct {
      ULONG FileOpenNameAvailable  :1;
      ULONG Reserved  :31;
    };
  };
  HANDLE              ParentProcessId;
  CLIENT_ID           CreatingThreadId;
  struct _FILE_OBJECT  *FileObject;
  PCUNICODE_STRING    ImageFileName;  // 该结构也可以获得文件完整路径
  PCUNICODE_STRING    CommandLine;
  NTSTATUS            CreationStatus;
} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;

       关于代码中使用的同步方式:
http://www.cnblogs.com/gussing/archive/2012/12/31/2840602.html
       Resource 相当于内核态的读写锁,用于同步访问全局的事件对象。mutext用于同步对于白名单的操作

  • 代码概述:首先应该加载驱动程序。之后在Ring3 程序运行之后创建3个自动转变状态的事件并通知给Ring0 层,Ring0 由此创建“创建进程的回调函数”,并将Ring3 事件转化为Ring0 事件对象。其中三个事件的作用分别是:通知Ring3 有进程创建事件发生,通知Ring0 允许创建进程,通知Ring0拒绝创建进程。在Ring0收到创建进程通知后,将进程信息保存到全局变量中,之后通知给Ring3 有创建进程事件,然后等待另外两个事件,并根据返回值做相应的动作。Ring3 收到通知后,给Ring0 发送控制码,以获得进程信息,之后产生新窗口向用户询问是否允许创建进程,做出选择后再通过IO 控制码通知Ring0程序。另外,程序中有白名单功能。用户可以选择通过白名单设置免过滤的进程,避免反复操作。
  • 代码下载:
    http://download.csdn.net/detail/qq_18218335/9915869
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值