[-] mjhelto@lemm.ee 1 points 3 weeks ago

Identity politics: Newt Gingrich's lasting legacy for the country!

[-] mjhelto@lemm.ee 1 points 2 months ago

Don't think I've ever picked out harder while taking a shit! 🤘

[-] mjhelto@lemm.ee 1 points 2 months ago

That would be pretty boss of you. Thanks for being helpful on the past and considering leaving that help available to all!

::6 months later::

Reddit announces users need to log in to view posts and comments

Fffffffffff

[-] mjhelto@lemm.ee 1 points 2 months ago

I'll take a look again. Thanks!

[-] mjhelto@lemm.ee 1 points 5 months ago

And better working conditions. If in the US, they probably had better healthcare, also!

[-] mjhelto@lemm.ee 1 points 7 months ago* (last edited 6 months ago)

Interestingly enough, I did the same thing. When it launched, I was big into piracy and had a shitty job to pay for games with. Played until I could fly the ship, flew into the sky, then promptly lost control of my ship and didn't touch it again for at least half a decade. So glad I bought it and played it without spoilers!

[-] mjhelto@lemm.ee 1 points 10 months ago

If I could upvote you more than once, I would! Thank you for the info!!

[-] mjhelto@lemm.ee 1 points 10 months ago

The Basekey

The basekey is where we must handle timestamps and several validation checks. Consider the binary representation of the sample 0x090a1452e822bd05:

binary basekey (above) and indices for reference (below):
0000 1001 0000 1010 0001 0100 0101 0010 1110 1000 0010 0010 1011 1101 0000 0101
b0   b3   b7   b11  b15  b19  b23  b27  b31  b35  b39  b43  b47  b51  b55  b59  b63

Timestamps

Timestamp are encoded as a single byte comprised of bits indexed at b56,51,42,37,28,23,14,9 from the basekey. In this example, the timestamp is 01100010 or 0x62 or 98.

The timestamp represents the number of fortnights that have passed since Christmas Day, 2000 Eastern time, modulo 256 to fit in one byte. For example, 98 fortnights places the code at approximately October 2004.

Stored as a single byte, there are 256 unique timestamps. This is 512 weeks or about 10 years. Yes, this means that a code's validity rotates approximately once every decade.

After the code's timestamp is read, it is subtracted from the current timestamp (generated from the system clock or network time server if available). The difference must be less than 2, so codes are valid for 4 weeks or about a month at a time.

Of note, Pillars of Garendall has a bug in which the modulo is not taken correctly, so the timestamp corresponding to 0xFF is valid without expiry.

Validity Check

The last three bits, b60-63, contain the sum of all other 3-bit chunks in the basekey, modulo 7. Without the correct number in these bits, the result will be considered invalid.

To this point, we have covered sufficient material to renew licenses. The timestamp can be changed, the last three bits updated, the result XOR'd with the userkey, and finally, the code converted from binary to text.

Factors for Basekey Generation

I was next curious about code generation. For the purposes of this write-up, I have not fully reverse engineered the basekey, only duplicated the aspects which are used for validation. This yields functional keys, just not genuine ones. If the authors of the EV: Nova renewal bot have fully reversed the algorithm, perhaps they will one day share the steps to genuine basekey creation.

One aspect validated by the registration app is that the licensee name, number, and game name can be modified to yield a set of base factors. These are then multiplied by some number and written into the basekey. We do not need the whole algorithm; we simply must check that the corresponding regions in the basekey are multiples of the appropriate factors.

The regions of note in the basekey are f1 = b5-9,47-51,33-37,19-23, f2 = b43-47,29-33,15-19,57-61, and f3 = b24-28,10-14,52-56,38-42. The top 5 bits and f3 are never actually checked, so they can be ignored.

Considering f1 and f2, the values in the sample basekey are 0x25DA and 0x1500, respectively. The base factors are 0x26 and 0x1C, which are multiples by 0xFF and 0xC0, respectively.

Rather than analyze the code in detail, I wrote a small script to translate over the disassembled PPC to Python wholesale. It is sufficient for generating keys to EV: Nova, using the perfectly-valid multiple of 1x, but I have found it fails for other v2 products.

[-] mjhelto@lemm.ee 1 points 11 months ago

Wat? The? Fuck? I have no idea what kind of mental gymnastics is happening here.

[-] mjhelto@lemm.ee 1 points 1 year ago

I don't think I've seen a picture that I more wanted to visit. This looks amazing!

[-] mjhelto@lemm.ee 1 points 1 year ago

What exactly could a president do? They aren't kings despite what some would think.

view more: ‹ prev next ›

mjhelto

joined 1 year ago