admin管理员组

文章数量:1597897

2024年3月11日发(作者:)

Finding File Contents in Memory

The NT Insider, Vol 11, Issue 1, Jan-Feb 2004 | Published: 12-Mar-04| Modified:

19-Mar-04

声明:原文来自,所有权利归原作者所有,翻译并贴在这里的目的只为

学习和交流,除了商用你可以随意地使用这篇译文。但请不要删除声明。

——by jununfly

版本:20090120

在调试课上,我总是邀请学生带来crash dumps让我们分析。这有助于我们真实地掌

握分析崩溃的技能。近来,一学生带来了当访问文件时他的过滤驱动崩溃的一个dump。

他问”我怎么知道正被访问的是哪个文件?” 一旦我们向下跟踪,学生问"我如何看见文件

的内容 – 你确定它在内存里?"

如果你需要向下跟踪一个内存中的文件,你可以像本文介绍的一样做。

在深入这个机制钱,理解用于跟踪的数据结构的基本关系很有用。关键的数据结构是:

FILE_OBJECT – 这是Windows用于跟踪一个文件的一个单一的打开实例的对象。因

此,如果你有一个文件的多个打开实例,你就有多个文件对象。

SECTION_OBJECT_POINTERS – 这是把指定的FILE_OBJECT连接到虚拟内存控

制结构(当文件内容在内存中时它保持对文件内容的跟踪 – 并允许Windows在那些内容

不在内存中时取得它们.)上的数据结构。

CONTROL_AREA – 内存管理器用这个数据结构来跟踪一个给定部分的状态信息。

SHARED_CACHE_MAP – 缓存管理器用这个数据结构来跟踪文件中单独的被缓存

的区域(region)的状态。一个单一文件中可能有许多这样的被缓存的区域。

VACB – 缓存管理器用这个数据结构来描述在缓存中正被使用的虚拟地址,来访问一

个被缓存的区域中的数据。

在当前版本的Windows提供的公有类型信息中所有这些数据结构都可用 – 因此要

找到缓存所用的虚拟地址我们已经万事俱备。有了这些虚拟地址,找到真实的文件数据就

小菜一碟。

一般,我们使用IRP中的值或使用一个句柄并查找对象句柄表中的值来找到

FILE_OBJECT。因此,我们可以使用!irp命令(显示一个IRP和它的栈位置)或者用!handle

命令.不论哪个,我们要用作为结果的信息。这里,我选择用句柄,且以"Microsoft Word"

进程为例。为了达到这个目的我用了命令"!handle 0 3 86304020".第一个参数指示我想

要看到进程的所有的句柄(我不确定我要的是哪个句柄).第二个参数是标记域,它指示我想

要每个句柄的信息(默认值是1,表示仅提供根本信息.额外的标记意味着我展示各种对象的

名).第三个参数是进程的地址(以便句柄命令使用正确的句柄表).通过这我能浏览对象句柄

表来找出这个文件的句柄:

0cf0: Object: 85df1028 GrantedAccess: 0012019f

本文标签: 文件句柄数据结构