122 lines
3.5 KiB
Python
122 lines
3.5 KiB
Python
# Shared interface
|
|
def AsUTF8(s):
|
|
return s if sys.version_info[0] > 2 else s.encode('utf-8')
|
|
|
|
def ParseAddress(d):
|
|
return int(d['virtualAddress'], 0)
|
|
|
|
def DefineILMethod(jsonDef):
|
|
addr = ParseAddress(jsonDef)
|
|
SetName(addr, AsUTF8(jsonDef['name']))
|
|
SetFunctionType(addr, AsUTF8(jsonDef['signature']))
|
|
SetHeaderComment(addr, AsUTF8(jsonDef['dotNetSignature']))
|
|
|
|
def DefineILMethodInfo(jsonDef):
|
|
addr = ParseAddress(jsonDef)
|
|
SetName(addr, AsUTF8(jsonDef['name']))
|
|
SetType(addr, r'struct MethodInfo *')
|
|
SetComment(addr, AsUTF8(jsonDef['dotNetSignature']))
|
|
|
|
def DefineCppFunction(jsonDef):
|
|
addr = ParseAddress(jsonDef)
|
|
SetName(addr, AsUTF8(jsonDef['name']))
|
|
SetFunctionType(addr, AsUTF8(jsonDef['signature']))
|
|
|
|
def DefineString(jsonDef):
|
|
addr = ParseAddress(jsonDef)
|
|
SetName(addr, AsUTF8(jsonDef['name']))
|
|
SetType(addr, r'struct String *')
|
|
SetComment(addr, AsUTF8(jsonDef['string']))
|
|
|
|
def DefineFieldFromJson(jsonDef):
|
|
DefineField(jsonDef['virtualAddress'], jsonDef['name'], jsonDef['type'], jsonDef['dotNetType'])
|
|
|
|
def DefineField(addr, name, type, ilType = None):
|
|
addr = int(addr, 0)
|
|
SetName(addr, AsUTF8(name))
|
|
SetType(addr, AsUTF8(type))
|
|
if (ilType is not None):
|
|
SetComment(addr, AsUTF8(ilType))
|
|
|
|
# Process JSON
|
|
def ProcessJSON(jsonData):
|
|
|
|
# Method definitions
|
|
print('Processing method definitions')
|
|
for d in jsonData['methodDefinitions']:
|
|
DefineILMethod(d)
|
|
|
|
# Constructed generic methods
|
|
print('Processing constructed generic methods')
|
|
for d in jsonData['constructedGenericMethods']:
|
|
DefineILMethod(d)
|
|
|
|
# Custom attributes generators
|
|
print('Processing custom attributes generators')
|
|
for d in jsonData['customAttributesGenerators']:
|
|
DefineCppFunction(d)
|
|
|
|
# Method.Invoke thunks
|
|
print('Processing Method.Invoke thunks')
|
|
for d in jsonData['methodInvokers']:
|
|
DefineCppFunction(d)
|
|
|
|
# String literals for version >= 19
|
|
print('Processing string literals')
|
|
if 'virtualAddress' in jsonData['stringLiterals'][0]:
|
|
for d in jsonData['stringLiterals']:
|
|
DefineString(d)
|
|
|
|
# String literals for version < 19
|
|
else:
|
|
litDecl = 'enum StringLiteralIndex {\n'
|
|
for d in jsonData['stringLiterals']:
|
|
litDecl += " " + AsUTF8(d['name']) + ",\n"
|
|
litDecl += '};\n'
|
|
DefineCode(litDecl)
|
|
|
|
# Il2CppClass (TypeInfo) pointers
|
|
print('Processing Il2CppClass (TypeInfo) pointers')
|
|
for d in jsonData['typeInfoPointers']:
|
|
DefineFieldFromJson(d)
|
|
|
|
# Il2CppType (TypeRef) pointers
|
|
print('Processing Il2CppType (TypeRef) pointers')
|
|
for d in jsonData['typeRefPointers']:
|
|
DefineField(d['virtualAddress'], d['name'], r'struct Il2CppType *', d['dotNetType'])
|
|
|
|
# MethodInfo pointers
|
|
print('Processing MethodInfo pointers')
|
|
for d in jsonData['methodInfoPointers']:
|
|
DefineILMethodInfo(d)
|
|
|
|
# Function boundaries
|
|
print('Processing function boundaries')
|
|
for d in jsonData['functionAddresses']:
|
|
MakeFunction(int(d, 0))
|
|
|
|
# IL2CPP type metadata
|
|
print('Processing IL2CPP type metadata')
|
|
for d in jsonData['typeMetadata']:
|
|
DefineField(d['virtualAddress'], d['name'], d['type'])
|
|
|
|
# IL2CPP function metadata
|
|
print('Processing IL2CPP function metadata')
|
|
for d in jsonData['functionMetadata']:
|
|
DefineCppFunction(d)
|
|
|
|
# IL2CPP API functions
|
|
print('Processing IL2CPP API functions')
|
|
for d in jsonData['apis']:
|
|
DefineCppFunction(d)
|
|
|
|
# Entry point
|
|
print('Generated script file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty')
|
|
CustomInitializer()
|
|
|
|
with open(os.path.join(GetScriptDirectory(), "%JSON_METADATA_RELATIVE_PATH%"), "r") as jsonFile:
|
|
jsonData = json.load(jsonFile)['addressMap']
|
|
ProcessJSON(jsonData)
|
|
|
|
print('Script execution complete.')
|