You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.8 KiB
88 lines
2.8 KiB
4 years ago
|
# -*- coding: utf-8 -*-
|
||
|
import json
|
||
|
|
||
|
processFields = [
|
||
|
"ScriptMethod",
|
||
|
"ScriptString",
|
||
|
"ScriptMetadata",
|
||
|
"ScriptMetadataMethod",
|
||
|
"Addresses",
|
||
|
]
|
||
|
|
||
|
imageBase = idaapi.get_imagebase()
|
||
|
|
||
|
def get_addr(addr):
|
||
|
return imageBase + addr
|
||
|
|
||
|
def set_name(addr, name):
|
||
|
ret = idc.set_name(addr, name, SN_NOWARN | SN_NOCHECK)
|
||
|
if ret == 0:
|
||
|
new_name = name + '_' + str(addr)
|
||
|
ret = idc.set_name(addr, new_name, SN_NOWARN | SN_NOCHECK)
|
||
|
|
||
|
def make_function(start, end):
|
||
|
next_func = idc.get_next_func(start)
|
||
|
if next_func < end:
|
||
|
end = next_func
|
||
|
if idc.get_func_attr(start, FUNCATTR_START) == start:
|
||
|
ida_funcs.del_func(start)
|
||
|
ida_funcs.add_func(start, end)
|
||
|
|
||
|
path = idaapi.ask_file(False, '*.json', 'script.json from Il2cppdumper')
|
||
|
hpath = idaapi.ask_file(False, '*.h', 'il2cpp.h from Il2cppdumper')
|
||
|
parse_decls(open(hpath, 'rb').read(), 0)
|
||
|
data = json.loads(open(path, 'rb').read().decode('utf-8'))
|
||
|
|
||
|
if "ScriptMethod" in data and "ScriptMethod" in processFields:
|
||
|
scriptMethods = data["ScriptMethod"]
|
||
|
for scriptMethod in scriptMethods:
|
||
|
addr = get_addr(scriptMethod["Address"])
|
||
|
name = scriptMethod["Name"].encode("utf-8")
|
||
|
set_name(addr, name)
|
||
|
signature = scriptMethod["Signature"].encode("utf-8")
|
||
|
if apply_type(addr, parse_decl(signature, 0), 1) == False:
|
||
|
print "apply_type failed:", hex(addr), signature
|
||
|
|
||
|
if "ScriptString" in data and "ScriptString" in processFields:
|
||
|
index = 1
|
||
|
scriptStrings = data["ScriptString"]
|
||
|
for scriptString in scriptStrings:
|
||
|
addr = get_addr(scriptString["Address"])
|
||
|
value = scriptString["Value"].encode("utf-8")
|
||
|
name = "StringLiteral_" + str(index)
|
||
|
idc.set_name(addr, name, SN_NOWARN)
|
||
|
idc.set_cmt(addr, value, 1)
|
||
|
index += 1
|
||
|
|
||
|
if "ScriptMetadata" in data and "ScriptMetadata" in processFields:
|
||
|
scriptMetadatas = data["ScriptMetadata"]
|
||
|
for scriptMetadata in scriptMetadatas:
|
||
|
addr = get_addr(scriptMetadata["Address"])
|
||
|
name = scriptMetadata["Name"].encode("utf-8")
|
||
|
set_name(addr, name)
|
||
|
idc.set_cmt(addr, name, 1)
|
||
|
if scriptMetadata["Signature"] is not None:
|
||
|
signature = scriptMetadata["Signature"].encode("utf-8")
|
||
|
if apply_type(addr, parse_decl(signature, 0), 1) == False:
|
||
|
print "apply_type failed:", hex(addr), signature
|
||
|
|
||
|
if "ScriptMetadataMethod" in data and "ScriptMetadataMethod" in processFields:
|
||
|
scriptMetadataMethods = data["ScriptMetadataMethod"]
|
||
|
for scriptMetadataMethod in scriptMetadataMethods:
|
||
|
addr = get_addr(scriptMetadataMethod["Address"])
|
||
|
name = scriptMetadataMethod["Name"].encode("utf-8")
|
||
|
methodAddr = get_addr(scriptMetadataMethod["MethodAddress"])
|
||
|
set_name(addr, name)
|
||
|
idc.set_cmt(addr, name, 1)
|
||
|
idc.set_cmt(addr, '{0:X}'.format(methodAddr), 0)
|
||
|
|
||
|
if "Addresses" in data and "Addresses" in processFields:
|
||
|
addresses = data["Addresses"]
|
||
|
for index in range(len(addresses) - 1):
|
||
|
start = get_addr(addresses[index])
|
||
|
end = get_addr(addresses[index + 1])
|
||
|
make_function(start, end)
|
||
|
|
||
|
print 'Script finished!'
|
||
|
|