mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-25 12:49:39 +08:00
GP-6577: Fix for CHPE check
This commit is contained in:
+5
-12
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+24
-1
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user