欢迎来到天天文库
浏览记录
ID:34415746
大小:33.50 KB
页数:5页
时间:2019-03-05
《createprocess执行过程(精简)》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、创建进程的过程分成六个阶段,发生于操作系统的三个部分中。三个部分是:1,Windows客户端即某个应用进程的包括Kernel32.dll在内的动态连接库2,Windows的“执行体”、即内核(确切地说是内核的上层)3,以及Windows子系统的服务进程Csrss中。六个阶段是:1.打开目标映像文件。2.创建Windows的“执行体进程对象”,也就是内核中的“进程控制块”数据结构。3.创建该进程的初始(第一个)线程,包括其堆栈、上下文、以及“执行体线程对象”,即内核中的“线程控制块”数据结构。4.将新建进程通知Windows子系统。5.启动初
2、始线程地运行(除非因为参数中的CREATE_SUSPENDED标志位为1而一创建便被挂起)。6.在新进程和线程的上下文中完成用户空间的初始化,包括装入所需的DLL,然后开始目标程序的运行。BOOLWINAPICreateProcess(__inLPCTSTRlpApplicationName,__in_outLPTSTRlpCommandLine,__inLPSECURITY_ATTRIBUTESlpProcessAttributes,__inLPSECURITY_ATTRIBUTESlpThreadAttributes,__inBOOLb
3、InheritHandles,__inDWORDdwCreationFlags,__inLPVOIDlpEnvironment,__inLPCTSTRlpCurrentDirectory,__inLPSTARTUPINFOlpStartupInfo,__outLPPROCESS_INFORMATIONlpProcessInformation);在打开可执行映像之前执行一下步骤:看书上。第一阶段:打开目标映像文件在Win32位API中,创建进程是由CreateProcess()完成的。这实际上是个宏定义,根据不同的情况定义成CreatePro
4、cessA()或CreateProcessW()之一,这两个函数都在kernel32.dll中(可以用工具depends观察)。两个函数的区别仅在于字符串的表达,前者采用ASCII字符,而后者采用“宽字符”、即Unicode。实际上Windows的内部都采用宽字符,所以前者只是把字符串转换成宽字符格式,然后调用后者。可以在Windows上运行的可执行软件有好几类,处理的方法自然就不一样:●Windows的32位.exe映像,直接运行。●Windows的16位.exe映像,启动ntvdm.exe,以原有命令行作为参数。●DOS的.exe、.c
5、om、或.pif映像,启动ntvdm.exe,以原有命令行作为参数。●DOS的.bat或.cmd批命令文件(脚本),启动cmd.exe,以原有命令行作为参数。●POSIX可执行映像,启动posix.exe,以原有命令行作为参数。●OS/2可执行映像,启动os2.exe,以原有命令行作为参数。这里面最重要的当然是32位的.exe映像,而最后两类现在已经很少见了。从对于除32位.exe以外的各种映像的处理,读者不妨对比一下Wine对.exe映像的处理,看看这里有着什么样的相似性。对于32位.exe映像,CreateProcess()首先打开映像
6、文件,再为其(分配)创建一个“Section”、即内存区间。创建内存区间的目的当然是要把映像文件影射到这个区间,不过此时还不忙着映射,还要看看。看什么呢?首先是看已经打开的目标文件是否一个合格的.exe映像(万一是DLL映像?)。还要看的事就有点出乎读者意外了,看的是在“注册表”中的这个路径:HKLMSOFTWAREMicrosoftWindowsNTCurrentVersionImageFileExecutionOptions用depends可以看到,ntdll.dll中有个函数LdrQueryImageFileExecutio
7、nOptions(),就是专门干这个事的。如果上述路径下有以目标映像文件的文件名和扩展名为“键”的表项,例如“image.exe”,而表项中又有名为“Debugger”的值,那么这个值(一个字符串)就替换了原来的目标文件名,变成新的目标映像名,并重新执行上述的第一阶段操作。这样做的目的当然是为调试程序提供方便,但是我们不妨设想:如果黑客或某个木马程序设法在注册表中加上了一个表项?这时候用户以为是启动了程序A,而实际启动的却是B!。第二阶段:创建内核中的进程对象我们知道,Linux上的每个进程(线程)都有一个“进程控制块”、即task_str
8、uct数据结构,与具体进程/线程有关的绝大部分信息都集中存储在这个数据结构中。而Windows则有所不同。首先,Windows的进程和线程各有不同的“对象”、即数据结构,从概念上
此文档下载收益归作者所有