阻止程序读取分配的 RAM 之外的内容

阻止程序读取分配的 RAM 之外的内容

我想知道我是否可以阻止程序 A 读取我的整个内存,因为它不需要监视程序 B 正在做什么。

我也是使用 Windows 8.1 64 位。

答案1

在 Windows 中运行的程序无法直接寻址 RAM。它们访问虚拟地址。要访问 RAM,您需要借助为此目的编写的内核模式驱动程序。(这就是 Mark Russinovich 的一些“sysinternals 工具”所采用的方法:它们安装一个作为资源打包在 .exe 中的驱动程序。)

就一个程序访问另一个程序而言,Windows 中的每个进程都已经拥有自己的虚拟地址空间,与其他所有进程分开且不相交。即一个程序的 0x10000 与任何其他程序的 0x10000 完全不同。无论您尝试查看哪个地址,您始终都在查看自己进程的该地址实例。

然而:ReadProcessMemory 和 WriteProcessMemory API 允许程序进行跨进程访问(就虚拟地址而言)。要使用它们,执行“访问”的进程必须打开另一个具有 PROCESS_VM_READ 或 PROCESS_VM_WRITE 权限的进程。在您的用户会话中运行的进程通常能够相互执行此操作(即,大多数进程上的安全描述符允许进程的创建者执行此操作……即您)。

但是,一个程序无法知道另一个进程中感兴趣的内容在哪里。寻找任何感兴趣的内容将是一个漫长而乏味的过程。绝大多数尝试都会导致“地址未定义”区域,尤其是在 64 位系统上,尤其是在 Windows 8.1 及更高版本中。即使在虚拟内存的定义区域内,程序也不会定期用上下文信息标记其内存区域,例如“银行帐号在这里:”后面紧接着是该帐号。

您的任何进程都可以访问其他进程的“内存”(宽泛解释),这可能被认为有点不负责任。但请记住,您在一个登录 ID 和授权下所做的一切都被视为由单个用户完成。也就是说,无论如何,这都是您的数据。

坦白说,我更担心磁盘上的数据。所有包含数据的文件都是由您在安全 ID 下创建的,因此任何以您的安全 ID 运行的程序都可以访问它们。更糟糕的是,Windows 默认创建所有文件时,将读取权限授予“用户”组(基本上是所有人)。因此,以其他安全 ID 运行的程序也可以读取它们。而且,由于文件通常命名良好,并放在命名良好且组织良好的目录中,因此找到像 accounts.txt 这样的“有趣”文件并不难。NTFS 文件加密无法帮助抵御以您自己的帐户运行的窥探程序。这比跨进程内存访问的暴露程度要大得多。

相关内容