反转了这个函数。它可以工作。但是单步执行我不知道怎么做。为什么这个可以工作?
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位二进制文件中所有模块的地址空间,从内存来看,它看起来就像在堆之前。
1条答案
按热度按时间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?