Compare commits

..

No commits in common. "aa1a19d675f55d82d5b92e0a4d97a06bae57480b" and "0553d812f8a2e0f74fe2d3337c898568d8263be6" have entirely different histories.

2 changed files with 10 additions and 19 deletions

BIN
notes.md

Binary file not shown.

View File

@ -8,10 +8,9 @@ import struct
class OFFSETS: class OFFSETS:
VERSION = 0x42e VERSION = 0x42e
KEYS_LABEL = 0x12DB # These are not static KEYS_LABEL = 0x12DB
KEYS_VALUE = 0x12F9 # These are not static KEYS_VALUE = 0x12F9
ACCOUNT_LEVEL = 0x12AD # These are not static ACCOUNT_LEVEL = 0x12AD
START_OF_OPTIONS = 0x42a # This appears to be static across multiple saves
def _bytes_to_string(bytes): def _bytes_to_string(bytes):
@ -37,10 +36,8 @@ def get_key_value(save):
def verify_save(save): def verify_save(save):
try: try:
struct.unpack("<sssss", save[:5]) == "GVAS" struct.pack("bbbb", *save[:4]) == b"GVAS"
size = read_int_at_offset(save, OFFSETS.START_OF_OPTIONS) token = _bytes_to_string(read_token_at_offset(save, OFFSETS.VERSION))
token = read_token_at_offset(save, OFFSETS.START_OF_OPTIONS + 4, size)
print(size)
if token == "CrabChampionsVersion": if token == "CrabChampionsVersion":
return True return True
except struct.error as e: except struct.error as e:
@ -48,18 +45,12 @@ def verify_save(save):
return False return False
def read_int_at_offset(save, offset):
try:
data = struct.unpack("<i", save[offset:offset + 4])
return data[0]
except struct.error:
return False
def read_token_at_offset(save, offset, size=1): def read_token_at_offset(save, offset, size=1):
try: try:
data = struct.unpack("s" * size, save[offset: offset + size]) data = struct.pack("b" * size, *save[offset: offset + size])
return "".join([c.decode() for c in data[:-1]]) if data[-1] != 0x00:
data = read_token_at_offset(save, offset, size + 1)
return data
except struct.error: except struct.error:
print("Failed to find NULL byte in token, probs not a token") print("Failed to find NULL byte in token, probs not a token")
return None return None
@ -77,6 +68,6 @@ else:
# Should be fine to do shit here # Should be fine to do shit here
# print(read_token_at_offset(save, 0x12DB)) # Keys # print(read_token_at_offset(save, 0x12DB)) # Keys
# print(read_token_at_offset(save, 0x12AD)) # AccountLevel # print(read_token_at_offset(save, 0x12AD)) # AccountLevel
token = read_token_at_offset(save, OFFSETS.KEYS_LABEL, 5) token = read_token_at_offset(save, OFFSETS.KEYS_LABEL)
# print(_bytes_to_string(token)) # print(_bytes_to_string(token))
print(f"You have {int.from_bytes(get_key_value(save))} keys") print(f"You have {int.from_bytes(get_key_value(save))} keys")