[Bug 27349] SafeDisc v2.x API entry analyzer flags Wine's user32.dll as "bad" (too many exports with PIC loads in prolog code) (SimCity 4, IL-2 FB, NFSU)

wine-bugs at winehq.org wine-bugs at winehq.org
Mon Jul 11 16:36:26 CDT 2011


http://bugs.winehq.org/show_bug.cgi?id=27349

--- Comment #14 from Anastasius Focht <focht at gmx.net> 2011-07-11 16:36:25 CDT ---
Hello,

--- quote ---
the attached patch might work if used for more functions, the question is if
it's clean enough.
--- quote ---

well I used the clever hint from Morten Welinder
(http://bugs.winehq.org/show_bug.cgi?id=10273#c35) to modify user32 makefile
rule, force NOP-padding where needed:

Examples:

--- snip ---
user32.WaitForInputIdle:
6878869A     89E5            MOV EBP,ESP
6878869C     53              PUSH EBX
6878869D     81EC E4000000   SUB ESP,0E4
687886A3     90              NOP
687886A4     90              NOP
687886A5     90              NOP
687886A6     90              NOP
687886A7     E8 8B10F9FF     CALL 68719737
687886AC     81C3 48590600   ADD EBX,65948
...
--- snip ---

--- snip ---
user32.SetKeyboardState:
6875F2E0     55              PUSH EBP
6875F2E1     89E5            MOV EBP,ESP
6875F2E3     56              PUSH ESI
6875F2E4     53              PUSH EBX
6875F2E5     81EC B0000000   SUB ESP,0B0
6875F2EB     90              NOP
6875F2EC     90              NOP
6875F2ED     90              NOP
6875F2EE     E8 44A4FBFF     CALL 68719737
6875F2F3     81C3 01ED0800   ADD EBX,8ED01
...
--- snip ---

Already hotpatch entry, remainder filled up with NOP:

--- snip ---
user32.GetKeyboardState:
6875F176     8BFF            MOV EDI,EDI
6875F178     55              PUSH EBP
6875F179     8BEC            MOV EBP,ESP
6875F17B     56              PUSH ESI
6875F17C     53              PUSH EBX
6875F17D     81EC C0000000   SUB ESP,0C0
6875F183     90              NOP
6875F184     90              NOP
6875F185     E8 ADA5FBFF     CALL 68719737
6875F18A     81C3 6AEE0800   ADD EBX,8EE6A
...
--- snip ---

--- quote ---
btw. you said safedisc checks the first 8 instructions, so i inserted 8 nops,
but why do we use 9 nops in winebuild for stubs?
--- quote ---

After having some drinks (I'm still investigating bug 27162 in my spare time) I
came up with the following theory:

I already posted a snippet for 8 NOP sequence in bug 10273 - though only for
relay thunks (stats gathering).
I first intended to use 8 LOLs for illustration but somehow forgot about it.
Later I realized my mistake - but it was too late.
Now it would be difficult to reuse this ingenious sequence - which took many
hours to develop - elsewhere (originating author).
You know the rules... Don't talk about the club ... err, that was something
different ;-)

AJ gave it a thought and came up with a solution: creating stub entry points
with 9 NOPs gives a whole new meaning.
More space is used in the resulting binary, the compile time increases, the
entropy is different, the shape of the space-time continuum is bent and
distorted even more by the mere presence of this additional NOP ... did I
forgot something?

Oh well I forgot ... you wanted new user32 stats with the padding ... here you
go:

    kernel32   user32      gdi32       condition (cx < threshold)
--------------------------------------------------------------------
c1:  0x44       0x03        0x50        0x5F
c2:  0x2B       0x00        0x39        0x3C
c3:  0x00       0x00        0x00        0x5A

Lovely, isn't it? ;-)

$ wine --version
wine-1.3.24-42-g4ebbd0e

Regards

-- 
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
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