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

就是这么简单。

kernel32 的 GetVersionExA/W的更多相关文章

  1. Delphi7所使用的WinAPI大全(摘自VCL源码,一共1200个函数)

    经过我整理的,去掉了A和W的重复.虽然没写注释,但以后要一个一个研究.有这些WINAPI就够用了. kernel32 = 'kernel32.dll'; gdi32 = 'gdi32.dll'; us ...

  2. DLL注入_拦截技术之Hook方式

    后卫大师教你进程注入 首先提一下,由于文章完全是我手写,所以打不了太多,请包含,由于我已经提供了源代码,所以我在这里详细讲一下理论,至于想看代码的下载代码就可以了.代码中关于注入的部分做了详细的注释. ...

  3. VB6 CHECK is run as admin privilege

    vb6 code: Private Declare Function IsUserAnAdmin Lib "Shell32" Alias "#680" () A ...

  4. C/C++获取CPU等硬件信息&&屏幕截图

    打算练习Socket的时候用用,最近有点小事情,没时间继续完善,先把写的这些代码贴上来,有空了再完善一下. HardwareInfo.h #include <stdio.h> #inclu ...

  5. lucene入门创建索引——(二)

    1.程序宏观结构图

  6. [DllImport("kernel32.dll")]是什么意思??

    转载自:http://blog.csdn.net/sp6645597/article/details/8683737 1.简单说明 这叫引入kernel32.dll这个动态连接库(顾名思义就是一个链接 ...

  7. curl -w,–write-out参数详解

    顾名思义,write-out的作用就是输出点什么.curl的-w参数用于在一次完整且成功的操作后输出指定格式的内容到标准输出. 输出格式由普通字符串和任意数量的变量组成,输出变量需要按照%{varia ...

  8. SharePoint Claim base authentication EnsureUser 不带claim(i:0#.w|)user Failed

    环境信息: 带有Form base authentication(FBA).Active Directory Federation Services(ADFS).以及windows Authentic ...

  9. 文件权限:普通(r、w、x)和特殊(s、t)

     linux中,常常涉及到权限的问题.文件的权限有3组,owner,group,other,每一组都有rwx三种设置.r(4):可读:w(2):可写:x(1):可执行.我们在执行shell命令ls - ...

随机推荐

  1. 基于MFC的Media Player播放器的制作(1---播放器界面的布局)

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 通过上面的一些预备知识,我们现在就可以自己来制作基于MFC的播放器了,接下来我们讲的是使用MFC制作我们播放器 的界面. 首先,我们我们打 ...

  2. 【记录】Http 状态码整理

    Http状态码: 1XX:信息,服务器收到请求,需要请求者继续执行操作 2XX:成功,操作被成功接收并处理 3XX:重定向,需要进一步的操作以完成请求 4XX:客户端错误,请求包含语法错误或无法完成请 ...

  3. 存储过程分页查询和在ado.net中的使用,返回查询总数

    1.创建查询分页的存储过程 CREATE PROCEDURE PageQuery @tableName VARCHAR(),-- 表名 @strWhere VARCHAR(),-- 查询条件 @col ...

  4. Codeforces 343D 线段树

    题意:给你一颗以点1为根的数,有两种操作,一种是把x及其子树的所有点都灌满水,一种是把x及其所有祖先都放空水,一种是询问,问某个点里有没有水? 思路:看网上大多数是树剖,但实际上5e5的数据树剖还是有 ...

  5. thrift 的required、optional探究

    原因 经常使用thrift来编写rpc通信,但是对下面两个问题还是有些疑惑 thrift 的required.optional和不写有什么区别 optional不设置isset的话被传输后值? 实验 ...

  6. Android 如何使edittext默认失去焦点

    1.在布局文件中给edittext的父控件增加两个属性 android:focusable="true" android:focusableInTouchMode="tr ...

  7. 项目实战-Gulp使用

    引言 在工作中,经常会遇到要把文件合并和压缩等操作,我经历过下面的演进过程: 使用ajaxmin工具手动合并和压缩 使用Grunt合并和压缩 使用Gulp合并和压缩 这里不探讨Grunt和Gulp的优 ...

  8. vue搭建vue-cli脚手架项目

    一.Node.js 1.介绍 Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine.Node.js是一个基于Ch ...

  9. 初试avalon

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Final 可重入锁 安全发布

    无状态对象(既不包含任何域,也不包含任何其他类中域的引用)一定是线程安全的. Final fianl域是不能修改的(但如果final域所引用的对象是可变的,那么这些被引用的对象是可变的) 除非需要可变 ...