我们可以从概念证明方法来试想,模仿DNS并尝试监测rootkit对网络服务器的连接,当rootkit在网络流量中与网络服务器通信时,试图记录系统的行为。但是回到该理论来看,内存分析理论是基于这样的事实:操作系统使用的数据位置与用于定位内存转储中的数据的位置有所不同。RAM的物理内存并不充分,不能包含所有正在运行的进程。这样Windows内存管理器就需要创建一个虚拟地址空间以模拟一个更大的内存空间,并且微处理器的硬件单元需要描绘出虚拟地址空间到物理地址的路径。总之,内存分析会涉及到地址解析,但是所有这些工作怎样能够形成完整性检查呢?
内存分析
模拟一个更大的内存空间通常是这样实现的:为每个进程创建一个虚拟地址空间,并通过数据结构(主要的数据结构是页目录和页表)将虚拟地址空间解译为物理存储位置。通过使用数据结构,内存管理器创建出所谓的页表,而CPU则将虚拟地址解析为物理地址,每个虚拟地址都与系统空间结构(称为PTE,page table entry)相关联,PTE包含虚拟地址所指代的物理地址。
能够为系统进程提供物理内存的数量被称为工作组,因此每个进程都是从空工作组或者零工作组开始的。随着进程开始不断触及虚拟地址,工作组也随之增加。当windows对系统内存进行管理时,工作组需要计算出其进程所需要的物理内存大小,他们是通过记录的进程行为来计算的:内存需要和页访问率。当内存管理器认为工作组足够大时,它会先清理出旧的作业,即那些很长时间没有被使用的。当这些信息被清出后,并没有被毁灭或者删除,因为它们代表进程所使用过的数据记录。所以windows会将这些页保存在不同的目录中,这些目录包括:
free page list;
zero page list;
modified page list;
standby list
当windows从工作进程组清理出一个内存页时,被清理的是那些进程并没有表示不再需要使用的空间。应该要弄清楚的是,如果一个页被修改,就必须被写入。如果进程向页面写入数据,则该页专属于这个进程,这意味着它不在属于共享内存。Windows中的任何能够共享的内存都可以共享,包括代码和DLL,但不包括数据。在记事本中写入的数据是专属于记事本进程的,其他进程都不能访问该数据。与此同时,要记住的是,进程对于系统而言,代表着一个应用程序的实例。但是由于应用程序需要向虚拟地址空间、操作系统、配置设备驱动程序描绘其代码和数据,以及内核模式中使用的数据也需要被描绘,这就意味着windows内存保护将用户模式地址空间从内核模式中分离了。如果某用户模式线程需要调用系统,则需要使用DLL函数调用功能以过渡到内核模式。那么,如果我们安装了一个rootkit,我们将如何执行完整性检查呢?需要考虑这一点,文字部分是只读的,因此代码不需要修改,应该检查关键系统DLL的代码部分和系统驱动程序(内核模块)在内存和磁盘中相应的PE文件是一样的,同时不要忘记9
7
3
1
2
3
4
8
:
本文来源:不详 作者:佚名