Windows如何正确获取系统版本号
从win8以后,获取系统版本号的API GetVersion已经被废弃,获取到的版本号都是不正确的。那么如何正确获取系统版本号呢?这里有一个方法:在内核地址0xFFDF0000开始往后4KB的内存与进程空间地址0x7FFE0000是映射到同一物理内存,而内核可以往0xFFDF0000处写入数据,进程可以从0x7FFE0000处读出数据。在这块内存中,定义了一个数据结构:
typedef _KUSER_SHARED_DATA{
+0x000 TickCountLow : 0x1511d3
+0x004 TickCountMultiplier : 0xfa00000
+0x008 InterruptTime : _KSYSTEM_TIME
+0x014 SystemTime : _KSYSTEM_TIME
+0x020 TimeZoneBias : _KSYSTEM_TIME
+0x02c ImageNumberLow : 0x14c
+0x02e ImageNumberHigh: 0x14c
+0x030 NtSystemRoot : 0x43
+0x238 MaxStackTraceDepth : 0
+0x23c CryptoExponent : 0
+0x240 TimeZoneId : 0
+0x244 Reserved2 : 0
+0x264 NtProductType : 1 ( NtProductWinNt )
+0x268 ProductTypeIsValid : 0x1 ''
+0x26c NtMajorVersion : 5
+0x270 NtMinorVersion : 1
+0x274 ProcessorFeatures : ""
+0x2b4 Reserved1 : 0x7ffeffff
+0x2b8 Reserved3 : 0x80000000
+0x2bc TimeSlip : 0
+0x2c0 AlternativeArchitecture : 0 ( StandardDesign )
+0x2c8 SystemExpirationDate : _LARGE_INTEGER 0x0
+0x2d0 SuiteMask : 0x110
+0x2d4 KdDebuggerEnabled : 0 ''
+0x2d5 NXSupportPolicy: 0x2 ''
+0x2d8 ActiveConsoleId: 0
+0x2dc DismountCount : 0
+0x2e0 ComPlusPackage : 0xffffffff
+0x2e4 LastSystemRITEventTickCount : 0x148570d
+0x2e8 NumberOfPhysicalPages : 0xca8ee
+0x2ec SafeBootMode : 0 ''
+0x2f0 TraceLogging : 0
+0x2f8 TestRetInstruction : 0xc3
+0x300 SystemCall : 0x7c92e510
+0x304 SystemCallReturn : 0x7c92e514
+0x308 SystemCallPad : 0
+0x320 TickCount : _KSYSTEM_TIME
+0x320 TickCountQuad : 0
+0x330 Cookie : 0xddb766db
}KUSER_SHARED_DATA,*PKUSER_SHARED_DATA;
在该数据结构偏移0x26c和0x270就是系统的主版本号和次版本号。所以要想获取系统版本号,只要从0x7FFE0000处开始读出该数据结构即可。
PS: 该块内存有4KB之多,而KUSER_SHARED_DATA只是占了很小的一部分,还剩下很大的空间,可以做很多事{:5_109:} 。就是看你的想象力了
页:
[1]