NTDLL未文档化函数RtlGetNtVersionNumbers获取操作系统版本
作为新手,对获取操作系统版本号好奇过,因为曾经假象过一个场景:自己的程序在windows xp环境下编译,在windows 2003,
windows 7,windows 8是否需要提权或者兼容处理,如果程序在windows 7以上版本需要特殊处理又该怎样判断操作系统版本呢。
带着这个好奇也了解过GetVersion和GetVersionEx函数,他们的最低使用需求是Windows 2000,以下是一些官方的测试代码。
GetVersion function
#include <windows.h>
#include <stdio.h> void main()
{
DWORD dwVersion = ;
DWORD dwMajorVersion = ;
DWORD dwMinorVersion = ;
DWORD dwBuild = ; dwVersion = GetVersion(); // Get the Windows version. dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); // Get the build number. if (dwVersion < 0x80000000)
dwBuild = (DWORD)(HIWORD(dwVersion)); printf("Version is %d.%d (%d)\n",
dwMajorVersion,
dwMinorVersion,
dwBuild);
}
运行结果:
Version is 5.1 (2600)
GetVersionEx function
#include <windows.h>
#include <stdio.h> void main()
{
OSVERSIONINFO osvi;
BOOL bIsWindowsXPorLater; ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osvi); bIsWindowsXPorLater =
( (osvi.dwMajorVersion > ) ||
( (osvi.dwMajorVersion == ) && (osvi.dwMinorVersion >= ) )); if(bIsWindowsXPorLater)
printf("The system meets the requirements.\n");
else printf("The system does not meet the requirements.\n");
}
运行结果:
The system meets the requirements.
今天偶然看见一个帖子(GetVersionEx 如何区分win8和win8.1)和博客(Windows系统版本判定那些事儿)介绍这两个函数,说是在判断 Win8和Win8.1的时候有问题,可以正常返回值:
对于一个未加特殊处理的应用程序用GetVersionEx获取win8和win8.1系统版本,一律都是6.2
这是多么的坑人啊,令人敬畏。
从以上内容了解到了一个ntdll未公开的函数RtlGetNtVersionNumbers,了解到这个函数以后,我用工具查看了ntdll.dll导出函数,的确还真有这个呢。
查看导出函数可以用exescope/pexplorer/CFF explorer,选择导出-->ntdll.dll/导出表查看器/导出目录就可以找到导出地址了。
网友公布的函数使用方法我也在本地编译了一次
#include <stdio.h>
#include <windows.h> typedef void (__stdcall *NTPROC)(DWORD*,DWORD*,DWORD*); void GetWinVer()
{
HINSTANCE hinst = LoadLibrary("ntdll.dll");
DWORD dwMajor,dwMinor,dwBuildNumber;
NTPROC proc = (NTPROC)GetProcAddress(hinst,"RtlGetNtVersionNumbers");
proc(&dwMajor,&dwMinor,&dwBuildNumber);
dwBuildNumber&=0xffff;
printf("OS:%d.%d.%d\n",dwMajor,dwMinor,dwBuildNumber);
FreeLibrary(hinst);
} void main(void)
{
GetWinVer();
}
运行结果:
OS:5.1.2600
这与我在命令提示符下运行ver结果一样的
ver
Microsoft Windows XP [版本 5.1.2600]
这个函数能够准确的获取版本号,在实际运用中根据自己的需求决定吧
NTDLL未文档化函数RtlGetNtVersionNumbers获取操作系统版本的更多相关文章
- 利用未文档化API:RtlGetNtVersionNumbers 获取系统版本号
问题一:Windows SDK 8.1版本中的VersionHelper.h文件当中没有IsWindows10ORGreater,所以当你用IsWindows8Point1ORGreater判断出版本 ...
- 利用未文档化API:RtlAdjustPrivilege 提权实现自动关机
这里主要是利用NTDLL.dll中未文档化的API: RtlAdjustPrivilege 来实现提权.自动关机的功能. RtlAdjustPrivilege定义如下: NTSTATUS RtlAdj ...
- 使用Xcode HeaderDoc和Doxygen文档化你的Objective-C和Swift代码
在一个应用的整个开发过程中涉及到了无数的步骤.其中一些是应用的说明,图片的创作,应用的实现,和实现过后的测试阶段.写代码可能组成了这个过程的绝大部分,因为正是它给了应用生命,但是这样还不够,与它同等重 ...
- Effective Java 第三版——74. 文档化每个方法抛出的所有异常
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- 使用 Swagger 文档化和定义 RESTful API
大部分 Web 应用程序都支持 RESTful API,但不同于 SOAP API——REST API 依赖于 HTTP 方法,缺少与 Web 服务描述语言(Web Services Descript ...
- JQuery语法 JQuery对象与原生对象互转 文档就绪函数与window.onload的区别
[JQuery语法] 1.jQuery("选择器").action();通过选择器调用事件函数,但是jquery中,jquery可以用$(“选择器”).action(); ① ...
- sphinx-python文档化
概述 下文讲述使用sphinx自动生成reStructuredText python API文档的简单过程. 配置流程 安装依赖 $ pip install sphinx blurb python-d ...
- tbls ci 友好的数据库文档化工具
tbls 是用golang 编写的数据库文档化工具,当前支持的数据库有pg.mysql.bigquery 此工具同时提供了变更对比.lint 校验,生成是markdown格式的 简单使用 安装 mac ...
- 使用.NET 6开发TodoList应用(27)——实现API的Swagger文档化
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在日常开发中,我们需要给前端提供文档化的API接口定义,甚至需要模拟架设一个fake服务用来调试接口字段.或者对于后端开发人员 ...
随机推荐
- 配置web项目时页面报错java.lang.NoClassDefFoundError: Tag
把tomcat:common\lib 下的servlet-api.jar 和jsp-api.jar cp到项目的web-inf 的lib包里 ,重启项目即可
- 如何获取TypedArray?
当我们需要自定义控件的时候经常会使用到TypedArray这个类,使用完之后必须调用recycler()函数.... 但是如何获取呢? 有如下几个方式: context(实际最后调用的是context ...
- Openstack Day1简介及虚拟环境搭建
本文章仅作为作者本人存档记忆!恕不详细展开内容! openstack kilo版本重要组件(module)简介 ======================================= Ke ...
- Encrypting bootloader (程序BIN文件加密及在线升级)
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...
- wc命令
wc命令的功能为统计指定文件中的字节数.字数.行数, 并将统计结果显示输出. 语法:wc [选项] 文件- 说明:该命令统计给定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取.wc同 ...
- 在Spring下集成ActiveMQ
1.参考文献 Spring集成ActiveMQ配置 Spring JMS异步发收消息 ActiveMQ 2.环境 在前面的一篇ActiveMQ入门实例中我们实现了消息的异步传送,这篇博文将如何在spr ...
- c++ Primer 第四版 第一阶段 const总结
由于期末值考一门软件安全,所以果断看起c++Primer ,因为之前看谭浩强的c++感觉没什么用啊.所以这本书每阶段做个总结!!! 1.Const限定符作用: 在for循环中上限应该用一个固定变量来设 ...
- VUE 入门基础(5)
五,Class 与 Style 绑定 绑定HTML class 对象语法 我们可以传给v-bind:class 一个对象,以动态的切换class <div v-bind:class=" ...
- jenkins配置自动发送邮件
1.开通QQ的SMTP服务,需要发一条短信,qq会给你一个密码(不是你的QQ邮箱密码哦) 2.安装 Email Extension Plugin 插件 3.进入系统管理--系统设置 3.1按照如下图设 ...
- SCN
SCN 一.SCN的引入 众所周知,当oracle实例崩溃时,oracle通过检查点队列使用CKPT进程,周期性的将LRBA记入控制文件,以记录读取REDO LOG的范围.确定范围之后,oracle首 ...