zoukankan      html  css  js  c++  java
  • kernel32 的 GetVersionExA/W

    今天接到一个问题,说Kernel32 模块的 GetVersionEx 获取系统版本不准确,

    然后让我查查什么原因,

    我当时就想,它不准,就用ntdll的 RtlGetVersion 阿,或者 RtlGetNtVersionNumbers,这不都行么,

    那就看看为什么会出现 kernel32 的函数出现问题吧,

    其实挺简单的,梳理一下调用过程

    环境 Win10 x64 16299,

    调用kernel32 的 GetVersionExW 会走到 kernelbase的 GetVersionExW ,

    然后再调用ntdll的 RtlGetVersion,最后再经过一堆计算,返回,

    其实经过分析,获取的系统信息,在 RtlGetVersion 这一步返回的时候,还是正确的,

    但是后续的时候就出了问题了。具体是什么问题,

    其实,Win10 在 kernelbase里面硬编码写了几个东西,导致这里出问题了,

    它到底写了什么,看下面ida截图

    这是 kernelbase 里面的函数,前面可以一笔带过,都是正确的,

    直到v1 = v2(); 调用结束之后,开始来问题了,

    其实,如果不调用 v1 = v2(); 的话也不会出问题,

    只要调用了这个函数,那么必然v1会变成1,因为我们的PC电脑几乎都是intel系列,几乎就没有非小端的,

    只有移动端平台、ARM平台系列才有大端,所以这里必然返回是1(其实那个函数内部也是就一句话,return 1;),

    那么如果这里返回1的话,就必然走 if (v3) 的 else 路,所以调用必然出错。

    就是这么简单。

  • 相关阅读:
    【NumPy】理清Reshape和Transpose
    【NumPy】What does axis/axes mean in Numpy
    【Git】测试部Git使用规范
    NCNN性能测试笔记
    MNN性能测试笔记
    Android Studio 查看SQLite数据库存储位置及文件
    NPOI 设置world表格单元格居中
    NPOI.XWPF.UserModel.XWPFTableCell.SetText()方法不能传入NULL
    a标签不跳转
    mvc 布局页引用布局页 写法
  • 原文地址:https://www.cnblogs.com/suanguade/p/8447663.html
Copyright © 2011-2022 走看看