Akebi-GC/cheat-library/res/scripts/saved_offsets_to_static.py

71 lines
2.4 KiB
Python
Raw Normal View History

2022-05-17 00:13:41 +00:00
import json
import re
def update_checksums(file_name: str, modules: dict):
checksums = {
"game_version": input("Input version: "),
"modules": {}
}
for moduleName, moduleData in modules.items():
checksums["modules"][moduleName] = moduleData["hash"]
with open(file_name, "w") as file:
json.dump(checksums, file, indent=2)
def apply_offsets(file_name: str, pattern: re.Pattern[str], offsets: dict, reverse_order=False):
with open(file_name) as file:
lines = file.readlines()
for i, line in enumerate(lines):
m = pattern.match(line)
if m is None:
continue
filtered_groups = (group for group in m.groups() if group is not None)
if reverse_order:
name, prev_offset = filtered_groups
else:
prev_offset, name = filtered_groups
if name not in offsets:
print(f"Not found offset for {name}")
continue
offset = offsets[name]
if int(offset, 16) != 0:
lines[i] = line.replace(prev_offset, f"{int(offset, 16):08X}")
with open(file_name, "w") as file:
file.writelines(lines)
def process():
with open("saved_offsets.json") as saved_offsets_file:
content = json.load(saved_offsets_file)
api_pattern = re.compile(r"#define *([\w\d_]+)_ptr *0x([A-Fa-f\d]+)")
apply_offsets("../../src/appdata/il2cpp-api-functions-ptr.h", api_pattern, content["apiFunctions"], True)
typedef_pattern = re.compile(r"(?:DO_TYPEDEF\(|DO_SINGLETONEDEF\() *0x([A-Fa-f\d]+), *([\w\d_]+) *\);")
apply_offsets("../../src/appdata/il2cpp-types-ptr.h", typedef_pattern, content["typeInfo"])
function_pattern = re.compile(r"DO_APP_FUNC *(?:\(|_METHODINFO\() *(?:0x|)([A-Fa-f\d]+),"
r"(?:[^,]+, *([\w\d_]+), | *([\w\d_]+) *)")
method_info_offsets: dict = content["methodInfo"]
apply_offsets("../../src/appdata/il2cpp-functions.h", function_pattern,
dict(content["moduleInfo"]["UserAssembly.dll"]["functions"], **method_info_offsets))
apply_offsets("../../src/appdata/il2cpp-unityplayer-functions.h", function_pattern,
dict(content["moduleInfo"]["UnityPlayer.dll"]["functions"], **method_info_offsets))
update_checksums("../assembly_checksum.json", content["moduleInfo"])
if __name__ == "__main__":
process()