diff --git a/ApplySig.py b/ApplySig.py index 30927d4..c9d945f 100644 --- a/ApplySig.py +++ b/ApplySig.py @@ -9,6 +9,7 @@ from __future__ import print_function from ghidra.framework.model import DomainFile from ghidra.program.model.symbol import SourceType +from ghidra.app.util.demangler import DemanglerUtil, DemanglerOptions from ghidra.util import Msg from java.lang import IllegalArgumentException @@ -511,8 +512,8 @@ def parse_public_function(f, version, offset): is_local = True if b & FlirtFunctionFlag.FUNCTION_UNRESOLVED_COLLISION: is_collision = True - if b & 0x01 or b & 0x04: - print('Investigate public name flag: 0x{:02X} @ 0x{:04X}'.format(b, offset)) +# if b & 0x01 or b & 0x04: +# print('Investigate public name flag: 0x{:02X} @ 0x{:04X}'.format(b, offset)) b = read_u8(f) name = list() @@ -692,13 +693,31 @@ def get_function_end(funk): return max rename_cnt = 0 +options = DemanglerOptions() def funk_rename(addr, funk): global rename_cnt + global options name = funk.name if name != '?': - funk = getFunctionAt(parseAddress(hex(addr))) - funk.setName(name, SourceType.USER_DEFINED) - rename_cnt += 1 + stripped = DemanglerUtil.stripSuperfluousSignatureSpaces(name) + demangled = DemanglerUtil.demangle(currentProgram, stripped) + address = parseAddress(hex(addr + funk.offset)) + if demangled: + demangled.applyTo(currentProgram, address, options, monitor) + elif not funk.is_local: + ghidra_funk = getFunctionAt(address) + if ghidra_funk: + ghidra_funk.setName(name, SourceType.USER_DEFINED) + rename_cnt += 1 + else: + createFunction(address, name) + else: + ghidra_symbol = getSymbolAt(address) + if ghidra_symbol: + ghidra_symbol.setName(name, SourceType.USER_DEFINED) + rename_cnt += 1 + else: + createLabel(address, name, True, SourceType.USER_DEFINED) return def apply_sig(flirt):