windows内核情景分析学习笔记10

来源:互联网 发布:淘宝客服每周工作总结 编辑:程序博客网 时间:2024/05/16 12:00

 1、共享映射区

对于用户空间的映射,一个物理页面通常只被映射到一个进程用户空间。

对于系统空间的映射,是由所有进程共享的。

但是,一个物理页面也可以被映射到多个进程的用户空间,映射到的虚拟地址可以不尽相同。由这样的物理页面映射在多个进程虚存空间形成的连续区间,称为"共享映射区"。

 

2、共享映射区存在的原因

①系统使用共享映射区载入并运行.exe和DLL文件。这大量的节约了页交换文件空间及程序启动的时间

②用户可使用共享映射区来访问磁盘上的数据文件。使我们可以避免直接对文件进行IO操作和对文件内容进行缓存

③通过使用共享映射区,可以在一台机器的不同进程间共享数据,效率很高。

 

3、创建共享映射区

若要创建共享影射区,需执行如下三个步骤:

①创建共享映射区对象

②分配虚存空间

③建立映射

 

3.1、创建共享映射区对象

首先,创建共享映射区对象使用NtCreateSection

最后一个参数FileHandle,如要创建文件映射区,则应该首先打开文件,并获取文件句柄填入;如填入NULL,则创建共享映射区。

其实现为:

  

显然,其函数主体为MmCreateSection

其实现为:

这个函数一开始进行页面保护模式的合理性检查,检查后,就根据目标文件的性质不同进行不同的处理:

①如果是一个可执行文件,就通过MmCreateImageSection处理。因可执行文件有着特殊的结构。所以当做特例处理。

②如果是普通数据文件,由MmCreateDataFileSection创建文件映射区

③如果没有给定目标文件,那么就是创建“共享内存区”。(其实是以页面交换文件为目标文件)

 

以MmCreateDataFileSection为例,分析一下创建文件映射区的过程。

此函数中做了如下几件事情:

①创建映射区对象,由ObCreateObject完成

②获取数据文件对象,由ObReferenceObjectByHandle完成,并获取到数据文件的FILE_OBJECT结构指针

③构造一个映射段MM_SECTION_SEGMENT数据结构(ExAllocatePoolWithTag完成),让映射区对象与数据文件对象中的相关指针指向这个映射段。

④使映射区对象中的FileObject字段指向数据文件对象。

关键代码如下:

 

3.2 映射区与映射段的区别

一个映射区由一个或多个映射段组成。对于映射的是可执行文件,其文件本身就分为多个段,例如代码段、数据段等,所以映射区也得要分成若干个映射段;对于映射的是数据文件,则只有一个映射段。

 

映射区对象结构

 

映射段对象结构

 

 

3.3、分配虚存空间并建立映射

这时,映射区对象建立完毕,而并未实际建立映射。实际的映射是通过系统调用NtMapViewOfSection完成的。

这个系统调用的作用是,将一个映射区对象的一部分或全部映射到某个进程的用户空间。

对于数据文件,其最终调用的是MmMapViewOfSegment(因数据文件只有一个段)。

此函数很简单,就是申请一块虚存空间,并将对应的MEMORY_AREA结构的分量设置成指向映射区就完事了。

 

原创粉丝点击