mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-22 06:52:41 +08:00
Merge remote-tracking branch 'origin/GP-0-dragonmacher-test-fixes-3-31-23'
This commit is contained in:
+14
-24
@@ -38,19 +38,19 @@ import ghidra.util.UserSearchUtils;
|
||||
import ghidra.util.task.TaskMonitor;
|
||||
|
||||
/**
|
||||
* This class attempts to search for text as it is rendered on the screen. This in in
|
||||
* contrast to the Program Database Searcher which searches the database. This is
|
||||
* needed because some information on the screen is rendered "on the fly" and not
|
||||
* stored in the database. This searcher is much slower, but delivers
|
||||
* This class attempts to search for text as it is rendered on the screen. This in in
|
||||
* contrast to the Program Database Searcher which searches the database. This is
|
||||
* needed because some information on the screen is rendered "on the fly" and not
|
||||
* stored in the database. This searcher is much slower, but delivers
|
||||
* results that are in-line with what the user sees.
|
||||
* <p>
|
||||
* The search is performed in two steps. First it uses Instruction and Data iterators to
|
||||
* The search is performed in two steps. First it uses Instruction and Data iterators to
|
||||
* find possible addresses where where information would be rendered. Then for each of those
|
||||
* addresses, it uses the code browsers rendering engine to produce a textual representation
|
||||
* for that address. The textual representation also maintains information about the field
|
||||
* that generated it so that the search can be constrained to specific fields such as the
|
||||
* label or comment field.
|
||||
*
|
||||
* label or comment field.
|
||||
*
|
||||
*/
|
||||
class ListingDisplaySearcher implements Searcher {
|
||||
|
||||
@@ -80,7 +80,7 @@ class ListingDisplaySearcher implements Searcher {
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param codeViewerService service to get the Layouts
|
||||
* @param tool the tool
|
||||
* @param program current program
|
||||
* @param startLocation location from where to begin searching
|
||||
* @param set address set; may be null
|
||||
@@ -143,7 +143,7 @@ class ListingDisplaySearcher implements Searcher {
|
||||
private AddressIterator[] getSearchIterators() {
|
||||
//
|
||||
// This code used to get specific iterators for labels, comments, etc, depending
|
||||
// on what options were selected (which is the fastest way to search). However,
|
||||
// on what options were selected (which is the fastest way to search). However,
|
||||
// this approach missed auto comments and structure comments.
|
||||
//
|
||||
// The idea now is to get iterators that will return addresses for every defined
|
||||
@@ -168,16 +168,13 @@ class ListingDisplaySearcher implements Searcher {
|
||||
iterators.add(listing.getCommentAddressIterator(searchAddresses, options.isForward()));
|
||||
}
|
||||
if (options.searchLabels() || all) {
|
||||
SymbolIterator labels = program.getSymbolTable().getPrimarySymbolIterator(
|
||||
searchAddresses, options.isForward());
|
||||
SymbolIterator labels = program.getSymbolTable()
|
||||
.getPrimarySymbolIterator(searchAddresses, options.isForward());
|
||||
iterators.add(new LabelSearchAddressIterator(labels));
|
||||
}
|
||||
return iterators.toArray(new AddressIterator[iterators.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the next location.
|
||||
*/
|
||||
ProgramLocation next() {
|
||||
if (locationList.size() == 0) {
|
||||
findNext();
|
||||
@@ -318,8 +315,8 @@ class ListingDisplaySearcher implements Searcher {
|
||||
}
|
||||
|
||||
private void searchForward() {
|
||||
for (int i =
|
||||
currentFieldIndex; i < currentLayout.getNumFields(); i++, currentFieldIndex++) {
|
||||
for (int i = currentFieldIndex; i < currentLayout
|
||||
.getNumFields(); i++, currentFieldIndex++) {
|
||||
int matchingFieldCount = findLocations(i);
|
||||
if (matchingFieldCount != 0) {
|
||||
currentFieldIndex += matchingFieldCount;
|
||||
@@ -355,7 +352,7 @@ class ListingDisplaySearcher implements Searcher {
|
||||
|
||||
int fieldCount = 1; // we always match on one field, unless it is the Mnemonic/Operand combo
|
||||
|
||||
// if field is the Mnemonic, and instructions or data are
|
||||
// if field is the Mnemonic, and instructions or data are
|
||||
// being searched, get the next field as well
|
||||
boolean isMnemonic = fieldName.equals(MnemonicFieldFactory.FIELD_NAME);
|
||||
boolean isInstructionsOrData =
|
||||
@@ -422,13 +419,6 @@ class ListingDisplaySearcher implements Searcher {
|
||||
isInitialized = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the currentFieldIndex of the field that corresponds to the
|
||||
* startLoc program location
|
||||
* @param field
|
||||
* @param fieldIndex
|
||||
* @return true if this field corresponds to the startLoc program location
|
||||
*/
|
||||
private boolean getFieldForLocation(ListingField field, int fieldIndex) {
|
||||
FieldFactory ff = field.getFieldFactory();
|
||||
FieldLocation floc = ff.getFieldLocation(field, BigInteger.ZERO, fieldIndex, startLocation);
|
||||
|
||||
+22
-29
@@ -43,7 +43,6 @@ import ghidra.program.util.*;
|
||||
import ghidra.test.*;
|
||||
import ghidra.util.UserSearchUtils;
|
||||
import ghidra.util.task.TaskMonitor;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
public class ProgramDatabaseSearchIteratorTest extends AbstractGhidraHeadedIntegrationTest {
|
||||
|
||||
@@ -55,10 +54,6 @@ public class ProgramDatabaseSearchIteratorTest extends AbstractGhidraHeadedInteg
|
||||
private ToyProgramBuilder builder;
|
||||
private TaskMonitor monitor = TaskMonitor.DUMMY;
|
||||
|
||||
public ProgramDatabaseSearchIteratorTest() {
|
||||
super();
|
||||
}
|
||||
|
||||
private void createIMM(long address) throws MemoryAccessException {
|
||||
builder.addBytesMoveImmediate(address, (short) 5);
|
||||
builder.disassemble(Long.toHexString(address), 2);
|
||||
@@ -91,7 +86,7 @@ public class ProgramDatabaseSearchIteratorTest extends AbstractGhidraHeadedInteg
|
||||
createFallThru(0x1005f50);
|
||||
createIMM(0x1005f41);
|
||||
createFallThru(0x1005ff0);
|
||||
// LAB_010018b3
|
||||
|
||||
createIMM(0x10018b3);
|
||||
builder.createMemoryReference("0x1005f41", "0x10018b3", RefType.COMPUTED_JUMP,
|
||||
SourceType.ANALYSIS);
|
||||
@@ -109,9 +104,6 @@ public class ProgramDatabaseSearchIteratorTest extends AbstractGhidraHeadedInteg
|
||||
env.showTool();
|
||||
}
|
||||
|
||||
/**
|
||||
* @see TestCase#tearDown()
|
||||
*/
|
||||
@After
|
||||
public void tearDown() throws Exception {
|
||||
env.dispose();
|
||||
@@ -167,7 +159,6 @@ public class ProgramDatabaseSearchIteratorTest extends AbstractGhidraHeadedInteg
|
||||
assertNotNull(loc);
|
||||
assertEquals(getAddr(0x100595f), loc.getAddress());
|
||||
loc = getNextMatch(searcher);
|
||||
System.out.println(loc);
|
||||
assertEquals(getAddr(0x100595f), loc.getAddress());
|
||||
loc = getNextMatch(searcher);
|
||||
assertNotNull(loc);
|
||||
@@ -230,9 +221,9 @@ public class ProgramDatabaseSearchIteratorTest extends AbstractGhidraHeadedInteg
|
||||
Pattern pattern = UserSearchUtils.createSearchPattern("immxx", false);
|
||||
ProgramLocation startLocation = new ProgramLocation(program, program.getMinAddress());
|
||||
CodeUnitFormat format = new CodeUnitFormat(ShowBlockName.NEVER, ShowNamespace.NEVER);
|
||||
ProgramDatabaseFieldSearcher searcher =
|
||||
InstructionMnemonicOperandFieldSearcher.createInstructionMnemonicAndOperandFieldSearcher(
|
||||
program, startLocation, null, true, pattern, format);
|
||||
ProgramDatabaseFieldSearcher searcher = InstructionMnemonicOperandFieldSearcher
|
||||
.createInstructionMnemonicAndOperandFieldSearcher(program, startLocation, null,
|
||||
true, pattern, format);
|
||||
currentAddress = searcher.getNextSignificantAddress(null);
|
||||
|
||||
assertNull(getNextMatch(searcher));
|
||||
@@ -244,18 +235,18 @@ public class ProgramDatabaseSearchIteratorTest extends AbstractGhidraHeadedInteg
|
||||
|
||||
Pattern pattern = UserSearchUtils.createSearchPattern("imm", true);
|
||||
ProgramLocation startLocation = new ProgramLocation(program, program.getMinAddress());
|
||||
ProgramDatabaseFieldSearcher searcher =
|
||||
InstructionMnemonicOperandFieldSearcher.createInstructionMnemonicAndOperandFieldSearcher(
|
||||
program, startLocation, null, true, pattern, CodeUnitFormat.DEFAULT);
|
||||
ProgramDatabaseFieldSearcher searcher = InstructionMnemonicOperandFieldSearcher
|
||||
.createInstructionMnemonicAndOperandFieldSearcher(program, startLocation, null,
|
||||
true, pattern, CodeUnitFormat.DEFAULT);
|
||||
currentAddress = searcher.getNextSignificantAddress(null);
|
||||
|
||||
ProgramLocation nextMatch = getNextMatch(searcher);
|
||||
assertNotNull(nextMatch);
|
||||
|
||||
startLocation = new ProgramLocation(program, getAddr(0x1001000));
|
||||
searcher =
|
||||
InstructionMnemonicOperandFieldSearcher.createInstructionMnemonicAndOperandFieldSearcher(
|
||||
program, startLocation, null, true, pattern, CodeUnitFormat.DEFAULT);
|
||||
searcher = InstructionMnemonicOperandFieldSearcher
|
||||
.createInstructionMnemonicAndOperandFieldSearcher(program, startLocation, null,
|
||||
true, pattern, CodeUnitFormat.DEFAULT);
|
||||
currentAddress = searcher.getNextSignificantAddress(null);
|
||||
|
||||
nextMatch = getNextMatch(searcher);
|
||||
@@ -274,9 +265,9 @@ public class ProgramDatabaseSearchIteratorTest extends AbstractGhidraHeadedInteg
|
||||
|
||||
pattern = UserSearchUtils.createSearchPattern("imm", false);
|
||||
startLocation = new ProgramLocation(program, getAddr(0x1005f53));
|
||||
searcher =
|
||||
InstructionMnemonicOperandFieldSearcher.createInstructionMnemonicAndOperandFieldSearcher(
|
||||
program, startLocation, null, false, pattern, CodeUnitFormat.DEFAULT);
|
||||
searcher = InstructionMnemonicOperandFieldSearcher
|
||||
.createInstructionMnemonicAndOperandFieldSearcher(program, startLocation, null,
|
||||
false, pattern, CodeUnitFormat.DEFAULT);
|
||||
currentAddress = searcher.getNextSignificantAddress(null);
|
||||
|
||||
nextMatch = getNextMatch(searcher);
|
||||
@@ -285,9 +276,9 @@ public class ProgramDatabaseSearchIteratorTest extends AbstractGhidraHeadedInteg
|
||||
|
||||
startLocation = new MnemonicFieldLocation(program,
|
||||
program.getMinAddress().getNewAddress(0x1005f53), null, null, "imm", 2);
|
||||
searcher =
|
||||
InstructionMnemonicOperandFieldSearcher.createInstructionMnemonicAndOperandFieldSearcher(
|
||||
program, startLocation, null, false, pattern, CodeUnitFormat.DEFAULT);
|
||||
searcher = InstructionMnemonicOperandFieldSearcher
|
||||
.createInstructionMnemonicAndOperandFieldSearcher(program, startLocation, null,
|
||||
false, pattern, CodeUnitFormat.DEFAULT);
|
||||
currentAddress = searcher.getNextSignificantAddress(null);
|
||||
|
||||
nextMatch = getNextMatch(searcher);
|
||||
@@ -416,7 +407,7 @@ public class ProgramDatabaseSearchIteratorTest extends AbstractGhidraHeadedInteg
|
||||
addPreComment(0x1001960L, "PreComment: PUSH Hit");
|
||||
addPostComment(0x1001960L, "Post: PUSH hit");
|
||||
|
||||
// Search for
|
||||
// Search for
|
||||
SearchOptions options = new SearchOptions("PUSH", true, true, true, true, true, true, true,
|
||||
true, true, true, false, false);
|
||||
ProgramLocation startLoc = new ProgramLocation(program, getAddr(0x1001950));
|
||||
@@ -465,7 +456,7 @@ public class ProgramDatabaseSearchIteratorTest extends AbstractGhidraHeadedInteg
|
||||
|
||||
int txId = program.startTransaction("Search Test");
|
||||
try {
|
||||
// add data
|
||||
// add data
|
||||
program.getListing().createData(getAddr(0x1001955L), s, s.getLength());
|
||||
}
|
||||
finally {
|
||||
@@ -539,8 +530,10 @@ public class ProgramDatabaseSearchIteratorTest extends AbstractGhidraHeadedInteg
|
||||
TaskMonitor taskMonitor) {
|
||||
int count = 0;
|
||||
ArrayList<ProgramLocation> list = new ArrayList<>();
|
||||
Searcher ts = new ProgramDatabaseSearcher(pluginTool, searchProgram, startLoc, set, options,
|
||||
taskMonitor);
|
||||
Searcher ts = runSwing(() -> {
|
||||
return new ProgramDatabaseSearcher(pluginTool, searchProgram, startLoc, set, options,
|
||||
taskMonitor);
|
||||
});
|
||||
ProgramLocation loc = null;
|
||||
while ((loc = ts.search()) != null) {
|
||||
list.add(loc);
|
||||
|
||||
Reference in New Issue
Block a user