-
-
Save bbayles/9fe50cea675957d224bc49b944fadb9d to your computer and use it in GitHub Desktop.
The Lost World: Jurassic Park (Saturn) - password solver
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from itertools import product | |
# AXXYAYXYYYXY 00454743 6 | |
# AYXYXXZXZZYY 005a2047 5 | |
# AYXYYYZYAYXY 00476547 14 | |
# AYYYXYXYYZYY 00594457 2 | |
# XAXYYYYYZXYY 0052554c 4 | |
# XXXXXXXXXXXX 00000000 11 | |
# XZXYXYYYZXYY 00525448 7 | |
# YXXYXYYYAYXY 00475441 8 | |
# YYXYAYXYYYXY 00454745 15* (invincibility) | |
# YYXYZXYYXZXY 00485245 0 | |
# YYXYZYYYZXYY 00525645 3 | |
# YZAXYZAXYXAX 00313939 10* (stage select) | |
# YZXYZAXYAAXY 004f4e49 9 | |
# ZAZYAXYYAZZY 006b536e 13 | |
# ZXYYYZXYXYXY 00444952 1 | |
# ZYAYAXXYXZAY 00784376 12* (limited arcade gallery) | |
A_TABLE = ( | |
0x00000003, | |
0x0000000C, | |
0x00000030, | |
0x000000C0, | |
0x00000300, | |
0x00000C00, | |
0x00003000, | |
0x0000C000, | |
0x00030000, | |
0x000C0000, | |
0x00300000, | |
0x00C00000, | |
) | |
X_TABLE = ( | |
0xFFFFFFFC, | |
0xFFFFFFF3, | |
0xFFFFFFCF, | |
0xFFFFFF3F, | |
0xFFFFFCFF, | |
0xFFFFF3FF, | |
0xFFFFCFFF, | |
0xFFFF3FFF, | |
0xFFFCFFFF, | |
0xFFF3FFFF, | |
0xFFCFFFFF, | |
0xFF3FFFFF, | |
) | |
Y_OR_TABLE = ( | |
0x00000001, | |
0x00000004, | |
0x00000010, | |
0x00000040, | |
0x00000100, | |
0x00000400, | |
0x00001000, | |
0x00004000, | |
0x00010000, | |
0x00040000, | |
0x00100000, | |
0x00400000, | |
) | |
Y_AND_TABLE = ( | |
0xFFFFFFFD, | |
0xFFFFFFF7, | |
0xFFFFFFDF, | |
0xFFFFFF7F, | |
0xFFFFFDFF, | |
0xFFFFF7FF, | |
0xFFFFDFFF, | |
0xFFFF7FFF, | |
0xFFFDFFFF, | |
0xFFF7FFFF, | |
0xFFDFFFFF, | |
0xFF7FFFFF, | |
) | |
Z_OR_TABLE = ( | |
0x00000002, | |
0x00000008, | |
0x00000020, | |
0x00000080, | |
0x00000200, | |
0x00000800, | |
0x00002000, | |
0x00008000, | |
0x00020000, | |
0x00080000, | |
0x00200000, | |
0x00800000, | |
) | |
Z_AND_TABLE = ( | |
0xFFFFFFFE, | |
0xFFFFFFFB, | |
0xFFFFFFEF, | |
0xFFFFFFBF, | |
0xFFFFFEFF, | |
0xFFFFFBFF, | |
0xFFFFEFFF, | |
0xFFFFBFFF, | |
0xFFFEFFFF, | |
0xFFFBFFFF, | |
0xFFEFFFFF, | |
0xFFBFFFFF, | |
) | |
# These are substrings of the phrase below (with _ characters for null bytes) | |
# THREEDIRTYDWARVESRULEZ GREGCORTHAGTACONIC199____AxCvUkSngGeGREGE | |
valid_passwords = [ | |
0x485245, | |
0x444952, | |
0x594457, | |
0x525645, | |
0x52554c, | |
0x5a2047, | |
0x454743, | |
0x525448, | |
0x475441, | |
0x4f4e49, | |
0x313939, | |
0x000000, | |
0x784376, | |
0x6b536e, | |
0x476547, | |
0x454745 | |
] | |
valid_passwords = {p: i for i, p in enumerate(valid_passwords)} | |
def encode_password(s): | |
n = 0x060FFB74 | |
for i, c in enumerate(s): | |
if c == 'A': | |
n |= A_TABLE[i] | |
elif c == 'X': | |
n &= X_TABLE[i] | |
elif c == 'Y': | |
n |= Y_OR_TABLE[i] | |
n &= Y_AND_TABLE[i] | |
elif c == 'Z': | |
n |= Z_OR_TABLE[i] | |
n &= Z_AND_TABLE[i] | |
else: | |
raise ValueError | |
return n & 0x00FFFFFF | |
if __name__ == '__main__': | |
for prod in product('AXYZ', repeat=12): | |
password = ''.join(prod) | |
n = encode_password(password) | |
if n in valid_passwords: | |
print(password, format(n, '08x'), valid_passwords[n]) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment