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.
83 lines
2.5 KiB
83 lines
2.5 KiB
# -*- coding: utf-8 -*-
|
|
import json
|
|
|
|
processFields = [
|
|
"ScriptMethod",
|
|
"ScriptString",
|
|
"ScriptMetadata",
|
|
"ScriptMetadataMethod",
|
|
"Addresses",
|
|
]
|
|
|
|
functionManager = currentProgram.getFunctionManager()
|
|
baseAddress = currentProgram.getImageBase()
|
|
USER_DEFINED = ghidra.program.model.symbol.SourceType.USER_DEFINED
|
|
|
|
def get_addr(addr):
|
|
return baseAddress.add(addr)
|
|
|
|
def set_name(addr, name):
|
|
name = name.replace(' ', '-')
|
|
createLabel(addr, name, True, USER_DEFINED)
|
|
|
|
def make_function(start, end):
|
|
next_func_start = getFunctionAfter(start).getEntryPoint()
|
|
if next_func_start < end:
|
|
end = next_func_start
|
|
body = createAddressSet()
|
|
body.addRange(start, end.subtract(1))
|
|
functionManager.deleteAddressRange(start, end.subtract(1), getMonitor())
|
|
func = getFunctionAt(start)
|
|
if func is None:
|
|
functionManager.createFunction(None, start, body, USER_DEFINED)
|
|
else:
|
|
func.setBody(body)
|
|
|
|
f = askFile("script.json from Il2cppdumper", "Open")
|
|
data = json.loads(open(f.absolutePath, '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)
|
|
|
|
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)
|
|
createLabel(addr, name, True, USER_DEFINED)
|
|
setEOLComment(addr, value)
|
|
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)
|
|
setEOLComment(addr, name)
|
|
|
|
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)
|
|
setEOLComment(addr, name)
|
|
|
|
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!'
|
|
|