diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/RecoverClassesFromRTTIScript.java b/Ghidra/Features/Decompiler/ghidra_scripts/RecoverClassesFromRTTIScript.java index b98cb2ba67..67ca4f7c1f 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/RecoverClassesFromRTTIScript.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/RecoverClassesFromRTTIScript.java @@ -165,8 +165,6 @@ public class RecoverClassesFromRTTIScript extends GhidraScript { RTTIClassRecoverer recoverClassesFromRTTI; - ExtraScriptUtils extraUtils; - boolean nameVfunctions = false; @Override diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/EditStructureUtils.java b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/EditStructureUtils.java index 79b8cb7a57..26e380621d 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/EditStructureUtils.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/EditStructureUtils.java @@ -22,9 +22,9 @@ import ghidra.program.model.data.*; import ghidra.util.exception.CancelledException; import ghidra.util.task.TaskMonitor; -public class EditStructureUtils { +class EditStructureUtils { - EditStructureUtils() { + private EditStructureUtils() { } @@ -42,7 +42,7 @@ public class EditStructureUtils { * internal struct, false otherwise * @throws CancelledException if cancelled */ - public boolean hasReplaceableComponentsAtOffset(Structure containingStruct, int offset, + static boolean hasReplaceableComponentsAtOffset(Structure containingStruct, int offset, Structure newInternalStruct, TaskMonitor monitor) throws CancelledException { DataTypeComponent[] newStructComponents = newInternalStruct.getComponents(); @@ -95,7 +95,7 @@ public class EditStructureUtils { * @return true if there are at least length undefined size 1 components at the given offset in the given structure * @throws CancelledException if cancelled */ - public boolean hasEnoughUndefined1sAtOffset(Structure structure, int offset, int length, + static boolean hasEnoughUndefined1sAtOffset(Structure structure, int offset, int length, TaskMonitor monitor) throws CancelledException { if (structure.getLength() < offset + length) { @@ -128,7 +128,7 @@ public class EditStructureUtils { * @return true if successfully cleared from offset to offset+length, false otherwise * @throws CancelledException if cancelled */ - public boolean clearLengthAtOffset(Structure structure, int offset, int length, + static boolean clearLengthAtOffset(Structure structure, int offset, int length, TaskMonitor monitor) throws CancelledException { if (structure.getLength() < offset + length) { @@ -143,17 +143,10 @@ public class EditStructureUtils { monitor.checkCanceled(); - DataTypeComponent component = structure.getComponentAt(offset); - DataType dataType = component.getDataType(); + DataTypeComponent component = structure.getComponentContaining(offset); - // return false if it would clear too much - if (offset + dataType.getLength() > endOfClear) { - return false; - } - - offsetsToClear.add(offset); - offset += dataType.getLength(); - continue; + offsetsToClear.add(component.getOffset()); + offset = component.getOffset() + component.getLength(); } @@ -178,11 +171,12 @@ public class EditStructureUtils { * @param dataType the given data type * @return true if given data type is undefined size 1, false otherwise */ - public boolean isUndefined1(DataType dataType) { + static boolean isUndefined1(DataType dataType) { - if (isUndefined(dataType) && dataType.getLength() == 1) { + if (Undefined.isUndefined(dataType) && dataType.getLength() == 1) { return true; } + return false; } @@ -191,7 +185,7 @@ public class EditStructureUtils { * @param dataType the given data type * @return true if given data type is undefined of any size, false otherwise */ - public boolean isUndefined(DataType dataType) { + static boolean isUndefined(DataType dataType) { if (dataType.getName().contains("undefined")) { return true; } @@ -199,41 +193,46 @@ public class EditStructureUtils { } /** - * Method to determine if there are at least the given length of undefined (any size) components at the given offset in the given structure + * Method to determine if there are at least the given length of undefined (any size) components + * at the given offset in the given structure. This is only valid for non-packed structures. * @param structure the given structure * @param offset the given offset * @param length the total length of undefined components to check for starting at given offset * @param monitor task monitor * @return true if there are at least total length of undefined components at the given offset in the given structure * @throws CancelledException if cancelled + * @throws IllegalArgumentException if a packed structure is passed in */ - public boolean hasEnoughUndefinedsOfAnyLengthAtOffset(Structure structure, int offset, + static boolean hasEnoughUndefinedsOfAnyLengthAtOffset(Structure structure, int offset, int length, TaskMonitor monitor) throws CancelledException { - if (structure.getLength() < offset + length) { - return false; + if (structure.isPackingEnabled()) { + throw new IllegalArgumentException( + "Packed structures are not supported by this method"); } int endOfRange = offset + length; + if (offset < 0 || length <= 0 || structure.getLength() < endOfRange) { + return false; + } + while (offset < endOfRange) { monitor.checkCanceled(); - DataTypeComponent component = structure.getComponentAt(offset); + DataTypeComponent component = structure.getComponentContaining(offset); + DataType dataType = component.getDataType(); - if (isUndefined(dataType)) { - - offset += dataType.getLength(); - if (offset > endOfRange) { - return false; - } - - continue; + if (!Undefined.isUndefined(dataType)) { + return false; } - return false; + + offset = component.getOffset() + component.getLength(); + } + return true; } @@ -251,7 +250,7 @@ public class EditStructureUtils { * @throws IllegalArgumentException if issue inserting data type into structure * @throws CancelledException if cancelled */ - public Structure addDataTypeToStructure(Structure structure, int offset, + static Structure addDataTypeToStructure(Structure structure, int offset, DataType dataType, String fieldName, TaskMonitor monitor) throws CancelledException, IllegalArgumentException { @@ -292,7 +291,7 @@ public class EditStructureUtils { * @return true if the given structure has room at the given offset to have a component of the given length added to it * @throws CancelledException if cancelled */ - public boolean canAdd(Structure structureDataType, int offset, int lengthToAdd, + static boolean canAdd(Structure structureDataType, int offset, int lengthToAdd, TaskMonitor monitor) throws CancelledException { @@ -332,7 +331,7 @@ public class EditStructureUtils { * @return the number of undefined size 1 components in the given structure before the given offset * @throws CancelledException if cancelled */ - public int getNumberOfUndefinedsBeforeOffset(Structure structure, int offset, + static int getNumberOfUndefinedsBeforeOffset(Structure structure, int offset, TaskMonitor monitor) throws CancelledException { if (structure.getNumComponents() == 0) { @@ -364,7 +363,7 @@ public class EditStructureUtils { * @return the number of undefined size 1 components starting at the given offset in the given structure * @throws CancelledException if cancelled */ - public int getNumberOfUndefinedsStartingAtOffset(Structure structure, int offset, + static int getNumberOfUndefinedsStartingAtOffset(Structure structure, int offset, TaskMonitor monitor) throws CancelledException { int numUndefineds = 0; diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/ExtraScriptUtils.java b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/ExtendedFlatProgramAPI.java similarity index 97% rename from Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/ExtraScriptUtils.java rename to Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/ExtendedFlatProgramAPI.java index 150c8696b6..61896eacaf 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/ExtraScriptUtils.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/ExtendedFlatProgramAPI.java @@ -34,19 +34,13 @@ import ghidra.program.model.symbol.*; import ghidra.util.exception.*; import ghidra.util.task.TaskMonitor; -public class ExtraScriptUtils extends FlatProgramAPI { +public class ExtendedFlatProgramAPI extends FlatProgramAPI { - Program program; - TaskMonitor taskMonitor; - int defaultPointerSize; + final int defaultPointerSize; - ExtraScriptUtils(Program program, TaskMonitor taskMonitor) { - this.program = program; - this.taskMonitor = taskMonitor; - - currentProgram = program; - monitor = taskMonitor; + ExtendedFlatProgramAPI(Program program, TaskMonitor taskMonitor) { + super(program, taskMonitor); defaultPointerSize = program.getDefaultPointerSize(); } @@ -66,7 +60,7 @@ public class ExtraScriptUtils extends FlatProgramAPI { int numComponents = data.getNumComponents(); for (int ii = 0; ii < numComponents; ++ii) { - taskMonitor.checkCanceled(); + monitor.checkCanceled(); Data component = data.getComponent(ii); if (!component.isPointer()) { @@ -125,7 +119,7 @@ public class ExtraScriptUtils extends FlatProgramAPI { } // check for or create function pointer if valid function pointed to - Data data = program.getListing().getDefinedDataAt(address); + Data data = currentProgram.getListing().getDefinedDataAt(address); if (data != null) { if (data.isPointer() && getPointedToFunction(address) != null) { return true; @@ -165,8 +159,8 @@ public class ExtraScriptUtils extends FlatProgramAPI { return false; } - DataType nullPointer = program.getDataTypeManager().getPointer(null); - Listing listing = program.getListing(); + DataType nullPointer = currentProgram.getDataTypeManager().getPointer(null); + Listing listing = currentProgram.getListing(); Data d = listing.getDefinedDataAt(address); if (d == null) { try { @@ -316,7 +310,7 @@ public class ExtraScriptUtils extends FlatProgramAPI { */ public Function createFunctionBefore(Address address, Byte expectedFiller) { - PseudoDisassembler pseudoDisassembler = new PseudoDisassembler(program); + PseudoDisassembler pseudoDisassembler = new PseudoDisassembler(currentProgram); Instruction instructionBefore = getInstructionBefore(address); @@ -419,7 +413,7 @@ public class ExtraScriptUtils extends FlatProgramAPI { public int getNumberOfSameFillerBytesStartingAtAddress(Address firstAddress) throws CancelledException, MemoryAccessException { - AddressSetView validMemory = program.getMemory().getLoadedAndInitializedAddressSet(); + AddressSetView validMemory = currentProgram.getMemory().getLoadedAndInitializedAddressSet(); if (firstAddress == null) { return 0; @@ -529,7 +523,7 @@ public class ExtraScriptUtils extends FlatProgramAPI { // Create a new address set to hold the entire selection. AddressSet subroutineAddresses = new AddressSet(); - IsolatedEntrySubModel model = new IsolatedEntrySubModel(program); + IsolatedEntrySubModel model = new IsolatedEntrySubModel(currentProgram); CodeBlock[] codeBlocksContaining = model.getCodeBlocksContaining(address, monitor); for (CodeBlock element : codeBlocksContaining) { @@ -607,7 +601,7 @@ public class ExtraScriptUtils extends FlatProgramAPI { int addressSize = address.getSize(); if (addressSize == 64 && getIboIf64bit) { ImageBaseOffset32DataType ibo32 = - new ImageBaseOffset32DataType(program.getDataTypeManager()); + new ImageBaseOffset32DataType(currentProgram.getDataTypeManager()); int length = ibo32.getLength(); DumbMemBufferImpl compMemBuffer = new DumbMemBufferImpl(currentProgram.getMemory(), address); @@ -654,7 +648,7 @@ public class ExtraScriptUtils extends FlatProgramAPI { List symbolList = new ArrayList(); - SymbolIterator symbols = program.getSymbolTable().getSymbols(namespace); + SymbolIterator symbols = currentProgram.getSymbolTable().getSymbols(namespace); while (symbols.hasNext()) { monitor.checkCanceled(); @@ -765,7 +759,7 @@ public class ExtraScriptUtils extends FlatProgramAPI { List
referenceAddresses = new ArrayList
(); ReferenceIterator referencesToFunctionBIterator = - program.getReferenceManager().getReferencesTo(bFunction.getEntryPoint()); + currentProgram.getReferenceManager().getReferencesTo(bFunction.getEntryPoint()); while (referencesToFunctionBIterator.hasNext()) { @@ -995,7 +989,7 @@ public class ExtraScriptUtils extends FlatProgramAPI { */ public void removeAllSymbolsAtAddress(Address address) throws CancelledException { - SymbolTable symbolTable = program.getSymbolTable(); + SymbolTable symbolTable = currentProgram.getSymbolTable(); Symbol primarySymbol = symbolTable.getPrimarySymbol(address); @@ -1031,7 +1025,7 @@ public class ExtraScriptUtils extends FlatProgramAPI { */ public boolean hasSymbolsInNamespace(Namespace namespace) { - SymbolIterator namespaceSymbols = program.getSymbolTable().getSymbols(namespace); + SymbolIterator namespaceSymbols = currentProgram.getSymbolTable().getSymbols(namespace); if (namespaceSymbols.hasNext()) { return true; diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIClassRecoverer.java b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIClassRecoverer.java index 408765ac17..be63405f46 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIClassRecoverer.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIClassRecoverer.java @@ -161,7 +161,7 @@ public class RTTIClassRecoverer extends RecoveredClassUtils { // if class is non-virtual have to search for an existing class datatype if (!recoveredClass.hasVftable()) { DataType[] possibleExistingClassStructures = - extraUtils.getDataTypes(recoveredClass.getName()); + extendedFlatAPI.getDataTypes(recoveredClass.getName()); if (possibleExistingClassStructures.length == 0) { continue; } diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java index a678e60417..cd624a8213 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java @@ -253,7 +253,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { recoveredClasses = recoverClassesFromVftables(vftableSymbols, true, true); // find all typeinfo symbols and get their class namespace and create RecoveredClass object - List typeinfoSymbols = extraUtils.getListOfSymbolsInAddressSet( + List typeinfoSymbols = extendedFlatAPI.getListOfSymbolsInAddressSet( program.getAddressFactory().getAddressSet(), "typeinfo", true); // create class objects for each typeinfo struct and make a class to typeinfo mapping for each @@ -325,7 +325,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { } } - Address specialTypeinfoRef = extraUtils.getSingleReferencedAddress(typeinfoAddress); + Address specialTypeinfoRef = extendedFlatAPI.getSingleReferencedAddress(typeinfoAddress); if (specialTypeinfoRef == null) { if (DEBUG) { Msg.debug(this, @@ -454,7 +454,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { listOfVtableSymbols = findVtablesUsingTypeinfoRefs(); } else { - listOfVtableSymbols = extraUtils.getListOfSymbolsInAddressSet( + listOfVtableSymbols = extendedFlatAPI.getListOfSymbolsInAddressSet( program.getAddressFactory().getAddressSet(), VTABLE_LABEL, false); } @@ -496,7 +496,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { for (Address typeinfoRef : typeinfoReferencesNotInTypeinfoStructs) { monitor.checkCanceled(); - Address typeinfoAddress = extraUtils.getPointer(typeinfoRef); + Address typeinfoAddress = extendedFlatAPI.getPointer(typeinfoRef); if (typeinfoAddress == null) { continue; @@ -563,7 +563,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { // check for appropriately sized long that is value 0 to make sure the // vtable the typeinfo ref is in is the main one and skip otherwise since non-zero // ones are internal vtables that will get processed with the main one - if (!extraUtils.hasNumZeros(longBeforeTypeinfoRef, defaultPointerSize)) { + if (!extendedFlatAPI.hasNumZeros(longBeforeTypeinfoRef, defaultPointerSize)) { return null; } @@ -590,7 +590,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { private Address getPointerToDefinedMemory(Address address) { - Address pointer = extraUtils.getPointer(address); + Address pointer = extendedFlatAPI.getPointer(address); if (pointer == null) { return null; } @@ -966,7 +966,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { private Symbol getVTTBefore(Address address) throws CancelledException { // get all symbols named VTT and get the one directly before the given address - List vttSymbols = extraUtils.getListOfSymbolsInAddressSet( + List vttSymbols = extendedFlatAPI.getListOfSymbolsInAddressSet( program.getAddressFactory().getAddressSet(), "VTT", true); return getSymbolOnListBeforeAddress(address, vttSymbols); @@ -1210,7 +1210,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { return false; } - Reference[] referencesTo = extraUtils.getReferencesTo(address); + Reference[] referencesTo = extendedFlatAPI.getReferencesTo(address); if (referencesTo.length > 0) { return false; } @@ -1239,7 +1239,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { return false; } - List
referenceFromAddresses = extraUtils.getReferenceFromAddresses(address); + List
referenceFromAddresses = extendedFlatAPI.getReferenceFromAddresses(address); if (referenceFromAddresses.size() > 0) { return false; @@ -1304,7 +1304,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { return false; } - if (extraUtils.hasNumZeros(vftableAddress, defaultPointerSize)) { + if (extendedFlatAPI.hasNumZeros(vftableAddress, defaultPointerSize)) { return true; } @@ -1313,7 +1313,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { if (!data.isPointer()) { return false; } - Address referencedAddress = extraUtils.getSingleReferencedAddress(vftableAddress); + Address referencedAddress = extendedFlatAPI.getSingleReferencedAddress(vftableAddress); if (referencedAddress == null) { return false; } @@ -1407,7 +1407,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { // create a pointer and check to see if it is a reference to a valid memory location try { api.createData(address, pointer); - Address referencedAddress = extraUtils.getSingleReferencedAddress(address); + Address referencedAddress = extendedFlatAPI.getSingleReferencedAddress(address); // if it isn't valid, clear what we just created and increment to offset so // the next can be checked @@ -1464,7 +1464,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { for (Address typeinfoAddress : typeinfoAddresses) { - Address specialTypeinfoRef = extraUtils.getSingleReferencedAddress(typeinfoAddress); + Address specialTypeinfoRef = extendedFlatAPI.getSingleReferencedAddress(typeinfoAddress); if (specialTypeinfoRef == null) { continue; } @@ -1698,7 +1698,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { } Address stringReference = - extraUtils.getSingleReferencedAddress(address.add(typeinfoNameComponent.getOffset())); + extendedFlatAPI.getSingleReferencedAddress(address.add(typeinfoNameComponent.getOffset())); Data stringData = api.getDataAt(stringReference); if (stringData == null) { @@ -1728,7 +1728,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { List
typeinfoAddresses = new ArrayList
(); - List typeinfoSymbols = extraUtils.getListOfSymbolsInAddressSet( + List typeinfoSymbols = extendedFlatAPI.getListOfSymbolsInAddressSet( program.getAddressFactory().getAddressSet(), "typeinfo", true); Iterator typeinfoIterator = typeinfoSymbols.iterator(); @@ -2153,8 +2153,8 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { //virtual base offset for the virtual base referenced (negative). long offset = (publicVirtualOffsetFlag & offsetMask) >> 8; - Msg.debug(this, "typeinfo " + typeinfoAddress + " base [" + i + "] isVirtual = " + - isVirtual + " isPublic = " + isPublic + " offset = " + offset); +// Msg.debug(this, "typeinfo " + typeinfoAddress + " base [" + i + "] isVirtual = " + +// isVirtual + " isPublic = " + isPublic + " offset = " + offset); // add order to parent and parent offset orderToParentMap.put(i, parentClass); @@ -2207,7 +2207,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { */ private RecoveredClass getParentClassFromParentTypeInfoRef(Address parentTypeinfoRef) { - Address parentAddress = extraUtils.getSingleReferencedAddress(parentTypeinfoRef); + Address parentAddress = extendedFlatAPI.getSingleReferencedAddress(parentTypeinfoRef); if (parentAddress == null) { return null; } @@ -2295,7 +2295,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { int offset = 0; - Address address = extraUtils.getAddress(startAddress, offset); + Address address = extendedFlatAPI.getAddress(startAddress, offset); MemoryBlock currentMemoryBlock = program.getMemory().getBlock(startAddress); @@ -2309,10 +2309,10 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { return null; } - Address possibleTypeinfo = extraUtils.getPointer(address); + Address possibleTypeinfo = extendedFlatAPI.getPointer(address); if (possibleTypeinfo == null) { offset += defaultPointerSize; - address = extraUtils.getAddress(startAddress, offset); + address = extendedFlatAPI.getAddress(startAddress, offset); continue; } @@ -2322,7 +2322,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { return address; } offset += defaultPointerSize; - address = extraUtils.getAddress(startAddress, offset); + address = extendedFlatAPI.getAddress(startAddress, offset); } @@ -2339,7 +2339,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { List vftableSymbols = new ArrayList(); // find all vtable symbols - List listOfVtableSymbols = extraUtils.getListOfSymbolsInAddressSet( + List listOfVtableSymbols = extendedFlatAPI.getListOfSymbolsInAddressSet( program.getAddressFactory().getAddressSet(), VTABLE_LABEL, true); Iterator vtableIterator = listOfVtableSymbols.iterator(); @@ -2373,7 +2373,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { continue; } - Address vftableAddress = extraUtils.getAddress(typeinfoAddress, defaultPointerSize); + Address vftableAddress = extendedFlatAPI.getAddress(typeinfoAddress, defaultPointerSize); // no valid address here so continue if (vftableAddress == null) { //createNewClass(vtableNamespace, false); @@ -2454,7 +2454,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { recoveredClasses.add(recoveredClass); } - Address specialTypeinfoRef = extraUtils.getSingleReferencedAddress(typeinfoAddress); + Address specialTypeinfoRef = extendedFlatAPI.getSingleReferencedAddress(typeinfoAddress); if (specialTypeinfoRef == null) { if (DEBUG) { Msg.debug(this, @@ -2759,7 +2759,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { * @return true if the given address could be a valid null pointer, false if not */ private boolean isPossibleNullPointer(Address address) throws CancelledException { - if (!extraUtils.hasNumZeros(address, defaultPointerSize)) { + if (!extendedFlatAPI.hasNumZeros(address, defaultPointerSize)) { return false; } return true; @@ -2772,7 +2772,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { */ private boolean isPossibleFunctionPointer(Address address) { - Address possibleFunctionPointer = extraUtils.getPointer(address); + Address possibleFunctionPointer = extendedFlatAPI.getPointer(address); if (possibleFunctionPointer == null) { return false; } @@ -2967,9 +2967,11 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { DataType classVftablePointer = vfPointerDataTypes.get(vftableAddress); // simple case the offset for vftablePtr is 0 - if (structUtils.canAdd(classStructureDataType, 0, classVftablePointer.getLength(), + if (EditStructureUtils.canAdd(classStructureDataType, 0, + classVftablePointer.getLength(), monitor)) { - classStructureDataType = structUtils.addDataTypeToStructure(classStructureDataType, + classStructureDataType = + EditStructureUtils.addDataTypeToStructure(classStructureDataType, 0, classVftablePointer, CLASS_VTABLE_PTR_FIELD_EXT, monitor); } @@ -3013,10 +3015,11 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { " : structure should exist but doesn't."); } - if (structUtils.canAdd(classStructureDataType, parentOffset, + if (EditStructureUtils.canAdd(classStructureDataType, parentOffset, baseClassStructure.getLength(), monitor)) { classStructureDataType = - structUtils.addDataTypeToStructure(classStructureDataType, parentOffset, + EditStructureUtils.addDataTypeToStructure(classStructureDataType, + parentOffset, baseClassStructure, baseClassStructure.getName(), monitor); } } @@ -3027,7 +3030,8 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { int dataOffset = getDataOffset(recoveredClass, classStructureDataType); int dataLen = UNKNOWN; if (dataOffset != NONE) { - dataLen = structUtils.getNumberOfUndefinedsStartingAtOffset(classStructureDataType, + dataLen = + EditStructureUtils.getNumberOfUndefinedsStartingAtOffset(classStructureDataType, dataOffset, monitor); } @@ -3037,7 +3041,8 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { classStructureDataType, dataLen, dataOffset); if (recoveredClassDataStruct != null) { - classStructureDataType = structUtils.addDataTypeToStructure(classStructureDataType, + classStructureDataType = EditStructureUtils.addDataTypeToStructure( + classStructureDataType, dataOffset, recoveredClassDataStruct, "data", monitor); } diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIWindowsClassRecoverer.java b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIWindowsClassRecoverer.java index ddadec4088..669e207c28 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIWindowsClassRecoverer.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIWindowsClassRecoverer.java @@ -190,7 +190,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { figureOutClassDataMembers(recoveredClasses); if (USE_SHORT_TEMPLATE_NAMES_IN_STRUCTURE_FIELDS) { - extraUtils.createShortenedTemplateNamesForClasses(recoveredClasses); + extendedFlatAPI.createShortenedTemplateNamesForClasses(recoveredClasses); } createAndApplyClassStructures(recoveredClasses); @@ -336,7 +336,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { continue; } - Data data = extraUtils.getDataAt(symbol.getAddress()); + Data data = extendedFlatAPI.getDataAt(symbol.getAddress()); if (data != null && data.getDataType().getName().contains(RTTI_BASE_COMPLETE_OBJECT_LOADER_DATA_NAME)) { completeObjectLocatorSymbols.add(symbol); @@ -375,7 +375,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { int sizeOfDt = completeObjLocatorDataType.getLength(); api.clearListing(address, address.add(sizeOfDt)); - Data completeObjectLocator = extraUtils.createData(address, completeObjLocatorDataType); + Data completeObjectLocator = extendedFlatAPI.createData(address, completeObjLocatorDataType); if (completeObjectLocator == null) { return null; } @@ -402,7 +402,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { continue; } - Data data = extraUtils.getDataAt(symbol.getAddress()); + Data data = extendedFlatAPI.getDataAt(symbol.getAddress()); if (data != null && data.getDataType().getName().contains(RTTI_BASE_CLASS_DESCRIPTOR_DATA_NAME)) { baseClassDescriptorSymbols.add(symbol); @@ -440,7 +440,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { api.clearListing(baseClassDescriptorAddress, baseClassDescriptorAddress.add(sizeOfDt)); Data baseClassDescArray = - extraUtils.createData(baseClassDescriptorAddress, baseClassDescriptor); + extendedFlatAPI.createData(baseClassDescriptorAddress, baseClassDescriptor); if (baseClassDescArray == null) { return null; } @@ -467,16 +467,16 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { //TODO: extraUtils.getReferencedAddress(address, getIboIf64bit); Address baseClassDescriptorAddress = getReferencedAddress(address.add(i * 4)); - Data baseClassDescriptor = extraUtils.getDataAt(baseClassDescriptorAddress); + Data baseClassDescriptor = extendedFlatAPI.getDataAt(baseClassDescriptorAddress); if (baseClassDescriptor == null || !baseClassDescriptor.getDataType() .getName() .equals( RTTI_BASE_CLASS_DESCRIPTOR_DATA_NAME)) { - int num1 = extraUtils.getInt(baseClassDescriptorAddress.add(8)); - int num2 = extraUtils.getInt(baseClassDescriptorAddress.add(12)); - int num3 = extraUtils.getInt(baseClassDescriptorAddress.add(16)); - int num4 = extraUtils.getInt(baseClassDescriptorAddress.add(20)); + int num1 = extendedFlatAPI.getInt(baseClassDescriptorAddress.add(8)); + int num2 = extendedFlatAPI.getInt(baseClassDescriptorAddress.add(12)); + int num3 = extendedFlatAPI.getInt(baseClassDescriptorAddress.add(16)); + int num4 = extendedFlatAPI.getInt(baseClassDescriptorAddress.add(20)); baseClassDescriptor = createBaseClassDescriptor(baseClassDescriptorAddress); if (baseClassDescriptor != null) { @@ -556,7 +556,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { //TODO: extraUtils.getReferencedAddress(address, getIboIf64bit); Address classHierarchyDescriptorAddress = getReferencedAddress(address); - Data classHierarchyStructure = extraUtils.getDataAt(classHierarchyDescriptorAddress); + Data classHierarchyStructure = extendedFlatAPI.getDataAt(classHierarchyDescriptorAddress); if (classHierarchyStructure != null && classHierarchyStructure.getDataType() @@ -601,7 +601,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { classHierarchyDescriptorAddress.add(sizeOfDt)); Data classHierarchyStructure = - extraUtils.createData(classHierarchyDescriptorAddress, classHDatatype); + extendedFlatAPI.createData(classHierarchyDescriptorAddress, classHDatatype); if (classHierarchyStructure == null) { return null; } @@ -634,13 +634,13 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { symbolTable.getPrimarySymbol(classHierarchyDescriptorAddress); Namespace classNamespace = classHierarchyDescriptorSymbol.getParentNamespace(); - int numBaseClasses = extraUtils.getInt(classHierarchyDescriptorAddress.add(8)); + int numBaseClasses = extendedFlatAPI.getInt(classHierarchyDescriptorAddress.add(8)); //TODO: extraUtils.getReferencedAddress(address, getIboIf64bit); Address baseClassArrayAddress = getReferencedAddress(classHierarchyDescriptorAddress.add(12)); - Data baseClassDescArray = extraUtils.getDataAt(baseClassArrayAddress); + Data baseClassDescArray = extendedFlatAPI.getDataAt(baseClassArrayAddress); if (baseClassDescArray != null && baseClassDescArray.isArray()) { baseClassArrayAddresses.add(baseClassArrayAddress); @@ -704,7 +704,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { api.clearListing(baseClassArrayAddress, baseClassArrayAddress.add(numBaseClasses * sizeOfDt)); Data baseClassDescArray = - extraUtils.createData(baseClassArrayAddress, baseClassDescArrayDT); + extendedFlatAPI.createData(baseClassArrayAddress, baseClassDescArrayDT); if (baseClassDescArray == null) { return null; @@ -740,7 +740,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { continue; } - Reference[] referencesTo = extraUtils.getReferencesTo(completeObjectLocatorAddress); + Reference[] referencesTo = extendedFlatAPI.getReferencesTo(completeObjectLocatorAddress); if (referencesTo.length == 0) { //println("no refs to " + completeObjectLocatorAddress.toString()); continue; @@ -824,7 +824,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { // this will work whether there is a created reference or not int addressSize = address.getSize(); if (addressSize == 32) { - long offset = extraUtils.getInt(address); + long offset = extendedFlatAPI.getInt(address); return address.getNewAddress(offset); } @@ -832,7 +832,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { // this currently will workn only if there is a created reference // TODO: get ibo bytes and figure out what the ibo ref address would be if (addressSize == 64) { - Reference refs[] = extraUtils.getReferencesFrom(address); + Reference refs[] = extendedFlatAPI.getReferencesFrom(address); if (refs.length == 0) { return null; } @@ -875,7 +875,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { findVftableReferencesNotInFunction(vftableSymbols); if (unusedVftableReferences.size() > 0) { - extraUtils.createUndefinedFunctions(unusedVftableReferences); + extendedFlatAPI.createUndefinedFunctions(unusedVftableReferences); } // create these automatically if found @@ -937,7 +937,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { // Create Data Type Manager Category for given class // TODO: make this global and check it for null CategoryPath classPath = - extraUtils.createDataTypeCategoryPath(classDataTypesCategoryPath, + extendedFlatAPI.createDataTypeCategoryPath(classDataTypesCategoryPath, classNameWithNamespace); RecoveredClass nonVftableClass = @@ -982,7 +982,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { */ private List getListOfClassHierarchyDescriptors() throws CancelledException { - List classHierarchyDescriptorList = extraUtils.getListOfSymbolsInAddressSet( + List classHierarchyDescriptorList = extendedFlatAPI.getListOfSymbolsInAddressSet( getInitializedMemory(), RTTI_CLASS_HIERARCHY_DESCRIPTOR_LABEL, false); return classHierarchyDescriptorList; @@ -1011,13 +1011,13 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { Address vftableAddress = vftableIterator.next(); Address ptrToColAddress = vftableAddress.subtract(defaultPointerSize); - Data pointerToCompleteObjLocator = extraUtils.getDataAt(vftableAddress); + Data pointerToCompleteObjLocator = extendedFlatAPI.getDataAt(vftableAddress); if (pointerToCompleteObjLocator == null) { pointerToCompleteObjLocator = - extraUtils.createData(ptrToColAddress, pointerDataType); + extendedFlatAPI.createData(ptrToColAddress, pointerDataType); } - Address colAddress = extraUtils.getReferencedAddress(ptrToColAddress, false); + Address colAddress = extendedFlatAPI.getReferencedAddress(ptrToColAddress, false); if (colAddress == null) { // println(recoveredClass.getName() + " couldn't get referenced col from " + @@ -1028,7 +1028,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { try { Address addressOfOffset = colAddress.add(4); - int offset = extraUtils.getInt(addressOfOffset); + int offset = extendedFlatAPI.getInt(addressOfOffset); recoveredClass.addClassOffsetToVftableMapping(offset, vftableAddress); } @@ -1178,7 +1178,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { List classHierarchy = new ArrayList(); - List symbols = extraUtils.getListOfSymbolsByNameInNamespace( + List symbols = extendedFlatAPI.getListOfSymbolsByNameInNamespace( RTTI_BASE_CLASS_ARRAY_LABEL, recoveredClass.getClassNamespace(), false); @@ -1195,7 +1195,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { Address pointerAddress = rttiBaseClassDescriptorArray.getComponent(i).getAddress(); Address baseClassDescriptorAddress = - extraUtils.getSingleReferencedAddress(pointerAddress); + extendedFlatAPI.getSingleReferencedAddress(pointerAddress); if (baseClassDescriptorAddress == null) { return classHierarchy; @@ -1246,13 +1246,13 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { private int getClassInheritanceFlag(Namespace classNamespace) throws CancelledException, MemoryAccessException, AddressOutOfBoundsException { - List symbols = extraUtils.getListOfSymbolsByNameInNamespace( + List symbols = extendedFlatAPI.getListOfSymbolsByNameInNamespace( RTTI_CLASS_HIERARCHY_DESCRIPTOR_LABEL, classNamespace, false); if (symbols.size() >= 1) { try { - return (extraUtils.getInt(symbols.get(0).getAddress().add(4))); + return (extendedFlatAPI.getInt(symbols.get(0).getAddress().add(4))); } catch (MemoryAccessException e) { // println("Could not get class inheritance flag at address " + @@ -1393,7 +1393,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { // iterate over base class array and for each parent class of the given recovered class // get the mdisp, pdisp, vdisp info - List baseClassArray = extraUtils.getListOfSymbolsByNameInNamespace( + List baseClassArray = extendedFlatAPI.getListOfSymbolsByNameInNamespace( RTTI_BASE_CLASS_ARRAY_LABEL, recoveredClass.getClassNamespace(), false); // this should never happen @@ -1425,7 +1425,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { Address pointerAddress = baseClassArrayData.getComponent(i).getAddress(); Address baseClassDescriptorAddress = - extraUtils.getReferencedAddress(pointerAddress, true); + extendedFlatAPI.getReferencedAddress(pointerAddress, true); if (baseClassArrayAddress == null) { continue; } @@ -1630,7 +1630,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { getTargetAddressFromPcodeOp(offsetPcodeOpPair.getPcodeOp()); Address vbtableAddress = - extraUtils.getSingleReferencedAddress(listingAddress); + extendedFlatAPI.getSingleReferencedAddress(listingAddress); if (vbtableAddress == null) { continue; @@ -1989,7 +1989,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { if (possibleVftable == null) { Function referencedFunction = - extraUtils.getReferencedFunction(classReferenceAddress, true); + extendedFlatAPI.getReferencedFunction(classReferenceAddress, true); if (referencedFunction == null) { continue; } @@ -2337,7 +2337,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { Address pointerAddress = baseClassArrayData.getComponent(i).getAddress(); Address baseClassDescriptorAddress = - extraUtils.getReferencedAddress(pointerAddress, true); + extendedFlatAPI.getReferencedAddress(pointerAddress, true); if (baseClassDescriptorAddress == null) { continue; } @@ -2400,7 +2400,8 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { dataLength = baseClassStructure.getLength() - lengthOfVirtualParent; } - if (structUtils.canAdd(classStructureDataType, baseClassOffset, dataLength, + if (EditStructureUtils.canAdd(classStructureDataType, baseClassOffset, + dataLength, monitor)) { classStructureDataType = addIndividualComponentsToStructure(classStructureDataType, @@ -2410,10 +2411,11 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { } // else copy whole baseClass structure to the class Structure - if (structUtils.canAdd(classStructureDataType, baseClassOffset, + if (EditStructureUtils.canAdd(classStructureDataType, baseClassOffset, baseClassStructure.getLength(), monitor)) { classStructureDataType = - structUtils.addDataTypeToStructure(classStructureDataType, baseClassOffset, + EditStructureUtils.addDataTypeToStructure(classStructureDataType, + baseClassOffset, baseClassStructure, baseClassStructure.getName(), monitor); } @@ -2429,11 +2431,12 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { baseClassOffset = api.getInt(recoveredClass.getVbtableAddress().add(vdisp)) + pdisp; - if (structUtils.canAdd(classStructureDataType, baseClassOffset, + if (EditStructureUtils.canAdd(classStructureDataType, baseClassOffset, baseClassStructure.getLength(), monitor)) { classStructureDataType = - structUtils.addDataTypeToStructure(classStructureDataType, baseClassOffset, + EditStructureUtils.addDataTypeToStructure(classStructureDataType, + baseClassOffset, baseClassStructure, baseClassStructure.getName(), monitor); } @@ -2461,9 +2464,10 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { DataType classVftablePointer = vfPointerDataTypes.get(vftableAddress); - if (structUtils.canAdd(classStructureDataType, offset.intValue(), + if (EditStructureUtils.canAdd(classStructureDataType, offset.intValue(), classVftablePointer.getLength(), monitor)) { - classStructureDataType = structUtils.addDataTypeToStructure(classStructureDataType, + classStructureDataType = EditStructureUtils.addDataTypeToStructure( + classStructureDataType, offset.intValue(), classVftablePointer, CLASS_VTABLE_PTR_FIELD_EXT, monitor); } @@ -2479,7 +2483,8 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { int dataOffset = getDataOffset(recoveredClass, classStructureDataType); int dataLen = UNKNOWN; if (dataOffset != NONE) { - dataLen = structUtils.getNumberOfUndefinedsStartingAtOffset(classStructureDataType, + dataLen = + EditStructureUtils.getNumberOfUndefinedsStartingAtOffset(classStructureDataType, dataOffset, monitor); } @@ -2489,7 +2494,8 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { classStructureDataType, dataLen, dataOffset); if (recoveredClassDataStruct != null) { - classStructureDataType = structUtils.addDataTypeToStructure(classStructureDataType, + classStructureDataType = + EditStructureUtils.addDataTypeToStructure(classStructureDataType, dataOffset, recoveredClassDataStruct, classStructureDataType.getName() + "_data", monitor); } @@ -2556,11 +2562,12 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { monitor.checkCanceled(); // if enough empty bytes - add class vftable pointer - if (structUtils.canAdd(classStructureDataType, vftableOffset, + if (EditStructureUtils.canAdd(classStructureDataType, vftableOffset, classVftablePointer.getLength(), monitor)) { classStructureDataType = - structUtils.addDataTypeToStructure(classStructureDataType, vftableOffset, + EditStructureUtils.addDataTypeToStructure(classStructureDataType, + vftableOffset, classVftablePointer, CLASS_VTABLE_PTR_FIELD_EXT, monitor); addedVftablePointer = true; @@ -2677,7 +2684,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { return false; } int numUndefined1s = - structUtils.getNumberOfUndefinedsStartingAtOffset(structure, 0, monitor); + EditStructureUtils.getNumberOfUndefinedsStartingAtOffset(structure, 0, monitor); if (structure.getLength() == numUndefined1s) { return true; } @@ -2722,7 +2729,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { Address pointerAddress = baseClassArrayData.getComponent(i).getAddress(); Address baseClassDescriptorAddress = - extraUtils.getReferencedAddress(pointerAddress, true); + extendedFlatAPI.getReferencedAddress(pointerAddress, true); if (baseClassDescriptorAddress == null) { continue; } @@ -2785,7 +2792,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { */ private Data getBaseClassArray(RecoveredClass recoveredClass) throws CancelledException { - List baseClassArray = extraUtils.getListOfSymbolsByNameInNamespace( + List baseClassArray = extendedFlatAPI.getListOfSymbolsByNameInNamespace( RTTI_BASE_CLASS_ARRAY_LABEL, recoveredClass.getClassNamespace(), false); if (baseClassArray.size() != 1) { @@ -2842,9 +2849,11 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer { DataType vbaseStructPointer = dataTypeManager.getPointer(vbtableStructure); int dataLength = vbaseStructPointer.getLength(); - if (structUtils.canAdd(classStructureDataType, vbtableOffset, dataLength, monitor)) { + if (EditStructureUtils.canAdd(classStructureDataType, vbtableOffset, dataLength, + monitor)) { - classStructureDataType = structUtils.addDataTypeToStructure(classStructureDataType, + classStructureDataType = + EditStructureUtils.addDataTypeToStructure(classStructureDataType, vbtableOffset, vbaseStructPointer, "vbtablePtr", monitor); } diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClass.java b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClass.java index 80b386f1cd..97797660b6 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClass.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClass.java @@ -95,7 +95,6 @@ public class RecoveredClass { private static final int NONE = -1; TaskMonitor monitor = TaskMonitor.DUMMY; - EditStructureUtils structUtils; RecoveredClass(String name, CategoryPath classPath, Namespace classNamespace, @@ -105,7 +104,6 @@ public class RecoveredClass { this.classNamespace = classNamespace; this.dataTypeManager = dataTypeManager; - this.structUtils = new EditStructureUtils(); } public String getName() { @@ -531,11 +529,11 @@ public class RecoveredClass { // if the new component is a non-empty structure, check to see if the current // structure has undefined or equivalent components and replace with new struct if so if (newComponentDataType instanceof Structure) { - if (structUtils.hasReplaceableComponentsAtOffset(computedClassStructure, + if (EditStructureUtils.hasReplaceableComponentsAtOffset(computedClassStructure, offset, (Structure) newComponentDataType, monitor)) { boolean successfulClear = - structUtils.clearLengthAtOffset(computedClassStructure, offset, + EditStructureUtils.clearLengthAtOffset(computedClassStructure, offset, length, monitor); if (successfulClear) { @@ -547,13 +545,14 @@ public class RecoveredClass { } // if current component is undefined size 1 and new component is not undefined size 1 - // then replace it - if (structUtils.isUndefined1(currentComponentDataType) && - !structUtils.isUndefined1(newComponentDataType)) { - if (structUtils.hasEnoughUndefinedsOfAnyLengthAtOffset(computedClassStructure, + // and there are enough undefineds for it to fit, then replace it + if (EditStructureUtils.isUndefined1(currentComponentDataType) && + !EditStructureUtils.isUndefined1(newComponentDataType)) { + if (EditStructureUtils.hasEnoughUndefinedsOfAnyLengthAtOffset( + computedClassStructure, offset, length, monitor)) { boolean successfulClear = - structUtils.clearLengthAtOffset(computedClassStructure, offset, + EditStructureUtils.clearLengthAtOffset(computedClassStructure, offset, length, monitor); if (successfulClear) { @@ -567,13 +566,14 @@ public class RecoveredClass { // if new component is not an undefined data type and the current componenent(s) // that make up new component length are all undefineds then clear and replace // the current component(s) with the new one - if (structUtils.isUndefined(currentComponentDataType) && - !structUtils.isUndefined(newComponentDataType)) { + if (Undefined.isUndefined(currentComponentDataType) && + !Undefined.isUndefined(newComponentDataType)) { - if (structUtils.hasEnoughUndefinedsOfAnyLengthAtOffset(computedClassStructure, + if (EditStructureUtils.hasEnoughUndefinedsOfAnyLengthAtOffset( + computedClassStructure, offset, length, monitor)) { boolean successfulClear = - structUtils.clearLengthAtOffset(computedClassStructure, offset, + EditStructureUtils.clearLengthAtOffset(computedClassStructure, offset, length, monitor); if (successfulClear) { @@ -601,7 +601,7 @@ public class RecoveredClass { continue; } - if (structUtils.isUndefined1(dataType)) { + if (EditStructureUtils.isUndefined1(dataType)) { dataType = new Undefined1DataType(); DataTypeComponent component = computedClassStructure.getComponentAt(offset.intValue()); diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClassUtils.java b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClassUtils.java index 175292e794..5dcf062fc0 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClassUtils.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClassUtils.java @@ -130,8 +130,7 @@ public class RecoveredClassUtils { int defaultPointerSize; SymbolTable symbolTable; - ExtraScriptUtils extraUtils; - EditStructureUtils structUtils; + ExtendedFlatProgramAPI extendedFlatAPI; DecompilerScriptUtils decompilerUtils; CategoryPath classDataTypesCategoryPath; @@ -156,10 +155,10 @@ public class RecoveredClassUtils { this.tool = tool; this.api = api; - extraUtils = new ExtraScriptUtils(program, monitor); + extendedFlatAPI = new ExtendedFlatProgramAPI(program, monitor); this.classDataTypesCategoryPath = - extraUtils.createDataTypeCategoryPath(CategoryPath.ROOT, DTM_CLASS_DATA_FOLDER_NAME); + extendedFlatAPI.createDataTypeCategoryPath(CategoryPath.ROOT, DTM_CLASS_DATA_FOLDER_NAME); this.createBookmarks = createBookmarks; this.useShortTemplates = useShortTemplates; @@ -169,7 +168,6 @@ public class RecoveredClassUtils { globalNamespace = (GlobalNamespace) program.getGlobalNamespace(); decompilerUtils = new DecompilerScriptUtils(program, tool, monitor); - structUtils = new EditStructureUtils(); dataTypeManager = program.getDataTypeManager(); symbolTable = program.getSymbolTable(); @@ -416,7 +414,7 @@ public class RecoveredClassUtils { if (allConstructorsAndDestructors.contains(calledFunction)) { // get list of refs to this function from the calling function List
referencesToFunctionBFromFunctionA = - extraUtils.getReferencesToFunctionBFromFunctionA(function, + extendedFlatAPI.getReferencesToFunctionBFromFunctionA(function, referencedFunction); // add them to list of ref address pairs Iterator
iterator = referencesToFunctionBFromFunctionA.iterator(); @@ -684,7 +682,7 @@ public class RecoveredClassUtils { monitor.checkCanceled(); Address vftableRef = vftableRefIterator.next(); - Address vftableAddress = extraUtils.getSingleReferencedAddress(vftableRef); + Address vftableAddress = extendedFlatAPI.getSingleReferencedAddress(vftableRef); if (vftableAddress == null) { continue; @@ -1264,11 +1262,11 @@ public class RecoveredClassUtils { DataType dataType = function.getParameter(i).getDataType(); - if (!extraUtils.isPointerToEmptyStructure(dataType)) { + if (!extendedFlatAPI.isPointerToEmptyStructure(dataType)) { continue; } - PointerDataType ptrUndefined = extraUtils.createPointerToUndefinedDataType(dataType); + PointerDataType ptrUndefined = extendedFlatAPI.createPointerToUndefinedDataType(dataType); if (ptrUndefined != null) { function.getParameter(i).setDataType(ptrUndefined, SourceType.ANALYSIS); } @@ -1277,9 +1275,9 @@ public class RecoveredClassUtils { // Next check the return type to see if it is the empty structure DataType returnType = function.getReturnType(); - if (extraUtils.isPointerToEmptyStructure(returnType)) { + if (extendedFlatAPI.isPointerToEmptyStructure(returnType)) { PointerDataType ptrUndefined = - extraUtils.createPointerToUndefinedDataType(returnType); + extendedFlatAPI.createPointerToUndefinedDataType(returnType); if (ptrUndefined != null) { function.setReturnType(ptrUndefined, SourceType.ANALYSIS); } @@ -1694,7 +1692,7 @@ public class RecoveredClassUtils { return possibleParentConstructors; } - Address minVftableReference = extraUtils.getMinimumAddressOnList(vftableReferenceList); + Address minVftableReference = extendedFlatAPI.getMinimumAddressOnList(vftableReferenceList); Iterator iterator = refAddrPairList.iterator(); while (iterator.hasNext()) { @@ -1768,7 +1766,7 @@ public class RecoveredClassUtils { return possibleParentDestructors; } - Address maxVftableReference = extraUtils.getMaximumAddressOnList(vftableReferenceList); + Address maxVftableReference = extendedFlatAPI.getMaximumAddressOnList(vftableReferenceList); Iterator iterator = refAddrPairList.iterator(); while (iterator.hasNext()) { @@ -1776,7 +1774,7 @@ public class RecoveredClassUtils { ReferenceAddressPair refAddrPair = iterator.next(); Address sourceAddr = refAddrPair.getSource(); if (sourceAddr.compareTo(maxVftableReference) > 0) { - Function calledFunction = extraUtils.getFunctionAt(refAddrPair.getDestination()); + Function calledFunction = extendedFlatAPI.getFunctionAt(refAddrPair.getDestination()); if (calledFunction != null) { possibleParentDestructors.add(calledFunction); } @@ -1960,7 +1958,7 @@ public class RecoveredClassUtils { } // If not already, make function a thiscall - extraUtils.makeFunctionThiscall(constructorFunction); + extendedFlatAPI.makeFunctionThiscall(constructorFunction); recoveredClass.addConstructor(constructorFunction); addToAllConstructors(constructorFunction); @@ -1978,7 +1976,7 @@ public class RecoveredClassUtils { throws InvalidInputException, DuplicateNameException { //If not already, make function a thiscall - extraUtils.makeFunctionThiscall(inlinedConstructorFunction); + extendedFlatAPI.makeFunctionThiscall(inlinedConstructorFunction); recoveredClass.addInlinedConstructor(inlinedConstructorFunction); addToAllInlinedConstructors(inlinedConstructorFunction); @@ -1995,7 +1993,7 @@ public class RecoveredClassUtils { throws InvalidInputException, DuplicateNameException { //If not already, make function a thiscall - extraUtils.makeFunctionThiscall(destructorFunction); + extendedFlatAPI.makeFunctionThiscall(destructorFunction); recoveredClass.addDestructor(destructorFunction); addToAllDestructors(destructorFunction); @@ -2013,7 +2011,7 @@ public class RecoveredClassUtils { throws InvalidInputException, DuplicateNameException { //If not already, make function a thiscall - extraUtils.makeFunctionThiscall(inlinedDestructorFunction); + extendedFlatAPI.makeFunctionThiscall(inlinedDestructorFunction); recoveredClass.addInlinedDestructor(inlinedDestructorFunction); addToAllInlinedDestructors(inlinedDestructorFunction); @@ -2098,7 +2096,7 @@ public class RecoveredClassUtils { Address constructorReference = constructorIterator.next(); RecoveredClass recoveredClass = referenceToClassMap.get(constructorReference); - Function constructor = extraUtils.getReferencedFunction(constructorReference, true); + Function constructor = extendedFlatAPI.getReferencedFunction(constructorReference, true); if (recoveredClass.getIndeterminateList().contains(constructor)) { addConstructorToClass(recoveredClass, constructor); @@ -2295,7 +2293,7 @@ public class RecoveredClassUtils { ReferenceAddressPair referenceAddressPair = calledFunctionIterator.next(); Address calledFunctionAddress = referenceAddressPair.getDestination(); - Function calledFunction = extraUtils.getFunctionAt(calledFunctionAddress); + Function calledFunction = extendedFlatAPI.getFunctionAt(calledFunctionAddress); if (calledFunction.isThunk()) { calledFunction = calledFunction.getThunkedFunction(true); @@ -2329,7 +2327,7 @@ public class RecoveredClassUtils { ReferenceAddressPair referenceAddressPair = calledFunctionIterator.next(); Address calledFunctionAddress = referenceAddressPair.getDestination(); - Function calledFunction = extraUtils.getFunctionAt(calledFunctionAddress); + Function calledFunction = extendedFlatAPI.getFunctionAt(calledFunctionAddress); if (calledFunction.isThunk()) { calledFunction = calledFunction.getThunkedFunction(true); @@ -2542,7 +2540,7 @@ public class RecoveredClassUtils { Address destructorReference = destructorIterator.next(); RecoveredClass recoveredClass = referenceToClassMap.get(destructorReference); - Function destructor = extraUtils.getReferencedFunction(destructorReference, true); + Function destructor = extendedFlatAPI.getReferencedFunction(destructorReference, true); if (recoveredClass.getIndeterminateList().contains(destructor)) { addDestructorToClass(recoveredClass, destructor); @@ -2668,7 +2666,7 @@ public class RecoveredClassUtils { String className = namespace.getName(); String classNameWithNamespace = namespace.getName(true); - CategoryPath classPath = extraUtils.createDataTypeCategoryPath(classDataTypesCategoryPath, + CategoryPath classPath = extendedFlatAPI.createDataTypeCategoryPath(classDataTypesCategoryPath, classNameWithNamespace); RecoveredClass newClass = @@ -2873,7 +2871,7 @@ public class RecoveredClassUtils { while (referencesIterator.hasNext()) { monitor.checkCanceled(); Address vftableReference = referencesIterator.next(); - Function functionContaining = extraUtils.getFunctionContaining(vftableReference); + Function functionContaining = extendedFlatAPI.getFunctionContaining(vftableReference); if (functionContaining != null) { vftableRefToFunctionMapping.put(vftableReference, functionContaining); } @@ -2923,7 +2921,7 @@ public class RecoveredClassUtils { Data vftableData = program.getListing().getDefinedDataAt(vftableAddress); // now make sure the array or the structure is all pointers - if (!extraUtils.isArrayOrStructureOfAllPointers(vftableData)) { + if (!extendedFlatAPI.isArrayOrStructureOfAllPointers(vftableData)) { // if it isn't an array of pointers then we don't know the size of the vftable // If undefined or pointers not in array or struct then see if what they are // pointing to are in the class already to determine size of array @@ -2957,12 +2955,12 @@ public class RecoveredClassUtils { monitor.checkCanceled(); Address functionPointerAddress = vftableData.getComponent(i).getAddress(); - if (allowNullFunctionPtrs && extraUtils.isNullPointer(functionPointerAddress)) { + if (allowNullFunctionPtrs && extendedFlatAPI.isNullPointer(functionPointerAddress)) { virtualFunctionList.add(null); continue; } - Function function = extraUtils.getPointedToFunction(functionPointerAddress); + Function function = extendedFlatAPI.getPointedToFunction(functionPointerAddress); if (function != null) { virtualFunctionList.add(function); @@ -3009,7 +3007,7 @@ public class RecoveredClassUtils { boolean stillInCurrentTable = true; while (address != null && currentBlock.contains(address) && stillInCurrentTable && - extraUtils.isFunctionPointer(address, allowNullFunctionPtrs)) { + extendedFlatAPI.isFunctionPointer(address, allowNullFunctionPtrs)) { numFunctionPointers++; address = address.add(defaultPointerSize); Symbol symbol = program.getSymbolTable().getPrimarySymbol(address); @@ -3098,7 +3096,7 @@ public class RecoveredClassUtils { program.getListing().getInstructionContaining(vftableReference); if (instructionContaining != null) { boolean functionCreated = - extraUtils.createFunction(program, vftableReference); + extendedFlatAPI.createFunction(program, vftableReference); if (!functionCreated) { notInFunctionVftableRefs.add(vftableReference); @@ -3154,7 +3152,7 @@ public class RecoveredClassUtils { } else { boolean functionCreated = - extraUtils.createFunction(prog, addr); + extendedFlatAPI.createFunction(prog, addr); if (!functionCreated) { notInFunctionVftableRefs.add(addr); } @@ -3819,7 +3817,7 @@ public class RecoveredClassUtils { if (!badFIDNamespaces.contains(symbol.getParentNamespace())) { badFIDNamespaces.add(symbol.getParentNamespace()); } - extraUtils.addUniqueStringToPlateComment(functionAddress, + extendedFlatAPI.addUniqueStringToPlateComment(functionAddress, "***** Removed Bad FID Symbol *****"); if (!badFIDFunctions.contains(function)) { @@ -3827,7 +3825,7 @@ public class RecoveredClassUtils { } findAndRemoveBadStructuresFromFunction(function, namespace); - extraUtils.removeAllSymbolsAtAddress(functionAddress); + extendedFlatAPI.removeAllSymbolsAtAddress(functionAddress); } return; @@ -3838,7 +3836,7 @@ public class RecoveredClassUtils { if (bookmarkComment.contains("Multiple Matches")) { // See if any contain the class name and if so add "resolved" and if not if (doAnySymbolsHaveMatchingName(functionAddress, name)) { - extraUtils.addUniqueStringToPlateComment(functionAddress, + extendedFlatAPI.addUniqueStringToPlateComment(functionAddress, "***** Resolved FID Conflict *****"); if (!resolvedFIDFunctions.contains(function)) { @@ -3848,7 +3846,7 @@ public class RecoveredClassUtils { findAndRemoveBadStructuresFromFunction(function, namespace); } else { - extraUtils.addUniqueStringToPlateComment(functionAddress, + extendedFlatAPI.addUniqueStringToPlateComment(functionAddress, "***** Removed Bad FID Symbol(s) *****"); if (!badFIDFunctions.contains(function)) { @@ -3858,7 +3856,7 @@ public class RecoveredClassUtils { findAndRemoveBadStructuresFromFunction(function, namespace); } - extraUtils.removeAllSymbolsAtAddress(functionAddress); + extendedFlatAPI.removeAllSymbolsAtAddress(functionAddress); return; } } @@ -3971,7 +3969,7 @@ public class RecoveredClassUtils { monitor.checkCanceled(); DataType dataType = function.getParameter(i).getDataType(); if (!dataType.getName().equals(namespace.getName()) && - extraUtils.isPointerToEmptyStructure(dataType)) { + extendedFlatAPI.isPointerToEmptyStructure(dataType)) { Pointer ptr = (Pointer) dataType; Structure structure = (Structure) ptr.getDataType(); @@ -4001,7 +3999,7 @@ public class RecoveredClassUtils { for (int i = 0; i < parameterCount; i++) { monitor.checkCanceled(); DataType paramDataType = function.getParameter(i).getDataType(); - Structure baseDataType = extraUtils.getBaseStructureDataType(paramDataType); + Structure baseDataType = extendedFlatAPI.getBaseStructureDataType(paramDataType); if (baseDataType != null && badStructureDataTypes.contains(baseDataType)) { // To remove from this param we have to remove the function from its namespace @@ -4011,7 +4009,7 @@ public class RecoveredClassUtils { } else { PointerDataType ptrUndefined = - extraUtils.createPointerToUndefinedDataType(paramDataType); + extendedFlatAPI.createPointerToUndefinedDataType(paramDataType); if (ptrUndefined != null) { function.getParameter(i).setDataType(ptrUndefined, SourceType.ANALYSIS); } @@ -4036,7 +4034,7 @@ public class RecoveredClassUtils { DataType returnType = function.getReturnType(); if (!returnType.getName().equals(namespace.getName()) && - extraUtils.isPointerToEmptyStructure(returnType)) { + extendedFlatAPI.isPointerToEmptyStructure(returnType)) { Pointer ptr = (Pointer) returnType; Structure structure = (Structure) ptr.getDataType(); @@ -4058,10 +4056,10 @@ public class RecoveredClassUtils { throws InvalidInputException { DataType returnType = function.getReturnType(); - Structure baseDataType = extraUtils.getBaseStructureDataType(returnType); + Structure baseDataType = extendedFlatAPI.getBaseStructureDataType(returnType); if (baseDataType != null && badStructureDataTypes.contains(baseDataType)) { PointerDataType ptrUndefined = - extraUtils.createPointerToUndefinedDataType(returnType); + extendedFlatAPI.createPointerToUndefinedDataType(returnType); if (ptrUndefined != null) { function.setReturnType(ptrUndefined, SourceType.ANALYSIS); } @@ -4080,13 +4078,13 @@ public class RecoveredClassUtils { private boolean doAnySymbolsHaveMatchingName(Address address, String name) throws CancelledException { - String simpleName = extraUtils.removeTemplate(name); + String simpleName = extendedFlatAPI.removeTemplate(name); SymbolIterator it = symbolTable.getSymbolsAsIterator(address); for (Symbol symbol : it) { monitor.checkCanceled(); - String simpleSymbolName = extraUtils.removeTemplate(symbol.getName()); + String simpleSymbolName = extendedFlatAPI.removeTemplate(symbol.getName()); simpleSymbolName = removeSingleQuotes(simpleSymbolName); simpleSymbolName = removeFIDConflict(simpleSymbolName); simpleSymbolName = removeSingleQuotes(simpleSymbolName); @@ -4178,7 +4176,7 @@ public class RecoveredClassUtils { throws CancelledException { List orderedReferenceAddressPairsFromCallingFunction = - extraUtils.getOrderedReferenceAddressPairsFromCallingFunction(constructor); + extendedFlatAPI.getOrderedReferenceAddressPairsFromCallingFunction(constructor); // if there are no calls from the function then return false if (orderedReferenceAddressPairsFromCallingFunction.size() == 0) { @@ -4252,9 +4250,9 @@ public class RecoveredClassUtils { monitor.checkCanceled(); Function vfunction = vfunctionIterator.next(); - if (extraUtils.doesFunctionACallAnyListedFunction(vfunction, + if (extendedFlatAPI.doesFunctionACallAnyListedFunction(vfunction, recoveredClass.getConstructorList()) && - !extraUtils.doesFunctionACallAnyListedFunction(vfunction, + !extendedFlatAPI.doesFunctionACallAnyListedFunction(vfunction, allOtherConstructors)) { cloneToClassMap.put(vfunction, recoveredClass); } @@ -4297,13 +4295,13 @@ public class RecoveredClassUtils { if (calledFunctions.size() != 2 && calledFunctions.size() != 3) { return false; } - if (!extraUtils.getCalledFunctionByCallOrder(caller, 1).equals(firstCalled)) { + if (!extendedFlatAPI.getCalledFunctionByCallOrder(caller, 1).equals(firstCalled)) { return false; } RecoveredClass recoveredClass = cloneFunctionToClassMap.get(caller); List constructorList = recoveredClass.getConstructorList(); - Function secondFunction = extraUtils.getCalledFunctionByCallOrder(caller, 2); + Function secondFunction = extendedFlatAPI.getCalledFunctionByCallOrder(caller, 2); if (secondFunction.isThunk()) { secondFunction = secondFunction.getThunkedFunction(true); } @@ -4342,7 +4340,7 @@ public class RecoveredClassUtils { // The second call is a class constructor and we know it is called // from the cloneFunction or it wouldn't be a cloneFunction Function firstCalledFunction = - extraUtils.getCalledFunctionByCallOrder(cloneFunction, 1); + extendedFlatAPI.getCalledFunctionByCallOrder(cloneFunction, 1); if (firstCalledFunction == null) { continue; } @@ -4434,7 +4432,7 @@ public class RecoveredClassUtils { Namespace badNamespace = badNamespaceIterator.next(); // delete empty namespace and parent namespaces - if (!extraUtils.hasSymbolsInNamespace(badNamespace)) { + if (!extendedFlatAPI.hasSymbolsInNamespace(badNamespace)) { removeEmptyNamespaces(badNamespace); } } @@ -4455,7 +4453,7 @@ public class RecoveredClassUtils { Namespace parentNamespace = namespace.getParentNamespace(); namespace.getSymbol().delete(); - while (parentNamespace != null && !extraUtils.hasSymbolsInNamespace(parentNamespace)) { + while (parentNamespace != null && !extendedFlatAPI.hasSymbolsInNamespace(parentNamespace)) { monitor.checkCanceled(); namespace = parentNamespace; @@ -4500,7 +4498,7 @@ public class RecoveredClassUtils { throws CancelledException { DataType dataType = dataTypeManager.getDataType(folderPath, structureName); - if (extraUtils.isEmptyStructure(dataType)) { + if (extendedFlatAPI.isEmptyStructure(dataType)) { dataTypeManager.remove(dataType, monitor); Category classCategory = dataTypeManager.getCategory(folderPath); @@ -5335,7 +5333,7 @@ public class RecoveredClassUtils { } // get first called function and verify it is on cd list Function firstCalledFunction = - extraUtils.getCalledFunctionByCallOrder(deletingDestructor, 1); + extendedFlatAPI.getCalledFunctionByCallOrder(deletingDestructor, 1); if (firstCalledFunction == null || !recoveredClass.getConstructorOrDestructorFunctions() .contains( @@ -5345,7 +5343,7 @@ public class RecoveredClassUtils { // get second one and if operator_delete has not been assigned yet, assign it Function secondCalledFunction = - extraUtils.getCalledFunctionByCallOrder(deletingDestructor, 2); + extendedFlatAPI.getCalledFunctionByCallOrder(deletingDestructor, 2); if (secondCalledFunction == null) { return null; } @@ -5392,7 +5390,7 @@ public class RecoveredClassUtils { throws CancelledException, InvalidInputException, DuplicateNameException { // don't continue checking if it doesn't call operator_delete - if (!extraUtils.doesFunctionACallFunctionB(virtualFunction, operatorDeleteFunction)) { + if (!extendedFlatAPI.doesFunctionACallFunctionB(virtualFunction, operatorDeleteFunction)) { return; } @@ -5408,7 +5406,7 @@ public class RecoveredClassUtils { Function function = functionIterator.next(); //Type 4 - class c/d called from other than first vfunction - if (extraUtils.doesFunctionACallFunctionB(virtualFunction, function)) { + if (extendedFlatAPI.doesFunctionACallFunctionB(virtualFunction, function)) { recoveredClass.addDeletingDestructor(virtualFunction); addDestructorToClass(recoveredClass, function); recoveredClass.removeIndeterminateConstructorOrDestructor(function); @@ -5454,7 +5452,7 @@ public class RecoveredClassUtils { continue; } - Function referencedFunction = extraUtils.getReferencedFunction(codeUnitAddress, true); + Function referencedFunction = extendedFlatAPI.getReferencedFunction(codeUnitAddress, true); if (referencedFunction == null) { continue; } @@ -5580,7 +5578,7 @@ public class RecoveredClassUtils { String fieldname = dataTypeComponent.getFieldName(); - structureDataType = structUtils.addDataTypeToStructure(structureDataType, + structureDataType = EditStructureUtils.addDataTypeToStructure(structureDataType, startOffset + dataComponentOffset, dataTypeComponent.getDataType(), fieldname, monitor); } @@ -5609,7 +5607,7 @@ public class RecoveredClassUtils { String fieldname = dataTypeComponent.getFieldName(); - structureDataType = structUtils.addDataTypeToStructure(structureDataType, + structureDataType = EditStructureUtils.addDataTypeToStructure(structureDataType, startOffset + dataComponentOffset, dataTypeComponent.getDataType(), fieldname, monitor); } @@ -5913,9 +5911,9 @@ public class RecoveredClassUtils { // get first called function and verify is not a c/d function in current class or // any class get second called function and verify it is operator delete Function firstCalledFunction = - extraUtils.getCalledFunctionByCallOrder(vFunction, 1); + extendedFlatAPI.getCalledFunctionByCallOrder(vFunction, 1); Function secondCalledFunction = - extraUtils.getCalledFunctionByCallOrder(vFunction, 2); + extendedFlatAPI.getCalledFunctionByCallOrder(vFunction, 2); if (firstCalledFunction != null && secondCalledFunction != null && !recoveredClass.getConstructorOrDestructorFunctions() .contains( @@ -6197,7 +6195,7 @@ public class RecoveredClassUtils { Map referenceToClassMap = getReferenceToClassMap(recoveredClass, inlineFunction); List
referencesToFunctions = - extraUtils.getReferencesToFunctions(referenceToClassMap); + extendedFlatAPI.getReferencesToFunctions(referenceToClassMap); // if some of the references are to functions figure out if they are // constructors destructors or add them to list of indetermined @@ -6212,7 +6210,7 @@ public class RecoveredClassUtils { monitor.checkCanceled(); Address functionReference = functionReferenceIterator.next(); Function function = - extraUtils.getReferencedFunction(functionReference, true); + extendedFlatAPI.getReferencedFunction(functionReference, true); if (function == null) { continue; } @@ -6342,7 +6340,7 @@ public class RecoveredClassUtils { } int dataLength = - structUtils.getNumberOfUndefinedsBeforeOffset(structure, endOfData, monitor); + EditStructureUtils.getNumberOfUndefinedsBeforeOffset(structure, endOfData, monitor); if (dataLength < 0) { return NONE; } @@ -6378,7 +6376,7 @@ public class RecoveredClassUtils { boolean callsKnownConstructor = callsKnownConstructor(indeterminateFunction); boolean callsKnownDestrutor = callsKnownDestructor(indeterminateFunction); boolean callsAtexit = - extraUtils.doesFunctionACallFunctionB(indeterminateFunction, atexit); + extendedFlatAPI.doesFunctionACallFunctionB(indeterminateFunction, atexit); if (callsKnownConstructor && !callsKnownDestrutor) { addConstructorToClass(recoveredClass, indeterminateFunction); @@ -6486,7 +6484,7 @@ public class RecoveredClassUtils { public void findFunctionsUsingAtexit() throws CancelledException, InvalidInputException { Function atexitFunction = null; - List atexitFunctions = extraUtils.getGlobalFunctions("_atexit"); + List atexitFunctions = extendedFlatAPI.getGlobalFunctions("_atexit"); if (atexitFunctions.size() != 1) { return; } @@ -6501,13 +6499,13 @@ public class RecoveredClassUtils { Reference ref = referenceIterator.next(); Address fromAddress = ref.getFromAddress(); - Function function = extraUtils.getFunctionContaining(fromAddress); + Function function = extendedFlatAPI.getFunctionContaining(fromAddress); if (function == null) { AddressSet subroutineAddresses = - extraUtils.getSubroutineAddresses(program, fromAddress); + extendedFlatAPI.getSubroutineAddresses(program, fromAddress); Address minAddress = subroutineAddresses.getMinAddress(); - function = extraUtils.createFunction(minAddress, null); + function = extendedFlatAPI.createFunction(minAddress, null); if (function == null) { continue; } @@ -6542,9 +6540,9 @@ public class RecoveredClassUtils { continue; } - Function calledFunction = extraUtils.getFunctionAt(calledAddress); + Function calledFunction = extendedFlatAPI.getFunctionAt(calledAddress); if (calledFunction == null) { - calledFunction = extraUtils.createFunction(calledAddress, null); + calledFunction = extendedFlatAPI.createFunction(calledAddress, null); if (calledFunction == null) { continue; } @@ -6595,7 +6593,7 @@ public class RecoveredClassUtils { Address vftableAddress = vftableIterator.next(); // this gets the first function pointer in the vftable - Function firstVirtualFunction = extraUtils.getPointedToFunction(vftableAddress); + Function firstVirtualFunction = extendedFlatAPI.getPointedToFunction(vftableAddress); processDeletingDestructor(recoveredClass, firstVirtualFunction); } } @@ -6641,7 +6639,7 @@ public class RecoveredClassUtils { monitor.checkCanceled(); Address vftableAddress = vftableAddressIterator.next(); - Function firstVirtualFunction = extraUtils.getPointedToFunction(vftableAddress); + Function firstVirtualFunction = extendedFlatAPI.getPointedToFunction(vftableAddress); List virtualFunctions = recoveredClass.getVirtualFunctions(vftableAddress); @@ -6748,7 +6746,7 @@ public class RecoveredClassUtils { Function function = functionIterator.next(); - if (extraUtils.doesFunctionACallFunctionB(firstVirtualFunction, function)) { + if (extendedFlatAPI.doesFunctionACallFunctionB(firstVirtualFunction, function)) { recoveredClass.addDeletingDestructor(firstVirtualFunction); addDestructorToClass(recoveredClass, function); recoveredClass.removeIndeterminateConstructorOrDestructor(function); @@ -7113,7 +7111,7 @@ public class RecoveredClassUtils { // if the computed class struct has field name (ie from pdb) use it otherwise create one if (definedComponent.getFieldName() == null) { - fieldName = "offset_" + extraUtils.toHexString(offset, false, true); + fieldName = "offset_" + extendedFlatAPI.toHexString(offset, false, true); } else { fieldName = definedComponent.getFieldName(); @@ -7149,7 +7147,7 @@ public class RecoveredClassUtils { for (DataTypeComponent component : definedComponents) { monitor.checkCanceled(); - classStructureDataType = structUtils.addDataTypeToStructure( + classStructureDataType = EditStructureUtils.addDataTypeToStructure( classStructureDataType, component.getOffset(), component.getDataType(), component.getFieldName(), monitor); } @@ -7302,7 +7300,7 @@ public class RecoveredClassUtils { } String classNameWithNamespace = classNamespace.getName(true); - CategoryPath classPath = extraUtils.createDataTypeCategoryPath( + CategoryPath classPath = extendedFlatAPI.createDataTypeCategoryPath( classDataTypesCategoryPath, classNameWithNamespace); // check that the given vftable data type is in the right ClassDataTypes/