windows 进程运行过程
1 创建进程内核对象
进程创建的时候(调用NtCreateProcess时),系统会创建一个被称为内核对象的对象,即进程内核对象,用来管理进程的内核对象,其中进程内核对象维护一个叫做句柄表的结构。进程初始化时为空,当进程的线程调用内核对象函数创建内核对象的时候,内核会为这个对象分配一块内存区域并初始化,然后内核会在句柄表中找到一个空的入口,找到以后初始化句柄表以索引刚刚那片区域。
2 创建进程的虚拟地址空间
进程内核对象被创建以后,系统会为其分配4G(32位)的进程虚拟空间,每个进程只能访问自己虚拟地址空间的内容,其中这个虚拟地址空间被分为四部分,NULL指针去,用户区,64kb禁入区,内核区.
3 初始化进程的虚拟地址空间
进程创建结束以后,windows装载器开始装载PE文件,大致过程如下:
先读入PE文件的DOS头,PE头和Section头。
然后根据PE头里的ImageBase所定义的加载地址是否可用,如果已被其他模块占用,则重新分配一块空间。
根据Section头部的信息,把文件的各个Section映射到分配的空间,并根据各个Section定义的数据来修改所映射的页的属性。
如果文件被加载的地址不是ImageBase定义的地址,则重新修正ImageBase。
根据PE文件的输入表加载所需要的DLL到进程空间。
然后替换IAT表内的数据为实际调用函数的地址。
根据PE头内的数据生成初始化的堆和栈。
4 创建进程的主线程
当进程的初始化完成后, 开始创建进程的主线程, 一个进程至少要有一个主
线程才能运行, 可以说进程只是充当一个容器的作用, 而线程才是执行用户代码
的载体
网友评论