`
driftcloudy
  • 浏览: 130696 次
  • 性别: 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

 

 

 

 

 

分享到:
评论

相关推荐

    Addr Func Converter0.2.1汉化版(函数及地址转换器)

    2 - 第二例处理的选择(从它的地址检索函数名称) -------------------------------------------------- 键入此信息: user32.dll中的DLL名称: 函数地址:77D504EA 其结果将是(对我来说): 函数名称:...

    API之网络函数---整理网络函数及功能

    API之网络函数1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一...

    getVersion(3)

    getVersion(3)

    system-info:关于服务器的信息

    系统(服务器)信息 - system-info 关于您的服务器的信息。 支持的操作系统: ... $ system :: getVersion (); . . . $ system :: getUptime (); 通过 Composer 安装 "require": { ... "intpp

    aioaria2:围绕aria2-json-rpc的asyncawait包装器

    aioaria2 提供aria2异步客户端通信 提供与aria2异步通信的客户端与管理aria2进展的服务端 使用方法: 示例 import asyncio from pprint import pprint import aioaria2 async def main (): async with aioaria2 . ...

    Unit的并行测试PHP类库.zip

     parent::__construct(static::NAME, VersionProvider::getVersion(static::VERSION));  }  public function doRun(InputInterface $input, OutputInterface $output)  {  $this->add(new ...

    PackageVersions:Composer插件可有效获取已安装软件包的版本号

    $ version = \ PackageVersions \ Versions :: getVersion ( 'ocramius/package-versions' );var_dump ( $ version ); // 1.0.0@0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33安装composer require ocramius/package-...

    GetVersionEx.rar_GetVersionEx_getversion_vc GetVersion_操作系统版本_系统

    GetVersionEx,获取Windows操作系统版本的例子。

    Building a JSON web service with Java and Axis2

    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托盘程序

    其实,在任务条上添加托盘比较容易实现,调用VC中的函数就可以解决,只是注意协调。接下来,我将给大家提供一个类,可以很容易的达到我们的目的,希望它能给大家一点帮助,如果你发现BUG也欢迎你和我联系。运行程序...

    C/S模式程序自动升级功能,嵌入自己的程序就可以使用。

    if (MessageBox.Show("当前应用版本为:" + GetVersion + "\n\r需要升级到:" + DT.Rows[0]["Version"].ToString() + "\n\r" + DT.Rows[0]["Message"].ToString() + "\n\r点击“Yes”开始升级...", "升级提示", ...

    error C4996

    使用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 ...

    NSIS安装包制作工具

    Dialogs : 调用打开、保存文档框等命令 DumpLog : 记录安装日志插件 EBanner : EBanner 插件 EmbeddedLists : 使用INI+此插件可使NSIS显示列表视图和树视图控件 EnumCDs : 枚举CD驱动器插件 EnumINI : 枚举INI值插件...

    get version from vs or vc

    from codeguru 共两个工程 VersionInfo GetVersionInfo

    java-servlet-api.doc

    当你的应用存储数据到Session中,或从Session中清除数据,Servlet都会通过HttpSessionBindingListener检杳什么类被绑定或被取消绑定。这个接口的方法会通报被绑定或被取消绑定的对象。 绪言 这是一份关于2.1版...

    appium-xcode:Xcode相关实用程序。 获取版本号和可执行文件的路径

    大多数函数都是已记忆的,因此,一旦调用它们,它们将简单地返回相同的值。 请记住,多次调用require()返回模块的相同实例化(如果已被实例化),因此该备注将保留在同一项目中的多个文件中。 某些功能内置有自动...

    TICQconnection & ICQ_API(full_source)

    ICQAPICall_GetVersion12. ICQAPICall_GetWindowHandle // Version 1.0001 13. ICQAPICall_GetOnlineListType14. ICQAPICall_GetGroupOnlineListDetails15. ICQAPICall_SetOwnerState16. ICQAPICall_...

    语义版本号库PHP-Version.zip

    $builder = Parser::toBuilder('1.2.3-alpha 2'); $builder->incrementMajor(); $builder->clearBuild(); $builder->clearPreRelease(); echo Dumper::toString($builder); // echoes "2.0.0" $...

    java中生成EXCEL文件的例子

    在Java开发中用于生成并导出excel文件的源代码实例,提供给大家交流学习。

    C++获取程序版本信息

    通过代码获得程序资源中VS_VERSION_INFO所有信息。

Global site tag (gtag.js) - Google Analytics