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