createprocess执行过程(精简)

createprocess执行过程(精简)

ID:34415746

大小:33.50 KB

页数:5页

时间:2019-03-05

createprocess执行过程(精简)_第1页
createprocess执行过程(精简)_第2页
createprocess执行过程(精简)_第3页
createprocess执行过程(精简)_第4页
createprocess执行过程(精简)_第5页
资源描述:

《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的进程和线程各有不同的“对象”、即数据结构,从概念上

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。