From 51fb8f8793baa2fca1a34e0cd122f01d960424d3 Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Fri, 22 Mar 2024 08:49:56 -0400 Subject: [PATCH] GP-4435 Support OTHER overlay mem ref entry via GUI --- .../ReferencesPlugin/References_from.htm | 24 ++++-- .../ReferencesPlugin/images/MemRefPanel.png | Bin 15135 -> 29109 bytes .../references/EditMemoryReferencePanel.java | 76 ++++++++++++------ .../core/references/EditReferenceDialog.java | 1 + .../AbstractScreenShotGenerator.java | 21 ++++- .../ReferencesPluginScreenShots.java | 25 ++++-- 6 files changed, 108 insertions(+), 39 deletions(-) diff --git a/Ghidra/Features/Base/src/main/help/help/topics/ReferencesPlugin/References_from.htm b/Ghidra/Features/Base/src/main/help/help/topics/ReferencesPlugin/References_from.htm index 2d722752dd..654d973b05 100644 --- a/Ghidra/Features/Base/src/main/help/help/topics/ReferencesPlugin/References_from.htm +++ b/Ghidra/Features/Base/src/main/help/help/topics/ReferencesPlugin/References_from.htm @@ -1166,10 +1166,13 @@ c

[ Offset] The To Address entry is required for normal memory references - and specifies the reference destination as a memory offset.  This entry is always + and specifies the reference destination as a memory offset within a selected address + space.  The address offset entry is always interpretted as a unsigned hex value  (i.e., the "0x" entry prefix is assumed).  For those processors with multiple address-spaces, a pull-down is also provided - allowing the address-space to be selected.
+ allowing the address-space to be selected. Address spaces which overlay the + OTHER non-loaded space are only included if the Include OTHER overlay spaces + checkbox is selected.

@@ -1178,10 +1181,19 @@ c

[ Offset] The Base Address entry is required for offset memory references - and specifies the offset base location as a memory offset.  This entry is always - interpretted as a unsigned hex value  (i.e., the 0x entry prefix is assumed). -  For those processors with multiple address-spaces, a pull-down is also provided - allowing the address-space to be selected.
+ and specifies the offset base location.  See To Address entry above for + entry details.
+

+
+ +

Include OTHER overlay spaces

+ +
+

The Include OTHER overlay spaces checkbox when selected allows address spaces + which overlay the OTHER non-loaded space to be included in the To Address + or Base Address address space selection pulldown list. This may be appropriate + when working with special purpose overlay spaces which can facilitate flow overrides + (e.g., syscall).

