【问题标题】:How does this Is64BitOS pointer-arithmetic-based function work?这个 Is64BitOS 基于指针算术的函数是如何工作的?
【发布时间】:2023-01-10 16:18:45
【问题描述】:

颠倒了这个功能。有用。但逐步通过我无法弄清楚如何。为什么这行得通?

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 安装上在 0x7FFE026C 找到 0x0A?它超出了 32 位二进制文​​件上所有模块的地址空间,查看内存它看起来就在堆之前。

【问题讨论】:

    标签: c++ windows


    【解决方案1】:

    看起来它正在访问共享的 KUSER_SHARED_DATA 结构。 0x7FFE026C对应NtMajorVersion字段。然后它尝试访问 SystemCall 字段,该字段根据它是 Windows 10 之前还是之后的不同偏移量,因此检查:

    SystemCall

    在 AMD64 上,如果系统使用系统服务调用机制的更改视图运行,则此值将初始化为非零值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2016-05-10
      • 2011-05-30
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      相关资源
      最近更新 更多