`
driftcloudy
  • 浏览: 132178 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

从Entry Point到main函数调用(2):GetVersion

    博客分类:
  • C
阅读更多

之前(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

 

 

 

 

 

分享到:
评论

相关推荐

    计算机WindowsAPI函数清单.pdf

    2. **消息函数**: - `PostMessage`:将一个消息放入指定窗口的消息队列,但不等待该消息被处理。 - `GetMessage`:从消息队列中获取消息,直到有消息可用或到达超时时间。 3. **文件处理函数**: - `CreateFile...

    CH375DLL函数介绍

    通过对CH375DLL库函数的详细解析,我们可以清楚地了解到如何利用这些函数来简化USB设备的开发过程。无论是对于初学者还是有经验的开发者来说,掌握这些函数都将大大提升开发效率,使得项目进展更加顺利。希望本文的...

    VB API 函数使用手册

    《VB API函数使用手册》是一份详尽的资源,涵盖了大约774个Windows API函数,这些函数被精心地划分为十二大类别,旨在为VB(Visual Basic)开发者提供全面的函数参考。API(Application Programming Interface)是...

    windows API函数查询

    Windows API(应用程序接口)是微软操作系统...总的来说,"windows API函数查询"涵盖了广泛的知识点,从基本的函数调用到复杂的系统交互,对于任何Windows平台上的软件开发者来说,理解和掌握API都是必不可少的技能。

    Windows API 函数 for Visual Basic chm文档

    2. **错误处理**:调用API函数后,应检查返回值,通过`GetLastError`判断是否成功,并使用`FormatMessage`获取具体错误信息。 3. **资源管理**:对于分配的内存、打开的文件等,使用完后记得释放或关闭,避免资源...

    易语言测试主程序源码,易语言DLL有参数数据调用

    例如,如果DLL有一个名为`GetVersion`的无参数函数,用来获取DLL的版本信息,我们只需在易语言中直接调用这个函数,然后通常会有一个返回值来获取版本信息。 在实际编程过程中,我们还需要关注以下几点: - **类型...

    vbapi函数手册(chm版)

    VBAPI函数手册是一份专为Visual Basic(VB)开发者编写的参考资料,主要涵盖了VB应用程序如何调用操作系统级别的API(Application Programming Interface)函数。API函数是操作系统提供给开发者使用的接口,通过这些...

    易语言源码易语言DLL无参数数据调用源码.rar

    版本信息 = 调用外部函数 “GetVersion” ``` 4. **处理返回值**:根据函数的返回类型,将返回值赋给相应的变量。例如,上述代码中的`版本信息`变量就会存储`GetVersion`函数返回的系统版本号。 5. **释放DLL**:...

    WinAPI函数打包下载(VB精版)

    2. **传递参数**:VB中的数据类型可能与API函数所需的不完全匹配,因此需要进行适当的转换。例如,窗口句柄通常需要转换为Long类型。 3. **调用API函数**:在适当的地方调用已声明的API函数,并传入必要的参数。...

    WINDOWS下API 函数

    Windows API函数是开发者构建Windows应用程序的基础,涵盖了从用户界面到系统管理,再到硬件设备驱动的广泛领域。通过理解和熟练运用这些API,开发者可以充分利用系统的资源和特性。 标题“WINDOWS下API 函数”暗示...

    Winapi32函数说明

    7. **系统信息查询**:GetVersion、GetSystemTime、GetModuleHandle等函数,可以获取关于操作系统、当前时间、已加载模块等信息。 8. **网络通信**:Winsock库提供了如socket、bind、connect、send、recv等函数,...

    Windows API Windows API

    Windows API 包含了大量的功能模块,涵盖了从用户界面到系统底层操作的各种任务。 1. **网络函数**:这部分API主要用于处理网络相关的操作,如`WNetAddConnection`系列函数用于创建网络资源的连接,`...

    Visual Basic API函数参考手册_visualbasicapi_源码

    3. **调用API函数**:在VB代码中,如同调用普通VB函数一样调用API函数,传入所需参数。 4. **处理返回值**:API函数的返回值通常包含执行结果或错误信息,需要根据函数的文档来正确解读。 **常见API函数及用途** ...

    ExcelAPI网络函数库开发指南.pdf

    1. Fanyi:该函数负责翻译文本,支持从一个语言翻译到另一个指定的语言,例如从英语到中文。它可能支持变量输入,如译文、原文语言和目标语言。 2. GetBook:此函数用于获取有关书籍的信息,比如ISBN、书名、作者、...

    Win32API API函数 WindowsAPI函数

    这个API包含了丰富的功能,涵盖了从基本的窗口管理到复杂的网络通信、多媒体处理、系统安全等多个领域,是Windows平台开发的核心。 Win32API函数分为多个类别,如: 1. **用户界面**:这部分API负责创建、管理窗口...

    VB API函数参考手册

    2. **函数库引用**:API函数通常来自系统动态链接库(DLL),如`kernel32.dll`、`user32.dll`等。`Lib`关键字用于指定函数所在的库。 3. **函数参数**:API函数的参数类型多种多样,包括数值、字符串、指针等。VB中...

    教案常用API函数参数分析.pdf

    2. `CopyFile`:用于复制输入法文件到相应的系统目录。 3. `RegCreateKeyEx`和`RegSetValueEx`:创建或修改注册表项,以注册新安装的输入法。 4. `RegCloseKey`:关闭已打开的注册表键。 通过结合使用这些API函数,...

    Windows API函数大全

    这些函数涵盖了从用户界面操作到系统级服务的广泛功能,是开发者理解和控制Windows操作系统的核心工具。 《Windows API函数大全》可能是由一系列文档或教程组成的资源,通过文件名如"Windows API函数大全4.txt"、...

    windows api函数大全

    这些函数提供了与操作系统交互的基础,涵盖了从图形用户界面(GUI)编程到系统管理、网络通信、硬件控制等多个领域。在Windows开发中,熟练掌握API函数是至关重要的。 Windows API函数大全通常包括以下关键领域的...

Global site tag (gtag.js) - Google Analytics