访问物理内存地址

Gor*_*lka -1 assembly winapi operating-system driver

在研究作弊和反作弊的工作原理时,我开始对如何访问物理(非虚拟)RAM地址感兴趣,例如,在windows中,MmAllocateContiguousMemory用于从物理地址读取(在某些示例中)但是访问物理内存地址是如何工作的(我还没有找到任何不使用 nativeApi 或 WinApi 的 asm/C 示例)。我想 Windows 完全控制了内存并仅提供用于处理它的外壳 - 但在不同的操作系统和 Windows 中,对内存的访问也以某种方式实现,它是如何工作的,是否可以在没有 winapi / nativeApi 的情况下读取物理内存 [ memtest 以某种方式工作))]

Mar*_*oom 6

当操作系统启动时,它会启用虚拟内存。从那时起,对内存(地址空间)的每次访问都通过 CPU 的 MMU。
控制 MMU 是一项特权操作,只有特权代码(读取:OS)才能更改 MMU 配置。
MMU 配置控制虚拟地址映射到哪个物理地址。

当您要求 Windows“读取”一定范围的物理内存时,它实际上会设置 MMU,以便返回的虚拟范围映射到给定的物理内存。
然后像往常一样读取虚拟内存。
虚拟内存不是物理内存旁边的东西,它位于物理内存之上
它总是在那里。

因此,用户空间程序在没有操作系统帮助的情况下无法访问物理内存,一旦启用,CPU 将始终使用虚拟内存。
事实上,这会带来安全风险,因为它绕过了虚拟内存在物理内存(内存隔离)之上提供的安全机制。