71 lines
2.4 KiB
Python
71 lines
2.4 KiB
Python
|
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()
|