今天接到一个问题,说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 路,所以调用必然出错。

就是这么简单。

最新文章

  1. form表单提交和阻止
  2. NYOJ题目770仿射密码
  3. Nginx的负载均衡 - 整体架构
  4. [JS] JavaScript由浅入深(2) 进阶
  5. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
  6. python 使用 redis expire属性设置访问时间间隔
  7. 前端开发工具—fiddle
  8. Oracle10g数据泵EXPDP和IMPDP备份与恢复数据
  9. PHP文件上传预览
  10. Configuration Extensions - 简化配置,让你配置支持变量
  11. python 简史
  12. 面试简单整理之spring、spring mvc
  13. 微信小程序的概要
  14. .NET Core 中的路径问题
  15. Integer的NPE问题
  16. swoole 使用异步redis的前置条件
  17. 201303014001 张敏 计科高职13-1 github使用心得
  18. Pandas汇总和处理缺失数据
  19. Docker(二):Dockerfile使用介绍
  20. Debug时检测到Loaderlock的解决办法

热门文章

  1. 这 17 个 JVM 参数,高级 Java 必须掌握!
  2. html 中手写阴影弹窗框封装
  3. ubuntu中搭建基本的开发环境
  4. Octave的安装
  5. 编译Android源代码
  6. 每天一个Linux常用命令 ls命令
  7. 深入理解java虚拟机JVM(上)
  8. 【转载】sublime text3 全攻略
  9. 解决Addin开发不能断点调试的问题
  10. Linux - 退出vim界面