I was curious what exactly this fix is doing, so I compared the values they said what to look for vs what to change. Funnily enough, it's a single byte:
Code:
75 30 33 C9 B8 01 00 00 00 0F A2 8B C8 C1 F9 08
EB 30 33 C9 B8 01 00 00 00 0F A2 8B C8 C1 F9 08
The first byte (the two hex digits) is the only thing different. This makes me think all the changed was an opcode. Curious I was wondering from which to which, and what I can gather from
a listing on Wikipedia, the closest matches I could find are:
PCMPEQW xmm1, xmm2/m128 | 66 0F 75 /r | Compare packed words for equality. |
POR xmm1, xmm2/m128 | 66 0F EB /r | Bitwise OR |
Looking up these instructions, the first one compares a bunch of bytes in one place to a bunch of bytes of another. If they match, it sets all of the bytes in the first bunch of bytes to 0xFF (or a bit-wise 1 fill), 0 otherwise. The second does a bitwise OR operation on one bunch of bytes with another and stores the result in first bunch of bytes. My guess is the next instruction in the slot is "are the bunch of bytes we compared not all 0?" or something similar. If it's that, then doing a bitwise OR beforehand will always result in a pass because what's being looked for isn't all 0's and no production CPU is going to have all 0's in its CPUID fields.
The choice of using an SSE instruction makes me scratch my head a little, but I guess they're being specific about what to look for and maybe it's faster to do a vector operation on it.
Note that I haven't looked at the actual executable with a hex editor to verify if the two bytes before what they said to change is 66 0F. I'm just bored.
EDIT: to put this in a programming language or something, the change is something like this
Code:
if (cpuid == "bulldozer")
to
This will always pass.