NtCreateUserProcess 初探与玩法2

本文介绍了NtCreateUserProcess在系统调用中的作用,它是如何替代XP时代的多个调用来创建进程的。文章详细解析了CreateProcess与NtCreateUserProcess的关系、调用流程及参数含义,并探讨了如何利用NtCreateUserProcess进行父进程欺骗(PPID)以实现免杀。最后,文章提供了一个简单的NtCreateUserProcess调用示例,强调了转换CreateProcess项目以利用NtCreateUserProcess进行保护的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前置知识

基于一些github的代码项目能更好的理解
首先我们先来了解一下,CreateProcess 和 NtCreateUserprocess。
在以前的 XP 时代,必须执行四个系统调用(NtOpenFile、NtCreateSection、NtCreateProcess(Ex)、NtCreateThread(Ex))才能创建一个新的准备好运行的用户模式进程。启动一个新进程,只需要调用一个系统服务,即NtCreateUserProcess。那CreateProcess又是一个什么角色呢?
CreateProcess此函数主要就是创建新的进程,创建的进程在调用进程的上下文(同样的访问令牌)中运行。
CreateProcess通过内核创建进程的步骤,大致分为六个阶段
● 打开目标映像文件
● 创建内核中的进程对象
● 创建初始线程
● 通知windows子系统 (每个进程在创建/退出的时候都要向windows子系统进程csrss.exe进程发出通知,因为它担负着对windows所有进程的管理的责任,注意,这里发出通知的是CreateProcess的调用者,不是新建出来的进程,因为它还没有开始运行)
● 启动初始线程
● 用户空间的初始化和Dll连接
CreateProcess其实是3环的函数,也就是用户态的 而NtCreateUserprocess函数是位于0环内的
网上有画的很直观的图片

在这里插入图片描述

我们也可以通过断点调试来验证一下触发的流程在这里插入图片描述
在这里插入图片描述

断点的调试的流程与上图区分的是对应的。
那么从 API 到 NtCreateUserProcess 的调用链 就是kernel32.dll!CreateProcessW–>CreateProcessInternalW–>ntdll.dll!NtCreateUserProcess
其中NtCreateProcess()做的事情,主要包括:
● 创建以EPROCESS为核心的相关数据结构,分配并设置EPROCESS数据结构;
● 其他相关的数据结构的设置,如句柄表等等;
● 为目标进程创建初始的地址空间;
● 对EPROCESS进行初始化;
● 将系统Dll映射到目标用户空间,如ntdll.dll等
● 设置目标进程的PEB;
● 将其他需要映射到用户空间,如与”当地语言支持“即NLS有关的数据结构;
● 完成EPROCESS创建,将其挂入进程队列并插入创建者的句柄表
NtCreateUserProcess()是在用户模式下可访问的最后一个函数。为什么去实现它自然是因为藏的深。如果直接调用CreateProcess EDR/AV的话肯定会很容易hook到检查到的这个常见马子的操作的API。
如果调查层比较深,或者函数不是常见的类型的话就不容易察觉了。所以现在更多的都喜欢使用NtCreateUserProcess也就是CreateProcess 调用的最后一层来去实现想要的功能。
那么再来看一下NtCreateUserProcess的原型

NTSTATUS NTAPI
NtCreateUserProcess(
Out PHANDLE ProcessHandle,
Out PHANDLE ThreadHandle,
In ACCESS_MASK ProcessDesiredAccess,
In ACCESS_MASK ThreadDesiredAccess,
In_opt POBJECT_ATTRIBUTES ProcessObjectAttributes,
In_opt POBJECT_ATTRIBUTES ThreadObjectAttributes,
In ULONG ProcessFlags,
In ULONG ThreadFlags,
In PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
Inout PPS_CREATE_INFO CreateInfo,
In PPS_ATTRIBUTE_LIST AttributeList
);
我们还需要再来了解NtCreateUserProcess的参数
ProcessHandle ThreadHandle这两个从名字就能知道了是分别用来存储进程和线程的句柄
ProcessDesiredAccess ThreadDesi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值