科锐第三阶段项目-CreateProcess分析之NtCreateProcessEx() 的分析
函数原型:
NTSTATUS
NtCreateProcessEx(
__out PHANDLE ProcessHandle,
__in ACCESS_MASK DesiredAccess,
__in_opt POBJECT_ATTRIBUTES ObjectAttributes,
__in HANDLE ParentProcess,
__in ULONG Flags,
__in_opt HANDLE SectionHandle,
__in_opt HANDLE DebugPort,
__in_opt HANDLE ExceptionPort,
__in ULONG JobMemberLevel
);
函数主要功能:
函数大致操作分三部分:
1. 创建并初始化进程EPROCESS对象,
2. 创建并初始化进程地址空间,
3. 初始化内核进程块(KPROCESS)
4. 创建进程ID,创建PEB等操作。
函数参数:
ProcessHandle,输出参数,如果创建成功,则它返回所创建的进程的句柄。
DesiredAccess, 新进程的访问权限。
ObjectAttributes,可选参数,指定了新进程的对象属性。
ParentProcess:新进程的父进程句柄。如果这个参数没有设定,即新进程没有父进程,新进程使用系统地址空间创建。
Flags :进程创建的标志。
SectionHandle :内存区域映射句柄,用来创建进程的地址空间,如果这个参数没有设定,新进程的地址空间是一个简单的克隆父进程的地址空间。
DebugPort : 一个端口对象的句柄,被用于进程的调试端口。
ExceptionPort :一个端口对象的句柄,被用于进程的异常端口。
JobMemberLevel :新进程的在 jobset 中的等级。
函数具体分析:
NtCreateProcessEx函数的代码判断调用时状态是否为内核模式,内核模式不需要检查参数,而非内核模式要检查ProcessHandle参数代表的句柄是否可写,然后把真正的创建工作交给PspCreateProcess函数。需要注意的是,在反汇编中检查句柄是否可写的代码,会让人比较疑惑,就是一个相互赋值的语句,看似无用,其实是为了检查其地址是否可写,不是的话触发异常,trycase块捕获异常。具体看代码:
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
