windows 这个基于Is64BitOS指针算法的函数是如何工作的?

yuvru6vn  于 2023-01-14  发布在  Windows
关注(0)|答案(1)|浏览(121)

反转了这个函数。它可以工作。但是单步执行我不知道怎么做。为什么这个可以工作?

bool   _Is64BitOS(void) {
    unsigned int version = *(unsigned int*)0x7FFE026C;
    unsigned int address = version == 10 ? 0x7FFE0308 : 0x7FFE0300;
    ILog("Running %u-bit system\n", *(void**)address ? 32 : 64);

    return (*(void**)address ? false : true);
};

为什么我们在64位Windows安装中找到0x0A?它超出了32位二进制文件中所有模块的地址空间,从内存来看,它看起来就像在堆之前。

nfs0ujit

nfs0ujit1#

它正在使用其常规地址0x7FFE0000访问KUSER_SHARED_DATA结构。0x7FFE026C对应于NtMajorVersion字段。然后它尝试访问SystemCall字段,该字段的偏移量不同,具体取决于它是Windows 10之前版本还是Windows 10之后版本,因此检查:
SystemCall
在AMD64上,如果系统以系统服务调用机制的更改视图运行,则此值被初始化为非零值。
另请参阅:Why doesn’t Windows use the 64-bit virtual address space below 0x00000000`7ffe0000?

相关问题