there's nothing more fun, as a reverse engineer, then checking into a DLL to see about cracking it (it's been out of support since the Clinton administration, so I have to) and just seeing "validate_license" as an exported symbol.

GEE I WONDER WHERE I SHOULD START LOOKING

maybe next time they can just put in a validate_serial_number and check_if_serial_number_is_correct function

oh great it's right next to a string buffer labeled "verify_password"

I'm sure that'll come in handy

oh my god

I think this is even easier than I thought.

So the function looks basically like this:
validate_authorization_code (serial_number, expiration_date, max_users, authorization_code), right?

and it takes the serial number and expiration_date and max_users and confirms the authorization_code matches some hash or something to make sure it fits those serial numbers and expiration_date and max_users

now a sensible way to do this would be to combine all these values into some complex hashing function and return if it matches some algorithm

a less sensible way to do this would be to have validate_authorization_code be implemented like this:

correct_authorization_code = generate_authorization_code(serial, expiration, max_users);
return strcmp(correct_authorization_code, authorization_code) == 0;

GUESS WHICH ONE THEY DID?
so I don't really even need to crack this. I can just use their own code to generate my own serial numbers.
or to be more specific: I can just make up my own serial numbers (69420 it is!) and then generate an authorization code that says that's a valid serial

the authorization_code generator has an "encrypt" parameter that does some simple XORing

this code passes 0 for it, so that's not even turned on

time to hack a DLL in a hexeditor!
this DLL would be better if it had more 0x90s in it
@foone this is true of so much software!