mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-02-16 07:30:16 +00:00
Merge remote-tracking branch
'origin/GP-4459_ghidra007_windows_rtti_null_ptr' into patch (Closes #6348)
This commit is contained in:
commit
10a63ab38f
@ -16,14 +16,7 @@
|
||||
//DO NOT RUN. THIS IS NOT A SCRIPT! THIS IS A CLASS THAT IS USED BY SCRIPTS.
|
||||
package classrecovery;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
|
||||
import ghidra.app.plugin.core.decompile.actions.FillOutStructureCmd;
|
||||
import ghidra.app.plugin.core.decompile.actions.FillOutStructureCmd.OffsetPcodeOpPair;
|
||||
@ -31,41 +24,17 @@ import ghidra.app.util.opinion.PeLoader;
|
||||
import ghidra.app.util.opinion.PeLoader.CompilerOpinion.CompilerEnum;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.program.flatapi.FlatProgramAPI;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.address.AddressOutOfBoundsException;
|
||||
import ghidra.program.model.address.AddressRange;
|
||||
import ghidra.program.model.address.AddressSet;
|
||||
import ghidra.program.model.address.AddressSetView;
|
||||
import ghidra.program.model.data.ArrayDataType;
|
||||
import ghidra.program.model.data.Category;
|
||||
import ghidra.program.model.data.CategoryPath;
|
||||
import ghidra.program.model.data.DataType;
|
||||
import ghidra.program.model.data.DataTypeConflictHandler;
|
||||
import ghidra.program.model.data.IntegerDataType;
|
||||
import ghidra.program.model.data.PointerDataType;
|
||||
import ghidra.program.model.data.Structure;
|
||||
import ghidra.program.model.data.StructureDataType;
|
||||
import ghidra.program.model.listing.CircularDependencyException;
|
||||
import ghidra.program.model.listing.Data;
|
||||
import ghidra.program.model.listing.FlowOverride;
|
||||
import ghidra.program.model.listing.Function;
|
||||
import ghidra.program.model.listing.Instruction;
|
||||
import ghidra.program.model.listing.Program;
|
||||
import ghidra.program.model.address.*;
|
||||
import ghidra.program.model.data.*;
|
||||
import ghidra.program.model.listing.*;
|
||||
import ghidra.program.model.mem.MemoryAccessException;
|
||||
import ghidra.program.model.mem.MemoryBlock;
|
||||
import ghidra.program.model.pcode.HighFunction;
|
||||
import ghidra.program.model.pcode.HighVariable;
|
||||
import ghidra.program.model.symbol.Namespace;
|
||||
import ghidra.program.model.symbol.Reference;
|
||||
import ghidra.program.model.symbol.SourceType;
|
||||
import ghidra.program.model.symbol.Symbol;
|
||||
import ghidra.program.model.symbol.SymbolIterator;
|
||||
import ghidra.program.model.symbol.SymbolType;
|
||||
import ghidra.program.model.symbol.*;
|
||||
import ghidra.program.util.ProgramLocation;
|
||||
import ghidra.util.Msg;
|
||||
import ghidra.util.exception.CancelledException;
|
||||
import ghidra.util.exception.DuplicateNameException;
|
||||
import ghidra.util.exception.InvalidInputException;
|
||||
import ghidra.util.exception.*;
|
||||
import ghidra.util.task.TaskMonitor;
|
||||
|
||||
public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer {
|
||||
@ -2405,10 +2374,10 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer {
|
||||
recoveredClass.getVftableAddresses().size() > 1 &&
|
||||
recoveredClass.inheritsVirtualAncestor()) {
|
||||
|
||||
int virtParentOffset = getSingleVirtualParentOffset(baseClass);
|
||||
Integer virtParentOffset = getSingleVirtualParentOffset(baseClass);
|
||||
|
||||
int dataLength;
|
||||
if (virtParentOffset == NONE) {
|
||||
if (virtParentOffset == null || virtParentOffset == NONE) {
|
||||
dataLength = baseClassStructure.getLength();
|
||||
}
|
||||
else {
|
||||
@ -2526,7 +2495,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer {
|
||||
* @param recoveredClass the given class
|
||||
* @return the offset in the given class structure of the classes single virtual parent or NONE
|
||||
* if cannot retrieve an offset value or if there is not a single virtual parent for the given
|
||||
* class.
|
||||
* class. Return null if cannot retrieve the offset for the single virtual parent.
|
||||
* @throws CancelledException if cancelled
|
||||
* @throws AddressOutOfBoundsException if trying to access an address that does not exist in program
|
||||
* @throws MemoryAccessException if trying to access memory that can't be accessed
|
||||
@ -2548,7 +2517,7 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer {
|
||||
private Map<RecoveredClass, Integer> getBaseClassOffsetMap(RecoveredClass recoveredClass)
|
||||
throws CancelledException, MemoryAccessException, AddressOutOfBoundsException {
|
||||
|
||||
Map<RecoveredClass, Integer> parentOffsetMap = new HashMap<RecoveredClass, Integer>();
|
||||
Map<RecoveredClass, Integer> baseClassOffsetMap = new HashMap<>();
|
||||
|
||||
Data baseClassArrayData = getBaseClassArray(recoveredClass);
|
||||
|
||||
@ -2574,9 +2543,8 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer {
|
||||
baseClassDescriptorAddress.toString());
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// Continue if the class has mult inh but base class is not on the parent list
|
||||
//TODO: possibly update to include all base classes
|
||||
if (!recoveredClass.getParentList().contains(baseClass)) {
|
||||
continue;
|
||||
}
|
||||
@ -2599,9 +2567,9 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer {
|
||||
}
|
||||
baseClassOffset = api.getInt(recoveredClass.getVbtableAddress().add(vdisp)) + pdisp;
|
||||
}
|
||||
parentOffsetMap.put(baseClass, baseClassOffset);
|
||||
baseClassOffsetMap.put(baseClass, baseClassOffset);
|
||||
}
|
||||
return parentOffsetMap;
|
||||
return baseClassOffsetMap;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user