Rewrote token reader

Added bytes->string helper
This commit is contained in:
Benjamyn Love 2024-07-26 08:07:37 +10:00
parent 23156f1a47
commit da20e64b8c

View File

@ -1,6 +1,16 @@
import struct import struct
class OFFSETS:
VERSION = 0x42e
KEYS = 0x12DB
ACCOUNT_LEVEL = 0x12AD
def _bytes_to_string(bytes):
return str(bytes.split(b"\x00")[0].decode())
def load_save(save_file_name): def load_save(save_file_name):
try: try:
with open(save_file_name, "rb") as f: with open(save_file_name, "rb") as f:
@ -13,26 +23,22 @@ def load_save(save_file_name):
def verify_save(save): def verify_save(save):
try: try:
struct.pack("bbbb", *save[:4]) == b"GVAS" struct.pack("bbbb", *save[:4]) == b"GVAS"
# This I think just means we have an unreal engine save but for now it should suffice token = _bytes_to_string(read_token_at_offset(save, OFFSETS.VERSION))
return True if token == "CrabChampionsVersion":
return True
except struct.error: except struct.error:
return False return False
def read_token_at_offset(save, offset): def read_token_at_offset(save, offset, size=1):
# Load the first 16 bytes from the offset
try: try:
data = struct.pack("b" * 9, *save[offset : offset + 9]) data = struct.pack("b" * size, *save[offset: offset + size])
if data[-1] == 0x00: if data[-1] != 0x00:
return str(data.split(b"\x00")[0].decode()) data = read_token_at_offset(save, offset, size + 1)
else: return data
data = struct.pack("b" * 16, *save[offset : offset + 16]) except struct.error:
if data[-1] == 0x00: print("Failed to find NULL byte in token, probs not a token")
return str(data.split(b"\x00")[0].decode()) return None
else:
return None
except struct.error as e:
print(f"Failed to parse data: {e}")
save = load_save("./test.sav") save = load_save("./test.sav")
@ -41,9 +47,11 @@ if verify_save(save):
print("Save appears to be a save file of some kind") print("Save appears to be a save file of some kind")
else: else:
print("The fuck is this shit mate") print("The fuck is this shit mate")
exit()
# 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
print(read_token_at_offset(save, 0x1329)) # AccountLevel token = read_token_at_offset(save, OFFSETS.KEYS)
print(_bytes_to_string(token))