diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ExceptionDataDirectory.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ExceptionDataDirectory.java index e35f2169ed..c83f17665a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ExceptionDataDirectory.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ExceptionDataDirectory.java @@ -29,9 +29,12 @@ import ghidra.util.task.TaskMonitor; public class ExceptionDataDirectory extends DataDirectory { private final static String NAME = "IMAGE_DIRECTORY_ENTRY_EXCEPTION"; + private LoadConfigDirectory lcDir; private ImageRuntimeFunctionEntries functionEntries; - ExceptionDataDirectory(NTHeader ntHeader, BinaryReader reader) throws IOException { + ExceptionDataDirectory(NTHeader ntHeader, BinaryReader reader, LoadConfigDirectory lcDir) + throws IOException { + this.lcDir = lcDir; processDataDirectory(ntHeader, reader); } @@ -52,7 +55,7 @@ public class ExceptionDataDirectory extends DataDirectory { try { FileHeader fileHeader = ntHeader.getFileHeader(); - boolean isChpe = isChpe(fileHeader); + boolean isChpe = lcDir != null && lcDir.getChpeMetadataPointer() != 0; if (fileHeader.isX86() && !isChpe) { functionEntries = new ImageRuntimeFunctionEntries_X86(reader, size, ntHeader); } @@ -90,14 +93,4 @@ public class ExceptionDataDirectory extends DataDirectory { functionEntries.markup(program, addr); } } - - private boolean isChpe(FileHeader fileHeader) { - DataDirectory[] dirs = ntHeader.getOptionalHeader().getDataDirectories(); - if (dirs.length > OptionalHeader.IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG) { - LoadConfigDataDirectory dataDir = - (LoadConfigDataDirectory) dirs[OptionalHeader.IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG]; - return dataDir.getLoadConfigDirectory().getChpeMetadataPointer() != 0; - } - return false; - } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/OptionalHeader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/OptionalHeader.java index 48cf8620ad..b71c838922 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/OptionalHeader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/OptionalHeader.java @@ -425,7 +425,8 @@ public class OptionalHeader implements StructConverter { monitor.setMessage("Parsing exceptions..."); try { - dataDirectory[ndata] = new ExceptionDataDirectory(ntHeader, reader); + dataDirectory[ndata] = new ExceptionDataDirectory(ntHeader, reader, + processLoadConfig(ntHeader, log, monitor)); } catch (RuntimeException re) { if (PortableExecutable.DEBUG) { @@ -881,6 +882,28 @@ public class OptionalHeader implements StructConverter { return dataDirectory; } + /** + * Parses the {@link LoadConfigDataDirectory} and returns its {@link LoadConfigDirectory} + * + * @param nt The {@link NTHeader} + * @param log The log + * @param monitor The monitor + * @return the parsed {@link LoadConfigDirectory} + * @throws IOException if an IO-related error occurred + */ + public LoadConfigDirectory processLoadConfig(NTHeader nt, MessageLog log, TaskMonitor monitor) + throws IOException { + + if (IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG >= numberOfRvaAndSizes) { + return null; + } + + BinaryReader r = reader.clone(startOfDataDirs + IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG * 8); + LoadConfigDataDirectory dataDir = new LoadConfigDataDirectory(nt, r); + + return dataDir.parse() ? dataDir.getLoadConfigDirectory() : null; + } + @Override public DataType toDataType() throws DuplicateNameException { StructureDataType ddstruct = new StructureDataType(DataDirectory.TITLE, 0);