From db1805cb12ed9d6fba58a0e55bd621681563c994 Mon Sep 17 00:00:00 2001 From: lifeengines Date: Tue, 22 Sep 2020 02:25:35 +0800 Subject: [PATCH] IDA: Optimize function creation (#75) --- .../Outputs/ScriptResources/Targets/Ghidra.py | 2 +- .../Outputs/ScriptResources/Targets/IDA.py | 12 ++++++++++-- .../Outputs/ScriptResources/shared-main.py | 13 +++++++++++-- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Il2CppInspector.Common/Outputs/ScriptResources/Targets/Ghidra.py b/Il2CppInspector.Common/Outputs/ScriptResources/Targets/Ghidra.py index 68f5e8b..350dc87 100644 --- a/Il2CppInspector.Common/Outputs/ScriptResources/Targets/Ghidra.py +++ b/Il2CppInspector.Common/Outputs/ScriptResources/Targets/Ghidra.py @@ -8,7 +8,7 @@ from ghidra.program.model.symbol import SourceType def SetName(addr, name): createLabel(toAddr(addr), name, True) -def MakeFunction(start, name=None): +def MakeFunction(start, name=None, addrMax=None): addr = toAddr(start) # Don't override existing functions fn = getFunctionAt(addr) diff --git a/Il2CppInspector.Common/Outputs/ScriptResources/Targets/IDA.py b/Il2CppInspector.Common/Outputs/ScriptResources/Targets/IDA.py index 5b099c0..cc98422 100644 --- a/Il2CppInspector.Common/Outputs/ScriptResources/Targets/IDA.py +++ b/Il2CppInspector.Common/Outputs/ScriptResources/Targets/IDA.py @@ -7,8 +7,16 @@ def SetName(addr, name): new_name = name + '_' + str(addr) ret = idc.set_name(addr, new_name, SN_NOWARN | SN_NOCHECK) -def MakeFunction(start): - ida_funcs.add_func(start) +def MakeFunction(start, name=None, addrMax=None): + ida_funcs.add_func(start) + #limit end function to maxAddr if any + if addrMax is None: + return + addrEnd = idc.get_func_attr(start,FUNCATTR_END) + if addrEnd == idaapi.BADADDR: + return + if addrEnd > addrMax: + idc.set_func_end(start,addrMax) def MakeArray(addr, numItems, cppType): SetType(addr, cppType) diff --git a/Il2CppInspector.Common/Outputs/ScriptResources/shared-main.py b/Il2CppInspector.Common/Outputs/ScriptResources/shared-main.py index d905985..d8812f0 100644 --- a/Il2CppInspector.Common/Outputs/ScriptResources/shared-main.py +++ b/Il2CppInspector.Common/Outputs/ScriptResources/shared-main.py @@ -97,8 +97,17 @@ def ProcessJSON(jsonData): # Function boundaries print('Processing function boundaries') - for d in jsonData['functionAddresses']: - MakeFunction(int(d, 0)) + functionAddresses = jsonData['functionAddresses'] + functionAddresses.sort() + count = len(functionAddresses) + for i in range(count): + addrStart = int(functionAddresses[i],0) + if addrStart == 0: + continue + addrNext = None + if i != count -1: + addrNext = int(functionAddresses[i+1],0) + MakeFunction(addrStart,None,addrNext) # IL2CPP type metadata print('Processing IL2CPP type metadata')