[Bug 24159] Windows Sysinternals 'sigcheck -a' outputs garbage for 'WoW.exe' version info 'comments' (version info 'null' values need special treatment)

wine-bugs at winehq.org wine-bugs at winehq.org
Sun Jul 27 07:36:21 CDT 2014


https://bugs.winehq.org/show_bug.cgi?id=24159

Anastasius Focht <focht at gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |focht at gmx.net
            Summary|sigcheck -a outputs garbage |Windows Sysinternals
                   |in comments for WoW.exe     |'sigcheck -a' outputs
                   |                            |garbage for 'WoW.exe'
                   |                            |version info 'comments'
                   |                            |(version info 'null' values
                   |                            |need special treatment)

--- Comment #4 from Anastasius Focht <focht at gmx.net> ---
Hello folks,

confirming.

The 'wow.exe' binary can be downloaded here (no need for full game install):

http://filebeam.com/4fb29bad4de4f6d82f2ea26538335a80

Version info resource dumped with 'Resource hacker' tool:

--- snip ---
1 VERSIONINFO
FILEVERSION 3,3,5,12340
PRODUCTVERSION 3,3,0,0
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
    BLOCK "000004b0"
    {
        VALUE "Comments", ""
        VALUE "CompanyName", "Blizzard Entertainment"
        VALUE "FileDescription", "World of Warcraft Retail"
        VALUE "FileVersion", "3, 3, 5, 12340"
        VALUE "InternalName", "World of Warcraft"
        VALUE "LegalCopyright", "Copyright © 2004"
        VALUE "LegalTrademarks", ""
        VALUE "OriginalFilename", "WoW.exe"
        VALUE "PrivateBuild", ""
        VALUE "ProductName", "World of Warcraft"
        VALUE "ProductVersion", "Version 3.3"
        VALUE "SpecialBuild", ""
    }
}

BLOCK "VarFileInfo"
{
    VALUE "Translation", 0x0000 0x04B0
}
}
--- snip ---

Source:
http://source.winehq.org/git/wine.git/blob/05b3d7b69bf183ef879dc42bd11c65923025a910:/dlls/version/version.c#l566

--- snip ---
566 typedef struct
567 {
568     WORD wLength;
569     WORD wValueLength;
570     WORD wType; /* 1:Text, 0:Binary */
571     WCHAR szKey[1];
572 #if 0 /* variable length structure */
573     /* DWORD aligned */
574 BYTE Value[];
575     /* DWORD aligned */
576     VS_VERSION_INFO_STRUCT32 Children[];
577 #endif
578 } VS_VERSION_INFO_STRUCT32;
579
580 #define VersionInfoIs16( ver ) \
581     ( ((const VS_VERSION_INFO_STRUCT16 *)ver)->szKey[0] >= ' ' )
582
583 #define DWORD_ALIGN( base, ptr ) \
584     ( (LPBYTE)(base) + ((((LPBYTE)(ptr) - (LPBYTE)(base)) + 3) & ~3) )
585
586 #define VersionInfo16_Value( ver ) \
587     DWORD_ALIGN( (ver), (ver)->szKey + strlen((ver)->szKey) + 1 )
588 #define VersionInfo32_Value( ver ) \
589     DWORD_ALIGN( (ver), (ver)->szKey + strlenW((ver)->szKey) + 1 )
--- snip ---

Annotated memory dump of 'comments' block and follow up (returned by
'VersionInfo32_FindChild'):

--- snip ---
004622C0  00000018  .... ; wLength = 0x18, wValueLength=0
004622C4  00430001  ..C. ; wType=1 (text), szKey[]
004622C8  006D006F  o.m.
004622CC  0065006D  m.e.
004622D0  0074006E  n.t.
004622D4  00000073  s...
004622D8  0017004E  N... ; wLength = 0x4E, wValueLength=0x17
004622DC  00430001  ..C. ; wType=1 (text), szKey[]
004622E0  006D006F  o.m.
004622E4  00610070  p.a.
004622E8  0079006E  n.y.
004622EC  0061004E  N.a.
004622F0  0065006D  m.e.
004622F4  00000000  ....
004622F8  006C0042  B.l.
004622FC  007A0069  i.z.
00462300  0061007A  z.a.
00462304  00640072  r.d.
00462308  00450020   .E.
0046230C  0074006E  n.t.
00462310  00720065  e.r.
00462314  00610074  t.a.
00462318  006E0069  i.n.
0046231C  0065006D  m.e.
00462320  0074006E  n.t.
00462324  00000000  ....
...
--- snip ---

Source:
http://source.winehq.org/git/wine.git/blob/05b3d7b69bf183ef879dc42bd11c65923025a910:/dlls/version/version.c#l922

Wine returns 0x004622D8 in *lplpBuffer which is the start of next block.
The application tries to stringify it, causing the garbage printout - even with
'info->wValueLength == 0'.

It seems "null" values are a special case and need to be treated differently.

In order to have the app see a single wide-char null terminator you need to
check if the value address returned from 'VersionInfo32_Value' is outside of
the current block (which is the case here) and instead return a pointer to
either the null terminator of the key string -> 0x004622D6 or to 'wValueLength'
-> 0x004622C2 (which could also serve as wide-char null "replacement" because
it's WORD type and has zero value).

Yes, both would violate the 32-bit alignment constraint for values but I don't
see other ways here to have the app looking at a null terminator which is
located within resource block boundaries.

$ sha1sum Sigcheck.zip 
9d2e414bc5d71a9d6162fb955474c60cc9086c03  Sigcheck.zip

$ du -sh Sigcheck.zip 
172K    Sigcheck.zip

$ wine --version
wine-1.7.23-2-g69e95ac

Regards

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.


More information about the wine-bugs mailing list