转windows的文件装入

转windows的文件装入

ID:30471160

大小:91.81 KB

页数:15页

时间:2018-12-30

转windows的文件装入_第1页
转windows的文件装入_第2页
转windows的文件装入_第3页
转windows的文件装入_第4页
转windows的文件装入_第5页
资源描述:

《转windows的文件装入》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、转windows的文件装入兼容内核十:Windows的进程创建和映像装入转自:融windows和linux于一体。niubiWindows的进程创建和映像装入的过程,"MicrosoftWindowsInternals4e"一书的第六章中有颇为详细的说明。本文就以此为依据,夹译、夹叙、夹议地作一介绍。书中说,创建进程的过程分成六个阶段,发生于操作系统的三个部分中,那就是:Windows客户端即某个应用进程的包括Kernel32.dll在内的动态连接库,Windows的"执行体"、即内核确切地说是内核的上层,以及Wind

2、ows子系统的服务进程Csrss中。这六个阶段是:1.打开目标映像文件。2.创建Windows的"执行体进程对象",也就是内核中的"进程控制块"数据结构。3.创建该进程的初始第一个线程,包括其堆栈、上下文、以及"执行体线程对象",即内核中的"线程控制块"数据结构。4.将新建进程通知Windows子系统。5.启动初始线程地运行除非因为参数中的CREATE_SUSPENDED标志位为1而一创建便被挂起。6.在新进程和线程的上下文中完成用户空间的初始化,包括装入所需的DLL,然后开始目标程序的运行。下面分阶段叙述。第一阶段:

3、打开目标映像文件在Win32位API中,创建进程是由CreateProcess完成的。这实际上是个宏定义,根据不同的情况定义成CreateProcessA或CreateProcessW之一,这两个函数都在kernel32.dll中可以用工具depends观察。两个函数的区别仅在于字符串的表达,前者采用ASCII字符,而后者采用"宽字符"、即Unicode。实际上Windows的内部都采用宽字符,所以前者只是把字符串转换成宽字符格式,然后调用后者。可以在Windows上运行的可执行软件有好几类,处理的方法自然就不一样:l

4、Windows的32位.exe映像,直接运行。lWindows的16位.exe映像,启动ntvdm.exe,以原有命令行作为参数。lDOS的.exe、.com、或.pif映像,启动ntvdm.exe,以原有命令行作为参数。lDOS的.bat或.cmd批命令文件脚本,启动cmd.exe,以原有命令行作为参数。lPOSIX可执行映像,启动posix.exe,以原有命令行作为参数。lOS/2可执行映像,启动os2.exe,以原有命令行作为参数。这里面最重要的当然是32位的.exe映像,而最后两类现在已经很少见了。从对于除32

5、位.exe以外的各种映像的处理,读者不妨对比一下Wine对.exe映像的处理,看看这里有着什么样的相似性。当然,我们在这里只关心32位.exe映像。对于这一类映像,CreateProcess首先打开映像文件,再为其分配创建一个"Section"、即内存区间。创建内存区间的目的当然是要把映像文件影射到这个区间,不过此时还不忙着映射,还要看看。看什么呢?首先是看已经打开的目标文件是否一个合格的.exe映像万一是DLL映像?。还要看的事就有点出乎读者意外了,看的是在"注册表"中的这个路径:HKLMSOFTWAREMicr

6、osoftWindowsNTCurrentVersionImageFileExecutionOptions用depends可以看到,ntdll.dll中有个函数LdrQueryImageFileExecutionOptions,就是专门干这个事的。如果上述路径下有以目标映像文件的文件名和扩展名为"键"的表项,例如"image.exe",而表项中又有名为"Debugger"的值,那么这个值一个字符串就替换了原来的目标文件名,变成新的目标映像名,并重新执行上述的第一阶段操作。这样做的目的当然是为调试程序提供方便,但是

7、我们不妨设想:如果黑客或某个木马程序设法在注册表中加上了一个表项?这时候用户以为是启动了程序A,而实际启动的却是B!。第二阶段:创建内核中的进程对象我们知道,Linux上的每个进程线程都有一个"进程控制块"、即task_struct数据结构,与具体进程/线程有关的绝大部分信息都集中存储在这个数据结构中。而Windows则有所不同。首先,Windows的进程和线程各有不同的"对象"、即数据结构,从概念上把线程和进程分离开来。线程是具体的执行上下文,是CPU调度的单位和目标,而进程只是若干共享地址空间和特性如调度优先级的线

8、程的集合。于是,进程有进程的数据结构,线程有线程的数据结构。这就好像是对一组task_struct数据结构"提取公因子"所形成的结果,这个举措是很好理解的。进一步,Windows又把本可集中存储的的进程数据结构也拆分成好几个对象,有的在内核中,有的则在用户空间。内核中与进程有关的对象有:lEPROCESS。即struct_EPRO

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

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

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