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 路,所以调用必然出错。
就是这么简单。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2017-02-13 转——调试寄存器 原理与使用:DR0-DR7