欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Win32进程的创建过程

程序员文章站 2024-03-01 13:25:52
...

什么是进程

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

进程内存空间的地址划分

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

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

每一个进程就像一辆汽车,由许多个零件组成,这里的零件就是模块,我们可以按Alt+e查看这些组成进程的模块:
Win32进程的创建过程

进程的创建

当一个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()函数来创建的:
Win32进程的创建过程
那么这个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  线程开始执行

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

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