欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

科锐第三阶段项目-CreateProcess分析之NtCreateProcessEx() 的分析

科锐第三阶段项目-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。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功