diff --git a/Ghidra/Features/Base/src/main/help/help/topics/ReferencesPlugin/images/MemRefPanel.png b/Ghidra/Features/Base/src/main/help/help/topics/ReferencesPlugin/images/MemRefPanel.png index 9b768d87d3ef3a85e07b549496171aae6dd20ea9..d2749741fadbb015c730caa64b2e566c75136137 100644 GIT binary patch literal 29109 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 RP>%6}f~<;6vD7oa{{=Xkow)!2 literal 15135 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 addrHistoryMap = new WeakHashMap<>(); private ReferencesPlugin plugin; @@ -68,6 +71,7 @@ class EditMemoryReferencePanel extends EditReferencePanel { private Reference editRef; private JLabel addrLabel; private AddressInput toAddressField; + private JCheckBox includeOtherOverlaysCheckbox; private JButton addrHistoryButton; private JCheckBox offsetCheckbox; private JTextField offsetField; @@ -113,18 +117,16 @@ class EditMemoryReferencePanel extends EditReferencePanel { toggleAddressHistoryPopup(); } } - - @Override - public void mouseReleased(MouseEvent e) { - // TODO Auto-generated method stub - super.mouseReleased(e); - } }); addrHistoryButton.setText(null); addrHistoryButton.setMargin(new Insets(0, 0, 0, 0)); addrHistoryButton.setFocusable(false); addrHistoryButton.setToolTipText("Address History"); + includeOtherOverlaysCheckbox = new JCheckBox("Include OTHER overlay spaces", + Boolean.getBoolean(Preferences.getProperty(INCLUDE_OTHER_OVERLAY_PREFERENCE, "false"))); + includeOtherOverlaysCheckbox.addChangeListener(e -> refreshToAddressField()); + refTypes = new GhidraComboBox<>(MEM_REF_TYPES); JPanel addrPanel = new JPanel(new BorderLayout()); @@ -137,6 +139,9 @@ class EditMemoryReferencePanel extends EditReferencePanel { add(addrLabel); add(addrPanel); + add(new JLabel()); + add(includeOtherOverlaysCheckbox); + add(new GLabel("Ref-Type:", SwingConstants.RIGHT)); add(refTypes); @@ -182,8 +187,39 @@ class EditMemoryReferencePanel extends EditReferencePanel { } } + private void refreshToAddressField() { + initializeToAddressField(toAddressField.getAddress()); + } + + private void initializeToAddressField(Address toAddr) { + toAddressField.setAddressFactory(fromCodeUnit.getProgram().getAddressFactory(), (s) -> { + if (s.isLoadedMemorySpace()) { + return true; + } + if (s.equals(fromCodeUnit.getAddress().getAddressSpace())) { + return true; + } + if (toAddr != null && s.equals(toAddr.getAddressSpace())) { + return true; + } + if (includeOtherOverlaysCheckbox.isSelected() && s.isOverlaySpace()) { + return true; + } + return false; + }); + if (toAddr != null) { + toAddressField.setAddress(toAddr); + toAddressField.select(); + } + else { + toAddressField.clear(); + } + toAddressField.invalidate(); + } + @Override void initialize(CodeUnit fromCu, Reference editReference) { + isValidState = false; this.fromCodeUnit = fromCu; this.editRef = editReference; @@ -199,8 +235,8 @@ class EditMemoryReferencePanel extends EditReferencePanel { toAddr = toAddr.subtractWrap(defaultOffset); } - toAddressField.setAddressFactory(fromCu.getProgram().getAddressFactory()); - toAddressField.setAddress(toAddr); + initializeToAddressField(toAddr); + enableOffsetField(editReference.isOffsetReference()); RefType rt = editReference.getReferenceType(); @@ -215,6 +251,7 @@ class EditMemoryReferencePanel extends EditReferencePanel { @Override boolean initialize(CodeUnit fromCu, int fromOpIndex, int fromSubIndex) { + isValidState = false; this.editRef = null; this.fromCodeUnit = fromCu; @@ -224,8 +261,6 @@ class EditMemoryReferencePanel extends EditReferencePanel { addrHistoryButton.setEnabled(getAddressHistorySize(p) != 0); - toAddressField.setAddressFactory(p.getAddressFactory()); - Address cuAddr = fromCu.getMinAddress(); RefType rt = RefTypeFactory.getDefaultMemoryRefType(fromCu, fromOpIndex, null, false); @@ -238,15 +273,12 @@ class EditMemoryReferencePanel extends EditReferencePanel { Address toAddr = null; if (p == program && location != null) { toAddr = getSuggestedLocationAddress(program, location); - } - if (toAddr == null || toAddr.equals(cuAddr)) { - toAddressField.clear(); - } - else { - toAddressField.setAddress(toAddr); + if (toAddr != null && toAddr.equals(cuAddr)) { + toAddr = null; + } } enableOffsetField(false); - toAddressField.select(); + initializeToAddressField(toAddr); return setOpIndex(fromOpIndex); } @@ -310,14 +342,12 @@ class EditMemoryReferencePanel extends EditReferencePanel { } } - if (toAddr != null && !toAddr.equals(cuAddr)) { - toAddressField.setAddress(toAddr); - toAddressField.select(); - } - else { - toAddressField.clear(); + if (toAddr != null && toAddr.equals(cuAddr)) { + toAddr = null; } + initializeToAddressField(toAddr); + if (toAddr != null) { rt = RefTypeFactory.getDefaultMemoryRefType(fromCu, fromOpIndex, toAddr, false); populateRefTypes(rt); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditReferenceDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditReferenceDialog.java index a993eeecf0..11fd2e5640 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditReferenceDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditReferenceDialog.java @@ -69,6 +69,7 @@ public class EditReferenceDialog extends ReusableDialogComponentProvider { addCancelButton(); setDefaultButton(applyButton); + setUseSharedLocation(true); } @Override diff --git a/Ghidra/Features/Base/src/main/java/help/screenshot/AbstractScreenShotGenerator.java b/Ghidra/Features/Base/src/main/java/help/screenshot/AbstractScreenShotGenerator.java index 5db7727009..64283b30c5 100644 --- a/Ghidra/Features/Base/src/main/java/help/screenshot/AbstractScreenShotGenerator.java +++ b/Ghidra/Features/Base/src/main/java/help/screenshot/AbstractScreenShotGenerator.java @@ -71,16 +71,18 @@ import ghidra.framework.plugintool.Plugin; import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.util.PluginException; import ghidra.program.database.data.ProgramDataTypeManager; -import ghidra.program.model.address.Address; -import ghidra.program.model.address.AddressSet; +import ghidra.program.model.address.*; import ghidra.program.model.data.BuiltInDataTypeManager; import ghidra.program.model.data.DataTypeManager; import ghidra.program.model.listing.Program; +import ghidra.program.model.mem.Memory; import ghidra.program.util.ProgramSelection; import ghidra.test.AbstractGhidraHeadedIntegrationTest; import ghidra.test.TestEnv; import ghidra.util.ColorUtils; import ghidra.util.exception.AssertException; +import ghidra.util.exception.UsrException; +import ghidra.util.task.TaskMonitor; import resources.ResourceManager; public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIntegrationTest { @@ -161,6 +163,19 @@ public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIn public Program loadProgram(final String programName) { runSwing(() -> { program = env.getProgram(programName); + + try { + program.withTransaction("Add OTHER Overlay Space", () -> { + Memory memory = program.getMemory(); + memory.createInitializedBlock("OtherOv1", + AddressSpace.OTHER_SPACE.getAddress(0), 100, (byte) 0, TaskMonitor.DUMMY, + true); + }); + } + catch (UsrException e) { + failWithException("Unexpected", e); + } + ProgramManager pm = tool.getService(ProgramManager.class); pm.openProgram(program.getDomainFile()); }); @@ -1637,7 +1652,7 @@ public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIn g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2.setColor(Colors.BORDER); + g2.setColor(Color.BLACK); g2.setStroke(new BasicStroke(3f)); g2.draw(topPath); g2.draw(bottomPath); diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ReferencesPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ReferencesPluginScreenShots.java index f30b4634a9..9ac8628190 100644 --- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ReferencesPluginScreenShots.java +++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ReferencesPluginScreenShots.java @@ -230,15 +230,24 @@ public class ReferencesPluginScreenShots extends GhidraScreenShotGenerator { CodeUnit cu = program.getListing().getCodeUnitAt(addr(0x401008)); ReferencesPlugin plugin = getPlugin(tool, ReferencesPlugin.class); final EditReferenceDialog dialog = new EditReferenceDialog(plugin); - dialog.initDialog(cu, 0, 0, null); + runSwing(() -> { - JRadioButton choiceButton = (JRadioButton) getInstanceField("memRefChoice", dialog); - invokeInstanceMethod("refChoiceActivated", dialog, - new Class[] { JRadioButton.class }, new Object[] { choiceButton }); + dialog.initDialog(cu, 0, 0, null); }, true); - showDialogWithoutBlocking(tool, dialog); + + JRadioButton choiceButton = (JRadioButton) getInstanceField("memRefChoice", dialog); + pressButton(choiceButton); final JPanel panel = (JPanel) getInstanceField("memRefPanel", dialog); + + runSwing(() -> { + JCheckBox ovCheckbox = + (JCheckBox) getInstanceField("includeOtherOverlaysCheckbox", panel); + ovCheckbox.setSelected(true); + }); + + showDialogWithoutBlocking(tool, dialog); + JButton button = (JButton) getInstanceField("addrHistoryButton", panel); Rectangle buttonBounds = button.getBounds(); buttonBounds = SwingUtilities.convertRectangle(button.getParent(), buttonBounds, panel); @@ -246,7 +255,8 @@ public class ReferencesPluginScreenShots extends GhidraScreenShotGenerator { buttonBounds.y += buttonBounds.height / 2 + 20; // half button height + padding added by takeSnippet() System.out.println("Button bounds = " + buttonBounds); Rectangle bounds = panel.getBounds(); - bounds.height = 3 * bounds.height / 5; // get rid of empty space + bounds.y -= 10; + bounds.height = 4 * bounds.height / 5; // get rid of empty space bounds = SwingUtilities.convertRectangle(panel.getParent(), bounds, null); captureDialog(); takeSnippet(bounds); @@ -257,7 +267,8 @@ public class ReferencesPluginScreenShots extends GhidraScreenShotGenerator { checkbox.setSelected(true); }); bounds = panel.getBounds(); - bounds.height = 3 * bounds.height / 5; + bounds.y -= 10; + bounds.height = 4 * bounds.height / 5; bounds = SwingUtilities.convertRectangle(panel.getParent(), bounds, null); captureDialog(); takeSnippet(bounds);