Compare commits
No commits in common. "da20e64b8c09f37302117d6cd44f677926d21f39" and "f298191374c4dc8f9a992c66c5572ead8f2f679f" have entirely different histories.
da20e64b8c
...
f298191374
9
.vscode/settings.json
vendored
9
.vscode/settings.json
vendored
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"editor.defaultFormatter": "ms-python.black-formatter",
|
|
||||||
"black-formatter.cwd": "${workspaceFolder}/src",
|
|
||||||
"editor.formatOnSave": true,
|
|
||||||
"html.format.enable": true,
|
|
||||||
"python.REPL.enableREPLSmartSend": false,
|
|
||||||
"black-formatter.args": ["--ignore=E203"],
|
|
||||||
"flake8.args": ["--ignore=E203"]
|
|
||||||
}
|
|
||||||
@ -1,16 +1,6 @@
|
|||||||
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:
|
||||||
@ -23,22 +13,26 @@ 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"
|
||||||
token = _bytes_to_string(read_token_at_offset(save, OFFSETS.VERSION))
|
# This I think just means we have an unreal engine save but for now it should suffice
|
||||||
if token == "CrabChampionsVersion":
|
return True
|
||||||
return True
|
|
||||||
except struct.error:
|
except struct.error:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def read_token_at_offset(save, offset, size=1):
|
def read_token_at_offset(save, offset):
|
||||||
|
# Load the first 16 bytes from the offset
|
||||||
try:
|
try:
|
||||||
data = struct.pack("b" * size, *save[offset: offset + size])
|
data = struct.pack("b" * 9, *save[offset : offset + 9])
|
||||||
if data[-1] != 0x00:
|
if data[-1] == 0x00:
|
||||||
data = read_token_at_offset(save, offset, size + 1)
|
return str(data.split(b"\x00")[0].decode())
|
||||||
return data
|
else:
|
||||||
except struct.error:
|
data = struct.pack("b" * 16, *save[offset : offset + 16])
|
||||||
print("Failed to find NULL byte in token, probs not a token")
|
if data[-1] == 0x00:
|
||||||
return None
|
return str(data.split(b"\x00")[0].decode())
|
||||||
|
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")
|
||||||
@ -47,11 +41,9 @@ 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
|
||||||
token = read_token_at_offset(save, OFFSETS.KEYS)
|
print(read_token_at_offset(save, 0x1329)) # AccountLevel
|
||||||
print(_bytes_to_string(token))
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user