Windows版本和检测
2008-12-19 11:21
781 查看
Windows版本和检测
前天在研究PEB位置时发现自XPSP2之后就开始随机变动位置了,而不是想以前那样固定在0X7FFDF000上了.我突然想起以前转发的一篇文章<非API函数检测操作系统类型>,此文中就是将PEB位置是否为OX7FFDF000作为区分WINNT和WIN9X的标志的.现在PEB的位置也不固定了,看来判断条件得修正一下了.
Windows版本号分为操作系统版本号和服务包(Service Packet)版本号.其中操作系统版本号分为:主版本号(MajorVersion)、次版本号(MinorVersion)和内部版本号(BuildNumber);服务包号分为主服务包号和内部服务包号.
Windows内部有一组变量专门用来保存版本号的信息,在调用MmCreatePeb创建每个进程的PEB时会将这些信息的大部分拷贝至PEB中.而我们使用GetVersionEx这样的API函数就是从PEB中读取数据的.由于在WinNt下这些版本信息在PEB中的位置没有改变,于是在用户态下,我们可以直接读取PEB中的版本信息,而绕过API了.
下表是XPSP3下版本信息分别在系统中存放的位置:
根据上面的叙述,下面就是我对<非API函数检测操作系统类型>一文的代码修正,用c内嵌汇编完成:
上面是根据主次版本号来区别操作系统版本的,由于在内核中仅有NtBuildNumber从ntoskrnl.exe中导出,而且内部本版号和操作系统版本也有严格的对照关系,如下图:
于是我们在内核中可以使用内部版本号来分辨操作系统版本了.
参考文献:
1.http://en.wikipedia.org/wiki/Windows_NT
前天在研究PEB位置时发现自XPSP2之后就开始随机变动位置了,而不是想以前那样固定在0X7FFDF000上了.我突然想起以前转发的一篇文章<非API函数检测操作系统类型>,此文中就是将PEB位置是否为OX7FFDF000作为区分WINNT和WIN9X的标志的.现在PEB的位置也不固定了,看来判断条件得修正一下了.
Windows版本号分为操作系统版本号和服务包(Service Packet)版本号.其中操作系统版本号分为:主版本号(MajorVersion)、次版本号(MinorVersion)和内部版本号(BuildNumber);服务包号分为主服务包号和内部服务包号.
Windows内部有一组变量专门用来保存版本号的信息,在调用MmCreatePeb创建每个进程的PEB时会将这些信息的大部分拷贝至PEB中.而我们使用GetVersionEx这样的API函数就是从PEB中读取数据的.由于在WinNt下这些版本信息在PEB中的位置没有改变,于是在用户态下,我们可以直接读取PEB中的版本信息,而绕过API了.
下表是XPSP3下版本信息分别在系统中存放的位置:
内核变量 | PEB成员 | |
OS主版本号 | NtMajorVersion | +0x0a4 OSMajorVersion : Uint4B |
OS次版本号 | NtMinorVersion | +0x0a8 OSMinorVersion : Uint4B |
OS内部版本号 | NtBuildNumber | +0x0ac OSBuildNumber : Uint2B |
主服务包号 | CmNtCSDVersion | +0x0ae OSCSDVersion : Uint2B |
内部服务包号 | CmNtSpBuildNumber | 无 |
其他 | NtBuildLab[] | 无 |
_asm { MOV EAX, FS:[18H] ;TEB MOV EBX, FS:[30H] ;PEB MOV ECX, EBX AND EAX, 7FF00000H CMP EAX, 7FF00000H JNZ Win9x AND EBX, 7FF00000H CMP EBX, 7FF00000H JNZ WIN9x //WIN2K,WINXP,WIN2K3 MOV EAX, [ECX + 0A4H] ;MajorVersion MOV EBX, [ECX + 0A8H] ;MinorVersion CMP EAX, 5 JB OVER CMP EBX, 0 JNZ VER1 //5.0 = WIN2K JMP OVER VER1: CMP EBX, 1 JNZ VER2 //5.1 = WINXP JMP OVER VER2: CMP EBX, 2 JNZ OVER //5.2= WIN2K3 WIN9x: MOV EDX, 00530000H MOV EAX, FS:[18H] MOV EBX, [EAX + 58H] MOV ECX, [EAX + 7CH] MOV EAX, [EAX + 54H] CMP EBX, EDX JNZ VER3 //WIN95 JMP OVER VER3: CMP EAX, EDX JNZ VER4 //WIN98 JMP OVER VER4: CMP ECX, EDX JNZ OVER //WINME OVER: } |
于是我们在内核中可以使用内部版本号来分辨操作系统版本了.
参考文献:
1.http://en.wikipedia.org/wiki/Windows_NT
相关文章推荐
- 带超时时间的telnet该怎么玩?------检测tcp是否可连接时经常用到(本文仅给出linux版本,之前博客也有Windows版本的)
- 检测windows各版本完整代码
- windows版本检测函数
- Windows下cmake编译caffe,实现纯C++版本MTCNN人脸检测和关键点定位
- opencv视频取帧并进行人脸检测(Windows和Linux双版本)
- userAgent,JS用户代理检测——判断浏览器内核、浏览器、浏览器平台、windows操作系统版本、移动设备、游戏系统
- 一个适应多个Windows版本的RAS检测类
- Windows及.NET Framework版本检测工具
- C++检测windows操作系统.NET所有版本情况
- userAgent,JS用户代理检测——判断浏览器内核、浏览器、浏览器平台、windows操作系统版本、移动设备、游戏系统
- 检测windows版本
- 系统检测发现您正在使用极低版本IE浏览器,可能存在安全隐患,强烈推荐您在windows系统使用更快速!更安全!更稳定!的浏览器:FireFox火狐浏览器,点击下载
- 使用C# 完美实现多语言版本Windows应用程序
- Windows默认启用的.net版本
- java实现windows下客户端软件的下载安装和检测
- loadrunner在没有windows版本程序下利用socket协议手动写脚本思路
- Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。
- iOS-75-分享Xcode使用技巧(兼容iOS10、iPhone刷机固件、Xcode各版本、内存泄漏检测)
- Android版本检测更新
- 让Windows 7旗舰版在安装时有任意版本供你选择安装