Skip to content

Instantly share code, notes, and snippets.

@bbayles
Last active May 7, 2025 12:26
Show Gist options
  • Save bbayles/9fe50cea675957d224bc49b944fadb9d to your computer and use it in GitHub Desktop.
Save bbayles/9fe50cea675957d224bc49b944fadb9d to your computer and use it in GitHub Desktop.
The Lost World: Jurassic Park (Saturn) - password solver
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