进程的创建过程

发布时间 2023-03-24 12:01:32作者: Hanpto

创建进程共有六个阶段:

I:打开目标映像文件
Ⅱ:创建Windows的(内核)管理层进程对象,即“进程控制块”EPROCESS数据结构及相应的句柄
Ⅲ:创建该进程的初始(第一个)线程,包括其堆栈、上下文,以及“管理层线程对象”,即“线程控制块”ETHREAD数据结构及相应的句柄
Ⅳ:将新创建的进程通知Windows子系统csrss.exe
Ⅴ:启动初始线程运行(除非因为参数中的CREATE_SUSPENDED标志位为1,因为一创建便被挂起)
Ⅵ:在新创进程和线程的上下文中完成用户空间的初始化,包括装入和连接所需的DLL,然后开始目标程序的运行

Ⅱ:创建内核对象的进程对象
NtCreateProcessExs()函数
1.分配并设置EPROCESS数据结构
2.其他相关的数据结构的设置,例如句柄表
3.为目标进程创建初始的地址空间
4.对目标进程的“内核进程块”KPROCESS进行初始化,这是EPROCESS的一部分
5.将目标进程的可执行映像(.exe文件)映射到其自身的用户空间
6.将系统DLL的映像(.dll文件)映射到目标进程的用户空间 //.exe和.dll文件都叫模块(Module),其中.exe也叫实例(Instance)
7.设置好目标进程的“进程环境块”PEB //Process Environment Block
8.映射其他需要映射到用户空间的数据结构,例如与“当地语言支持”即NLS有关的数据结构
9.完成EPROCESS创建,将其挂入进程队列并插入创建者的句柄表

进程内核对象结构:
image
object_header 0x18/0x30
object_body: Eprocess

Ⅲ:创建初始线程
//进程实质上是一个容器,干活的是线程
NtCreateThread()函数
1.创建和设置目标线程的ETHREAD数据结构
2.在目标进程的用户空间创建并设置目标线程的TEB(Thread Environment Block)
3.将目标线程在用户空间的起始地址设置成指向kernel32.dll中的BaseProcessStartThunk()
或BaseThreadStartupThunk().前者用于进程中的第一个线程,后者用于随后的线程。
用户程序在调用 NtCreateThread()时也要提供一个用户级的起始函数(地址),
BaseProcessStartThunk()和BaseThreadStartupThunk()在完成初始化时会调用这个起始函数
4.设置目标线程的KTHREAD数据结构并为其分配堆栈。特别地,将其上下文中的断点(返回点)
设置成指向内核中的一段程序KiThreadStartup,使得该线程一旦被调度运行时就从这里开始执行
5.如果登记了每当创建线程时就应加以调用的“通知”函数,就调用这些函数