Merge remote-tracking branch 'origin/GP-1502_emteere_FID_runningtwice' into patch

This commit is contained in:
Ryan Kurtz 2022-04-08 02:11:34 -04:00
commit e9674b6fde

View file

@ -15,16 +15,23 @@
*/ */
package ghidra.feature.fid.analyzer; package ghidra.feature.fid.analyzer;
import java.io.IOException;
import java.util.Iterator;
import ghidra.app.plugin.core.analysis.AutoAnalysisManager; import ghidra.app.plugin.core.analysis.AutoAnalysisManager;
import ghidra.app.services.*; import ghidra.app.services.*;
import ghidra.app.util.importer.MessageLog; import ghidra.app.util.importer.MessageLog;
import ghidra.feature.fid.cmd.ApplyFidEntriesCommand; import ghidra.feature.fid.cmd.ApplyFidEntriesCommand;
import ghidra.feature.fid.service.FidService; import ghidra.feature.fid.db.FidQueryService;
import ghidra.feature.fid.service.*;
import ghidra.framework.options.Options; import ghidra.framework.options.Options;
import ghidra.program.model.address.AddressSetView; import ghidra.program.model.address.AddressSetView;
import ghidra.program.model.listing.Function;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.model.mem.MemoryAccessException;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.exception.CancelledException; import ghidra.util.exception.CancelledException;
import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
/** /**
@ -105,6 +112,11 @@ public class FidAnalyzer extends AbstractAnalyzer {
Msg.warn(this, "No FID Libraries apply for language " + program.getLanguageID()); Msg.warn(this, "No FID Libraries apply for language " + program.getLanguageID());
return false; return false;
} }
if (!isFullExecutable(program, set)) {
return true;
}
ApplyFidEntriesCommand cmd; ApplyFidEntriesCommand cmd;
cmd = new ApplyFidEntriesCommand(set, scoreThreshold, multiScoreThreshold, cmd = new ApplyFidEntriesCommand(set, scoreThreshold, multiScoreThreshold,
alwaysApplyFidLabels, createBookmarksEnabled); alwaysApplyFidLabels, createBookmarksEnabled);
@ -112,11 +124,30 @@ public class FidAnalyzer extends AbstractAnalyzer {
// Name Change can change the nature of a function from a system // Name Change can change the nature of a function from a system
// library. Probably a better way to do this. // library. Probably a better way to do this.
AutoAnalysisManager.getAnalysisManager(program).functionModifierChanged( AutoAnalysisManager.getAnalysisManager(program)
cmd.getFIDLocations()); .functionModifierChanged(cmd.getFIDLocations());
return true; return true;
} }
/**
* Check if set contains the full executable or loaded/initialized memory areas.
*
* @param program program to check
* @param set set to check
* @return true if all program executable or load/initialized memory is in set
*/
private boolean isFullExecutable(Program program, AddressSetView set) {
// if has an execute set, then set to FID, must contain the execute set
AddressSetView executeSet = program.getMemory().getExecuteSet();
if (!executeSet.isEmpty()) {
return set.contains(executeSet);
}
// if there are no execute blocks, then use loaded/initialized for program blocks
AddressSetView loadSet = program.getMemory().getLoadedAndInitializedAddressSet();
return set.contains(loadSet);
}
@Override @Override
public void registerOptions(Options options, Program program) { public void registerOptions(Options options, Program program) {
options.registerOption(SCORE_THRESHOLD_OPTION_NAME, service.getDefaultScoreThreshold(), options.registerOption(SCORE_THRESHOLD_OPTION_NAME, service.getDefaultScoreThreshold(),