首页
社区
课程
招聘
[原创]C/C++ 实现获取Windows操作系统版本信息
发表于: 2019-7-12 01:01 16143

[原创]C/C++ 实现获取Windows操作系统版本信息

2019-7-12 01:01
16143
用的win10  1903,但使用GetVersionEx等等的WindowsAPI函数一直没成功,函数被否认,后使用VersionHelpers.h成功了,代码如下,但win8.1和win10的兼容一直没搞定,待定吧
#include <windows.h>
#include <stdio.h>
#include <VersionHelpers.h>

int __cdecl wmain(	__in int argc,	__in_ecount(argc) PCWSTR argv[])
{
	UNREFERENCED_PARAMETER(argc);
	UNREFERENCED_PARAMETER(argv);

	// XP或者更高级的版本
	if (IsWindowsXPOrGreater())
	{
		printf("XPOrGreater (XP或者更高级的版本)\n");
	}

	// XP SP1 或者更高级的版本
	if (IsWindowsXPSP1OrGreater())
	{
		printf("XPSP1OrGreater (XP SP1 或者更高级的版本)\n");
	}

	// XP SP2 或者更高级的版本
	if (IsWindowsXPSP2OrGreater())
	{
		printf("XPSP2OrGreater (XP SP2 或者更高级的版本)\n");
	}

	// XP SP3 或者更高级的版本
	if (IsWindowsXPSP3OrGreater())
	{
		printf("XPSP3OrGreater (XP SP3 或者更高级的版本)\n");
	}

	// Vista 或者更高级的版本
	if (IsWindowsVistaOrGreater())
	{
		printf("VistaOrGreater (Vista 或者更高级的版本)\n");
	}

	// Vista SP1 或者更高级的版本
	if (IsWindowsVistaSP1OrGreater())
	{
		printf("VistaSP1OrGreater(Vista SP1 或者更高级的版本)\n");
	}

	// Vista SP2 或者更高级的版本
	if (IsWindowsVistaSP2OrGreater())
	{
		printf("VistaSP2OrGreater (Vista SP2 或者更高级的版本)\n");
	}

	// Win7 或者更高级的版本
	if (IsWindows7OrGreater())
	{
		printf("Windows7OrGreater (Win7 或者更高级的版本)\n");
	}

	// Win7 SP1 或者更高级的版本
	if (IsWindows7SP1OrGreater())
	{
		printf("Windows7SP1OrGreater (Win7 SP1 或者更高级的版本)\n");
	}

	// Win8 或者更高级的版本
	if (IsWindows8OrGreater())
	{
		printf("Windows8OrGreater (Win8 或者更高级的版本)\n");
	}

	// Win8.1 或者更高级的版本
	if (IsWindows8Point1OrGreater())
	{
		printf("Windows8Point1OrGreater (Win8.1 或者更高级的版本)\n");
	}

	// Win10 或者更高级的版本
	if (IsWindows10OrGreater())
	{
		printf("Windows10OrGreater (Win10 或者更高级的版本)\n");
	}

	// 是服务器端操作系统还是客户端操作系统
	if (IsWindowsServer())
	{
		printf("Server (服务器)\n");
	}
	else
	{
		printf("Client (客户端)\n");
	}
}


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 1
支持
分享
最新回复 (18)
雪    币: 292
活跃值: (153)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
我记得前阵看雪有个逆向病毒的文章,逆到了判断系统版本的逻辑。  你可以去找找。。。感觉那个病毒写的很简洁。
最后于 2019-7-12 05:57 被Dstlemoner编辑 ,原因:
2019-7-12 04:36
0
雪    币: 319
活跃值: (951)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
微软不希望开发者知道系统版本号。当然他还是提供了兼容方案,看这里
https://docs.microsoft.com/en-us/windows/win32/sysinfo/targeting-your-application-at-windows-8-1
最后于 2019-7-12 09:00 被aqtata编辑 ,原因:
2019-7-12 09:00
0
雪    币: 1176
活跃值: (1234)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
4
哪用得着这么麻烦啊 直接PEB读取
2019-7-12 09:33
0
雪    币: 18
活跃值: (1009)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
RtlGetVersion
2019-7-12 11:02
0
雪    币: 6977
活跃值: (1780)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
kernel32.dll 的详细信息
2019-7-12 14:17
0
雪    币: 1046
活跃值: (1261)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
7
Tennn 哪用得着这么麻烦啊 直接PEB读取
正规软件还是最好不要用peb取,用RtlGetVersion 最靠谱
2019-7-12 14:29
0
雪    币: 11974
活跃值: (5554)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
这个头文件的函数太臃肿了,直接拿到buildnumber比较十几个值就知道是那个版本的系统了
2019-7-12 16:49
0
雪    币: 1886
活跃值: (5929)
能力值: ( LV7,RANK:116 )
在线值:
发帖
回帖
粉丝
9
这样子嘛

