Win32进程的创建过程

什么是进程

运行在计算机上的程序,为当前的程序提供资源,举一个例子,进程相当于一个房子,房子里的东西由进程提供,房子里走动的人就是线程,进程仅仅提供资源,关于资源怎么用与进程无关。

进程内存空间的地址划分

分区 x86 32位Windows
空指针赋值区 0x00000000~0x0000FFFF
用户模式区 0x00010000~0x7FFEFFFF
64KB禁入区 0x7FFF0000~0x7FFFFFFF
内核 0x80000000~0xFFFFFFFF

虽然每个进程都有属于自己的4GB虚拟空间,但是只有前面的低2G是属于进程自己的,后面的高2G是所有进程公用的,在OD里我们附加一个进程,然后Alt+m就可以看一下它的内存分配情况了。
在这里插入图片描述

每一个进程就像一辆汽车,由许多个零件组成,这里的零件就是模块,我们可以按Alt+e查看这些组成进程的模块:
在这里插入图片描述

进程的创建

当一个exe文件躺在我们的硬盘里的时候,它还不是一个进程,这里强调两点:

1、每个进程都不是自己创建的,是由别的进程创建的。CreateProcess()

2、进程的创建过程
	2.1映射EXE文件
	2.2创建内核对象eprocess
	2.3映射系统dll(ntdll.dll)
	2.4创建线程内核对象ethread
	2.5系统启动线程
		2.5.1映射DLL(ntdll.dll)
		2.5.2线程开始执行

每一个进程其实是由这个explorer.exe这个进程调用CreateProcess()函数来创建的:
在这里插入图片描述
那么这个CreateProcess()函数是如何把一个exe变成进程的呢?这就是上面的第二条:

2、进程的创建过程
	2.1  映射EXE文件
	2.2  创建内核对象eprocess
	2.3  映射系统dll(ntdll.dll)
	2.4  创建线程内核对象ethread
	2.5  系统启动线程
		2.5.1  映射DLL(ntdll.dll)
		2.5.2  线程开始执行

我们用图来表示的的创建过程,
在这里插入图片描述
这里还没有跑完,还差最后一步,启动线程,在启动线程之前,还需要映射dll,一个PE文件一般是由一个exe程序加许多个dll组成的:

这是笔者这里一个软件需要的dll
在这里插入图片描述
每个dll启动时也会带起别的dll,有一定的关联性,这就是为什么我们在OD里会看到那么多的dll,其实很多不是程序自带需的dll,而是需要的那个dll带起来的另一个dll,到这里程序才跑起来:
在这里插入图片描述

发布了69 篇原创文章 · 获赞 81 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43573676/article/details/105413386