神奇的汇编(九)

时间:2021-04-24 06:10:33

版本信息是通过rc.exe编译器编译在资源里面的,它的格式大概是这样
VS_VERSION_INFO VERSIONINFO
 FILEVERSION 1,0,0,1
 PRODUCTVERSION 1,0,0,1
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "080403a8"
        BEGIN
            VALUE "CompanyName", "TODO: <公司名>"
            VALUE "FileDescription", "TODO: <文件说明>"
            VALUE "FileVersion", "1.0.0.1"
            VALUE "InternalName", "QQLike2.exe"
            VALUE "LegalCopyright", "TODO: (C) <公司名>。保留所有权利。"
            VALUE "OriginalFilename", "QQLike2.exe"
            VALUE "ProductName", "TODO: <产品名>"
            VALUE "ProductVersion", "1.0.0.1"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x804, 936
    END
END

BEGIN上面的部分是版本信息的固有属性,BEGIN里面叫做信息块

要获取文件中的版本信息其实很简单
1.通过GetFileVersionInfoSize函数检查文件中是否有版本信息
  invoke GetFileVersionInfoSize,addr szFile,NULL
2.通过GetFileVersionInfo来获取版本信息
   invoke GetFileVersinoInfo,add szFile,NULL,sizeof dbVerInfo,addr dbVerInfo
3.通过VerQueryValue来“解释”上面返回的字符串
  invoke VerQueryValue,addr dbVerInfo,addr szRoot,addr lpBuffer,addr dwLen
这个函数会返回一个VS_FIXEDFILEINFO结构,这个结构中有定义的固定属性内容。