#include<Windows.h>
#include<stdio.h>

int main()
{
	uintptr_t PEB;
	int OsBuildNumber;
#ifdef _WIN64
	PEB = __readgsqword(0x60);
	OsBuildNumber = *((INT *)(PEB + 0x120));
#else
	PEB = __readfsdword(0x30);
	OsBuildNumber = *((INT *)(PEB + 0xAC));
#endif // _WIN64
	switch (OsBuildNumber)
	{
	case 17134:
		printf("Win10 1803\n");
		break;
	case 17763:
		printf("Win10 1809\n");
		break;
	case 18362:
		printf("Win10 1903\n");
		break;
	case 15063:
		printf("Win10 1703\n");
		break;
	case 16299:
		printf("Win10 1709\n");
		break;
	// ........Other Windows OS Version
	default:
		break;
	}
	printf("OsBuildNumber: %d", OsBuildNumber);
	getchar();
}

2019-7-12 19:22
0
雪    币: 9210
活跃值: (1871)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
2019-7-12 20:04
0
雪    币: 1176
活跃值: (1234)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
11
StriveXjun 正规软件还是最好不要用peb取,用RtlGetVersion 最靠谱
为什么会有这种的说法……
2019-7-13 17:20
0
雪    币: 18
活跃值: (1009)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
12
Tennn 为什么会有这种的说法……
PEB不是相当于KPROCESS嘛,各种偏移。而这个API是公开的,易用也方便维护。我的看法。
2019-7-13 22:56
0
雪    币: 27
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
RtlGetVersion 和 GetVersionEx 没区别,不靠谱。
2019-7-26 13:49
0
雪    币: 1046
活跃值: (1261)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
14
賈可 RtlGetVersion 和 GetVersionEx 没区别,不靠谱。
自己没用过就别下结论。 去win8.1以上的系统用用就知道了。
2019-8-29 18:09
0
雪    币: 251
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
你这代码写了跟没写一样,XP就是XP,还 “或更高版本”,跟没说一样嘛,我做过此功能,但是你一般的方法8.1及之后的版本默认都是8.1,你要特殊处理,方法较多,有种是修改manifest文件
2019-8-30 10:10
0
雪    币: 27
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
StriveXjun 自己没用过就别下结论。 去win8.1以上的系统用用就知道了。
我又去验证了一下,确实记错了,RtlGetVersion 不受 manifest 的影响,但是实测还是会被兼容性设置所影响。
2019-9-27 10:53
0
雪    币: 526
活跃值: (663)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
void Demo::Get_WinVer()
{
       /*
        调用信息 :
        功能: 得到   系统版本 无返回值 支持UNICODE
        头文件:  Demo.h
        调用  Get_WinVer();
       */
       HKEY  dh_h_key;
       LPCWSTR strSubKey = (L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
       LPCWSTR strMainVersion = (L"ProductName");
       LPCWSTR strSubVersion = (L"CurrentBuildNumber");

       DWORD dwType = REG_SZ;
       DWORD dwLen = MAX_PATH;
       wchar_t main_ver_data[MAX_PATH];
       wchar_t sub_ver_ata[MAX_PATH];

       RegOpenKey(HKEY_LOCAL_MACHINE, strSubKey, &dh_h_key);
       RegQueryValueEx(dh_h_key, strMainVersion, 0, &dwType, (LPBYTE)main_ver_data, &dwLen);
       RegQueryValueEx(dh_h_key, strSubVersion, 0, &dwType, (LPBYTE)sub_ver_ata, &dwLen);
       wcout << main_ver_data << " : " << sub_ver_ata << endl;
       RegCloseKey(dh_h_key);
}
2019-11-1 00:39
0
雪    币: 1430
活跃值: (1235)
能力值: ( LV3,RANK:23 )
在线值:
发帖
回帖
粉丝
18
StriveXjun 正规软件还是最好不要用peb取,用RtlGetVersion 最靠谱
用 ntdll 的PE信息比较准确,比如在兼容模式运行 GetVersion 返回就有不对
2019-11-15 10:43
0
游客
登录 | 注册 方可回帖
返回
//