之前(1)篇中大致介绍了mainCRTStartup,但是其中一些调用到的函数并未深究,现打算逐一剖析它们。
GetVersion
GetVersion函数是kernel32.dll中提供的API,用于获取当前Win平台的版本。准确的说,GetVersion可以获得3个信息:
1. OSPlatformId
2. OSBuildNumber
3. OSMinorVersion
4. OSMajorVersion
其中比较诡异的是OSPlatformId,在GetVersion的过程当中它被获得过,但是返回的时候又没了...所以只剩下2、3、4
可以用OD来跟进GetVersion:
mov eax, dword ptr fs:[18]
mov ecx, dword ptr [eax+30]
mov eax, dword ptr [ecx+B0] // 获取 OSPlatformId
movzx edx, word ptr [ecx+AC] // 获取 OSBuildNumber
xor eax, FFFFFFFE
shl eax, 0E // 几次左移,把OSPlatformId的信息给移没了...
or eax, edx
shl eax, 8
or eax, dword ptr [ecx+A8] // 获取 OSMinorVersion
shl eax, 8
or eax, dword ptr [ecx+A4] // 获取 OSMajorVersion
retn
GetVersion主要是去PEB(Process Environment Block)结构中访问当前的OS信息,每个进程都会有自己独立的PEB。想要获取当前进程的PEB地址,首先要先访问TEB(Thread Environment Block
)结构。因为TEB结构的30偏移量处中存放了PEB结构的指针。FS
寄存器指向了当前活动线程的TEB结构,其中偏移位置18表示了FS
段寄存器在内存中的镜像地址。
TEB结构
000 指向SEH链指针
004 线程堆栈顶部
008 线程堆栈底部
00C SubSystemTib
010 FiberData
014 ArbitraryUserPointer
018 FS段寄存器在内存中的镜像地址
020 进程PID
024 线程ID
02C 指向线程局部存储指针
030 PEB结构地址(进程结构)
034 上个错误号
因此
mov eax, dword ptr fs:[18]
mov ecx, dword ptr [eax+30]
两句表示根据TEB获取PEB的指针,并且存放在ECX中。拿到PEB的指针后,就可以去PEB中拿OS的信息。
PEB结构中关于OS信息的偏移量如下:
PEB 写道
typedef struct _PEB // Size: 0x1D8
……
/*0A4*/ ULONG OSMajorVersion;
/*0A8*/ ULONG OSMinorVersion;
/*0AC*/ USHORT OSBuildNumber;
/*0AE*/ USHORT OSCSDVersion;
/*0B0*/ ULONG OSPlatformId;
……
如果是XP用户,那么GetVersion最终的返回值应该是:0A280105 。
其中 0A28表示XP build版本是2600,01表示OSMinorVersion,05表示OSMajorVersion 。
中间被忽略掉的 OSPlatformId 信息可以为:
-
VER_PLATFORM_WIN32s 或 0x0000,用于指定 Microsoft Windows 3.1。
-
VER_PLATFORM_WIN32_WINDOWS 或 0x0001,用于指定 Windows 95、Windows 98 或从其继承的操作系统。
-
VER_PLATFORM_WIN32_NT 或 0x0010,用于指定 Windows NT 或从其继承的操作系统。
另外,还有一些补充的OS信息如下:
(摘录自 http://msdn.microsoft.com/zh-cn/library/ms724833%28v=VS.85%29.aspx
)
Operating system
|
Version number
|
dwMajorVersion
|
dwMinorVersion
|
Windows 7 |
6.1 |
6 |
1 |
Windows Server 2008 R2 |
6.1 |
6 |
1 |
Windows Server 2008 |
6.0 |
6 |
0 |
Windows Vista |
6.0 |
6 |
0 |
Windows Server 2003 R2 |
5.2 |
5 |
2 |
Windows Home Server |
5.2 |
5 |
2 |
Windows Server 2003 |
5.2 |
5 |
2 |
Windows XP Professional x64 Edition |
5.2 |
5 |
2 |
Windows XP |
5.1 |
5 |
1 |
Windows 2000 |
5.0 |
5 |
0 |
分享到:
相关推荐
2 - 第二例处理的选择(从它的地址检索函数名称) -------------------------------------------------- 键入此信息: user32.dll中的DLL名称: 函数地址:77D504EA 其结果将是(对我来说): 函数名称:...
API之网络函数1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一...
getVersion(3)
系统(服务器)信息 - system-info 关于您的服务器的信息。 支持的操作系统: ... $ system :: getVersion (); . . . $ system :: getUptime (); 通过 Composer 安装 "require": { ... "intpp
aioaria2 提供aria2异步客户端通信 提供与aria2异步通信的客户端与管理aria2进展的服务端 使用方法: 示例 import asyncio from pprint import pprint import aioaria2 async def main (): async with aioaria2 . ...
parent::__construct(static::NAME, VersionProvider::getVersion(static::VERSION)); } public function doRun(InputInterface $input, OutputInterface $output) { $this->add(new ...
$ version = \ PackageVersions \ Versions :: getVersion ( 'ocramius/package-versions' );var_dump ( $ version ); // 1.0.0@0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33安装composer require ocramius/package-...
GetVersionEx,获取Windows操作系统版本的例子。
1.Download Axis2 as WAR and install it in your servlet container 2.Download the DynamicResponseHandler module and add it to Axis by copying it to WEB-INF/modules 3.Patch Jettison or download my ...
其实,在任务条上添加托盘比较容易实现,调用VC中的函数就可以解决,只是注意协调。接下来,我将给大家提供一个类,可以很容易的达到我们的目的,希望它能给大家一点帮助,如果你发现BUG也欢迎你和我联系。运行程序...
if (MessageBox.Show("当前应用版本为:" + GetVersion + "\n\r需要升级到:" + DT.Rows[0]["Version"].ToString() + "\n\r" + DT.Rows[0]["Message"].ToString() + "\n\r点击“Yes”开始升级...", "升级提示", ...
使用vs2012,遇到如下错误。 error C4996: ‘fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for ...
Dialogs : 调用打开、保存文档框等命令 DumpLog : 记录安装日志插件 EBanner : EBanner 插件 EmbeddedLists : 使用INI+此插件可使NSIS显示列表视图和树视图控件 EnumCDs : 枚举CD驱动器插件 EnumINI : 枚举INI值插件...
from codeguru 共两个工程 VersionInfo GetVersionInfo
当你的应用存储数据到Session中,或从Session中清除数据,Servlet都会通过HttpSessionBindingListener检杳什么类被绑定或被取消绑定。这个接口的方法会通报被绑定或被取消绑定的对象。 绪言 这是一份关于2.1版...
大多数函数都是已记忆的,因此,一旦调用它们,它们将简单地返回相同的值。 请记住,多次调用require()返回模块的相同实例化(如果已被实例化),因此该备注将保留在同一项目中的多个文件中。 某些功能内置有自动...
ICQAPICall_GetVersion12. ICQAPICall_GetWindowHandle // Version 1.0001 13. ICQAPICall_GetOnlineListType14. ICQAPICall_GetGroupOnlineListDetails15. ICQAPICall_SetOwnerState16. ICQAPICall_...
$builder = Parser::toBuilder('1.2.3-alpha 2'); $builder->incrementMajor(); $builder->clearBuild(); $builder->clearPreRelease(); echo Dumper::toString($builder); // echoes "2.0.0" $...
在Java开发中用于生成并导出excel文件的源代码实例,提供给大家交流学习。
通过代码获得程序资源中VS_VERSION_INFO所有信息。