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