mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 01:39:21 +02:00
GP-5948 Improved auto vt dupe match's operand equivalency check to account for internal function ref operands.
This commit is contained in:
parent
daec88be49
commit
f71ae463d2
1 changed files with 35 additions and 22 deletions
|
@ -89,14 +89,9 @@ public class AutoVersionTrackingTask extends Task {
|
|||
/**
|
||||
* Constructor for a modal/blocking AutoVersionTrackingTask
|
||||
*
|
||||
|
||||
* @param session The Version Tracking session containing the source, destination, correlator
|
||||
* and match information needed for this command.
|
||||
* @param toolOptions the options used when applying matches
|
||||
* @param minCombinedReferenceCorrelatorScore The minimum score used to limit matches created by
|
||||
* the Combined Reference Correlator.
|
||||
* @param minCombinedReferenceCorrelatorConfidence The minimum confidence used to limit matches
|
||||
* created by the Combined Reference Correlator.
|
||||
*/
|
||||
public AutoVersionTrackingTask(VTSession session, ToolOptions toolOptions) {
|
||||
super(NAME, true, true, true);
|
||||
|
@ -378,12 +373,10 @@ public class AutoVersionTrackingTask extends Task {
|
|||
}
|
||||
|
||||
/**
|
||||
* Method to create implied matches for the existing applied matches in the current session
|
||||
* @param applyGoodMatches if true, create applied matches for "good" implied matches based on
|
||||
* votes/conflict information. For all the applied implied matches, rerun the creation of
|
||||
* applied matches until no new ones found.
|
||||
* Method to create implied matches for the existing applied matches in the current session
|
||||
* @param applyGoodMatches if true, apply matches if minVotes met and maxConflicts not exceeded
|
||||
* for particular match, if false, don't apply any matches
|
||||
* for particular match, if false, don't apply any matches. For all the applied implied matches,
|
||||
* rerun the creation of applied matches until no new ones found.
|
||||
* @param minVotes minimum votes needed to apply a match
|
||||
* @param maxConflicts maximum conflicts allowed to apply a match
|
||||
* @param monitor the task monitor
|
||||
|
@ -646,7 +639,7 @@ public class AutoVersionTrackingTask extends Task {
|
|||
continue;
|
||||
}
|
||||
|
||||
if (hasAcceptedRelatedAssociation(association, monitor)) {
|
||||
if (hasAcceptedRelatedAssociation(association)) {
|
||||
Msg.warn(AutoVersionTrackingTask.class,
|
||||
"This association has a related association with an accepted match so cannot " +
|
||||
"make this association accepted which would try to block the already accepted " +
|
||||
|
@ -702,12 +695,11 @@ public class AutoVersionTrackingTask extends Task {
|
|||
* Method to test whether any related associations (ie associations with either the same source
|
||||
* or the same destination address) have already been accepted
|
||||
* @param association the given association (src/dest match pair)
|
||||
* @param taskMonitor the task monitor
|
||||
* @return true if any related associations have already been accepted, false otherwise
|
||||
* @throws CancelledException if cancelled
|
||||
*/
|
||||
private boolean hasAcceptedRelatedAssociation(VTAssociation association,
|
||||
TaskMonitor taskMonitor) throws CancelledException {
|
||||
private boolean hasAcceptedRelatedAssociation(VTAssociation association)
|
||||
throws CancelledException {
|
||||
|
||||
VTAssociationManager vtAssocManager = session.getAssociationManager();
|
||||
|
||||
|
@ -745,7 +737,7 @@ public class AutoVersionTrackingTask extends Task {
|
|||
* function pair association or it would have been identified as a unique match by the exact
|
||||
* unique function instruction correltor. This method attempts to find unique matches from
|
||||
* within the related subsets by comparing operand information.
|
||||
* @param matches The set of matches from the duplicate function instruction correlator
|
||||
* @param matchSet The set of matches from the duplicate function instruction correlator
|
||||
* @param monitor Allows user to cancel
|
||||
* @return true if there are any markup errors, false if no markup errors
|
||||
* @throws CancelledException if cancelled
|
||||
|
@ -1169,7 +1161,8 @@ public class AutoVersionTrackingTask extends Task {
|
|||
* Method to check to see if both addresses have functions at them or the same data type at them
|
||||
* @param addr1 the first Address
|
||||
* @param addr2 the second Address
|
||||
* @return
|
||||
* @return true if same operand type (ie both functions, both same data type, same internal
|
||||
* function reference
|
||||
*/
|
||||
private boolean isSameOperandType(Address addr1, Address addr2) {
|
||||
|
||||
|
@ -1179,9 +1172,22 @@ public class AutoVersionTrackingTask extends Task {
|
|||
if (function2 != null) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
// are both references to same offset in the mapped functions
|
||||
function1 = sourceProgram.getFunctionManager().getFunctionContaining(addr1);
|
||||
if (function1 != null) {
|
||||
Function function2 =
|
||||
destinationProgram.getFunctionManager().getFunctionContaining(addr2);
|
||||
if (function2 != null) {
|
||||
long offsetInFunction1 = getOffsetInFunction(function1, addr1);
|
||||
long offsetInFunction2 = getOffsetInFunction(function2, addr2);
|
||||
if (offsetInFunction1 == offsetInFunction2) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Data data1 = sourceProgram.getListing().getDataAt(addr1);
|
||||
|
@ -1275,9 +1281,7 @@ public class AutoVersionTrackingTask extends Task {
|
|||
// get offset from top of function to use in function to operandMap map
|
||||
// can be positive or negative offset (positive means instruction address is after
|
||||
// the entry address, negative means instruction address is before entry address)
|
||||
Long entryOffset = function.getEntryPoint().getOffset();
|
||||
Long instOffset = inst.getAddress().getOffset();
|
||||
Long offset = instOffset - entryOffset;
|
||||
long offset = getOffsetInFunction(function, inst.getAddress());
|
||||
|
||||
offsetToOperandsMap.put(offset, map);
|
||||
}
|
||||
|
@ -1289,6 +1293,15 @@ public class AutoVersionTrackingTask extends Task {
|
|||
return offsetToOperandsMap;
|
||||
}
|
||||
|
||||
private long getOffsetInFunction(Function function, Address addressInFunction) {
|
||||
|
||||
long entryOffset = function.getEntryPoint().getOffset();
|
||||
long addrOffset = addressInFunction.getOffset();
|
||||
long offset = addrOffset - entryOffset;
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to create offset/operand mapping for each function in match set
|
||||
* if more than one identical offset/operand mapping in src or dest piles then remove
|
||||
|
@ -1343,7 +1356,7 @@ public class AutoVersionTrackingTask extends Task {
|
|||
// skip already accepted or blocked matches
|
||||
if (association.getStatus() == VTAssociationStatus.AVAILABLE) {
|
||||
|
||||
if (hasAcceptedRelatedAssociation(association, monitor)) {
|
||||
if (hasAcceptedRelatedAssociation(association)) {
|
||||
Msg.warn(AutoVersionTrackingTask.class,
|
||||
"This association has a related association with an accepted match so cannot " +
|
||||
"make this association accepted which would try to block the already accepted " +
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue