具体来说,如果在不同的时间,我读取了ESP寄存器指向的地址(包含堆栈顶部地址),如何判断两个地址是否在同一页面?我相信这些地址是物理地址而不是虚拟地址,对吗?这两个读数可能来自不同的进程。 Windows如何进行页面分配?
补充:也许我明白了。因此,如果我们使用4KB页面,这是否意味着从0x ...... XXXX0000到0x ...... XXXX1000的地址在同一页面中?
答案 0 :(得分:4)
你几乎是对的。这个想法很合理,但范围是0x????0000
到0x????0FFF
。如果您使用DWORD_PTR
或ULONG_PTR
,您还可以屏蔽低12位(ptr & 0xFFF)
并比较您获得的两个指针值。 ULONG_PTR
和DWORD_PTR
应该适用于x64和x86。
请记住,您的系统可能正在使用大页面。因此,请务必分别使用GetNativeSystemInfo
和/或GetSystemInfo
。您正在寻找dwAllocationGranularity
结构中SYSTEM_INFO
的价值。
所有这一切都在同一个进程内存空间中。
关于物理地址的问题:否,我重复没有,用户模式进程会看到实际的物理地址,除非某些驱动程序或内核本身搞砸了。< / p>
假设您正在讨论DLL中的地址,则无法对以Vista及其ASLR功能开始的共享页面做出正确的假设。