mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-31 22:30:19 +08:00
Merge remote-tracking branch 'origin/Ghidra_11.0'
This commit is contained in:
@@ -49,30 +49,25 @@
|
||||
|
||||
<H2>The not-so-fine print: Please Read!</H2>
|
||||
|
||||
<P>This release includes new features, enhancements, performance improvements, quite a few bug fixes, and many pull-request
|
||||
contributions. Thanks to all those who have contributed their time, thoughts, and code. The Ghidra user community thanks you too!</P>
|
||||
|
||||
<P>Ghidra 11.0 is fully backward compatible with project data from previous releases.
|
||||
However, programs and data type archives which are created or modified in 11.0 will not be useable by an earlier Ghidra version. </P>
|
||||
|
||||
<P>This release includes new features, enhancements, performance improvements, quite a few bug fixes, and many pull-request
|
||||
contributions. Thanks to all those who have contributed their time, thoughts, and code. The Ghidra user community thanks you too!</P>
|
||||
|
||||
<P>IMPORTANT: Ghidra requires Java 17 JDK to run. A newer version of Java may be acceptable but has not been fully tested. Please see the
|
||||
<P>This distribution requires JDK 17 to run, and provides Linux x86-64, Windows x86-64, and macOS x86-64 native components.
|
||||
If you have another platform or wish to use a newer JDK, please see the
|
||||
<a href="InstallationGuide.html">Ghidra Installation Guide</a> for additional information.</P>
|
||||
|
||||
<P>NOTE: Please note that any programs imported with a Ghidra beta version or code built directly from source code outside of a release tag may not be compatible,
|
||||
and may have flaws that won't be corrected by using this new release. Any programs analyzed from a beta or other local master source build should be considered
|
||||
experimental and re-imported and analyzed with a release version. Programs imported with previous release versions should upgrade correctly through various
|
||||
automatic upgrade mechanisms. Any program you will continue to reverse engineer should be imported fresh with a release version or a build you trust with the
|
||||
latest code fixes.</P>
|
||||
|
||||
<P>NOTE: Ghidra Server: The Ghidra 11.0 server is compatible with Ghidra 9.2 and later Ghidra clients. Ghidra 11.0
|
||||
clients are compatible with all 10.x and 9.x servers. Although, due to potential Java version differences, it is recommended
|
||||
that Ghidra Server installations older than 10.2 be upgraded. Those using 10.2 and newer should not need a server upgrade.</P>
|
||||
|
||||
<P>NOTE: Platform-specific native components can be built directly from a release distribution.
|
||||
The distribution currently provides Linux x86-64, Windows x86-64, and macOS x86-64 native components. If you have another platform,
|
||||
for example a macOS aarch64 based system or a Linux ARM variant, the <span class="gcode">support/buildNatives</span> script can build the decompiler,
|
||||
demangler, and legacy PDB executables for your platform. Please see the "Building Ghidra Native Components" section in the
|
||||
<a href="InstallationGuide.html#Build">Ghidra Installation Guide</a> for additional information.</P>
|
||||
<P>NOTE: Any programs imported with a Ghidra beta version or code built directly from source code outside of a release tag may not be compatible,
|
||||
and may have flaws that won't be corrected by using this new release. Any programs analyzed from a beta or other local master source build should be considered
|
||||
experimental and re-imported and analyzed with a release version. Programs imported with previous release versions should upgrade correctly through various
|
||||
automatic upgrade mechanisms. Any program you will continue to reverse engineer should be imported fresh with a release version or a build you trust with the
|
||||
latest code fixes.</P>
|
||||
|
||||
|
||||
|
||||
@@ -103,7 +98,7 @@
|
||||
to pre-ingested programs within a Ghidra multi-user repository. Clicking on the hyperlink causes Ghidra to display the previously ingested program.
|
||||
No data other than the Ghidra URL is transferred to Ghidra, and no socket is open within Ghidra listening for commands. GhidraGo must be enabled by
|
||||
installing a plugin in the Ghidra project manager, and must also be configured as a protocol handler in your web browser. GhidraGo is not setup or enabled by default.
|
||||
Please see the included <span class="gtitle">GhidraGoREADME.html</span>, or search for GhidraGo within help.
|
||||
For details on setting up GhidraGo, please see the included <span class="gtitle">GhidraGoREADME.html</span> or search for GhidraGo within help.
|
||||
</P>
|
||||
|
||||
<H2>Version Tracking </H2>
|
||||
|
||||
-9
@@ -54,12 +54,6 @@ public class WindowsResourceReferenceScriptTest extends AbstractGhidraHeadedInte
|
||||
pm.openProgram(program.getDomainFile());
|
||||
}
|
||||
|
||||
private void closeProgram() {
|
||||
ProgramManager pm = env.getTool().getService(ProgramManager.class);
|
||||
pm.closeProgram();
|
||||
waitForSwing();
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() throws Exception {
|
||||
env.dispose();
|
||||
@@ -102,7 +96,6 @@ public class WindowsResourceReferenceScriptTest extends AbstractGhidraHeadedInte
|
||||
//Check the reference type created is of type DATA
|
||||
assertTrue(type.equals(RefType.DATA));
|
||||
}
|
||||
closeProgram();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -135,8 +128,6 @@ public class WindowsResourceReferenceScriptTest extends AbstractGhidraHeadedInte
|
||||
//check the reference type created is of type DATA
|
||||
assertTrue(type.equals(RefType.DATA));
|
||||
}
|
||||
|
||||
closeProgram();
|
||||
}
|
||||
|
||||
private Address addr(long offset, Program program) {
|
||||
|
||||
+31
-4
@@ -28,13 +28,17 @@ import org.junit.*;
|
||||
import docking.DefaultActionContext;
|
||||
import docking.action.DockingActionIf;
|
||||
import docking.test.AbstractDockingTest;
|
||||
import ghidra.app.events.OpenProgramPluginEvent;
|
||||
import ghidra.app.plugin.core.byteviewer.ByteViewerPlugin;
|
||||
import ghidra.app.plugin.core.codebrowser.CodeBrowserPlugin;
|
||||
import ghidra.app.services.ProgramManager;
|
||||
import ghidra.framework.plugintool.Plugin;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.framework.plugintool.util.PluginException;
|
||||
import ghidra.program.database.ProgramBuilder;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.listing.Program;
|
||||
import ghidra.program.util.ProgramLocation;
|
||||
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
|
||||
import ghidra.test.TestEnv;
|
||||
|
||||
@@ -61,8 +65,9 @@ public class ByteViewerToolConnectionTest extends AbstractGhidraHeadedIntegratio
|
||||
pressButtonByText(dialog, "OK");
|
||||
}
|
||||
|
||||
closeAllWindows();
|
||||
env.dispose();
|
||||
|
||||
closeAllWindows();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -83,17 +88,39 @@ public class ByteViewerToolConnectionTest extends AbstractGhidraHeadedIntegratio
|
||||
|
||||
producerList.setSelectedIndex(0);
|
||||
consumerList.setSelectedIndex(1);
|
||||
clickRow(eventList, 1);
|
||||
int eventCount = eventList.getModel().getSize();
|
||||
for (int i = 0; i < eventCount; i++) {
|
||||
clickRow(eventList, i);
|
||||
}
|
||||
|
||||
Program p = buildProgram();
|
||||
|
||||
ProgramManager pm = cbTool.getService(ProgramManager.class);
|
||||
SwingUtilities.invokeAndWait(() -> pm.openProgram(p.getDomainFile()));
|
||||
runSwing(() -> pm.openProgram(p.getDomainFile()));
|
||||
|
||||
waitForSwing();
|
||||
|
||||
ProgramManager pm2 = cbTool2.getService(ProgramManager.class);
|
||||
assertNull(pm2.getCurrentProgram());
|
||||
|
||||
// open same program in second tool - cannot rely on tool connection for this
|
||||
cbTool2.firePluginEvent(new OpenProgramPluginEvent("Test", p));
|
||||
|
||||
waitForSwing();
|
||||
|
||||
assertEquals(p, pm2.getCurrentProgram());
|
||||
|
||||
env.release(p);
|
||||
Address a = p.getAddressFactory().getDefaultAddressSpace().getAddress(0x1001010);
|
||||
|
||||
CodeBrowserPlugin cb1 = getPlugin(cbTool, CodeBrowserPlugin.class);
|
||||
cb1.goTo(new ProgramLocation(p, a), true);
|
||||
|
||||
waitForSwing();
|
||||
|
||||
CodeBrowserPlugin cb2 = getPlugin(cbTool2, CodeBrowserPlugin.class);
|
||||
ProgramLocation loc = cb2.getCurrentLocation();
|
||||
assertNotNull(loc);
|
||||
assertEquals(a, loc.getAddress());
|
||||
}
|
||||
|
||||
private void clickRow(JList<?> list, int row) {
|
||||
|
||||
+32
-7
@@ -27,13 +27,17 @@ import org.junit.*;
|
||||
|
||||
import docking.DefaultActionContext;
|
||||
import docking.action.DockingActionIf;
|
||||
import ghidra.app.events.OpenProgramPluginEvent;
|
||||
import ghidra.app.plugin.core.byteviewer.ByteViewerPlugin;
|
||||
import ghidra.app.plugin.core.codebrowser.CodeBrowserPlugin;
|
||||
import ghidra.app.services.ProgramManager;
|
||||
import ghidra.framework.plugintool.Plugin;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.framework.plugintool.util.PluginException;
|
||||
import ghidra.program.database.ProgramBuilder;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.listing.Program;
|
||||
import ghidra.program.util.ProgramLocation;
|
||||
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
|
||||
import ghidra.test.TestEnv;
|
||||
|
||||
@@ -75,9 +79,9 @@ public class ToolConnectionTest extends AbstractGhidraHeadedIntegrationTest {
|
||||
close(dialog);
|
||||
}
|
||||
|
||||
closeAllWindows();
|
||||
|
||||
env.dispose();
|
||||
|
||||
closeAllWindows();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -85,21 +89,42 @@ public class ToolConnectionTest extends AbstractGhidraHeadedIntegrationTest {
|
||||
|
||||
connectTools();
|
||||
|
||||
clickListRow(eventList, 1);
|
||||
int eventCount = eventList.getModel().getSize();
|
||||
for (int i = 0; i < eventCount; i++) {
|
||||
clickListRow(eventList, i);
|
||||
}
|
||||
|
||||
pressButtonByText(dialog, "OK");
|
||||
|
||||
Program p = buildNotepad();
|
||||
|
||||
ProgramManager pm = tool1.getService(ProgramManager.class);
|
||||
ProgramManager pm2 = tool2.getService(ProgramManager.class);
|
||||
runSwing(() -> pm.openProgram(p.getDomainFile()));
|
||||
|
||||
waitForCondition(() -> pm2.getCurrentProgram() != null,
|
||||
"Tool 2 did not open a proagram when one was opened in tool1");
|
||||
waitForSwing();
|
||||
|
||||
ProgramManager pm2 = tool2.getService(ProgramManager.class);
|
||||
assertNull(pm2.getCurrentProgram());
|
||||
|
||||
// open same program in second tool - cannot rely on tool connection for this
|
||||
tool2.firePluginEvent(new OpenProgramPluginEvent("Test", p));
|
||||
|
||||
waitForSwing();
|
||||
|
||||
assertEquals(p, pm2.getCurrentProgram());
|
||||
|
||||
env.release(p);
|
||||
Address a = p.getAddressFactory().getDefaultAddressSpace().getAddress(0x1001010);
|
||||
|
||||
CodeBrowserPlugin cb1 = getPlugin(tool1, CodeBrowserPlugin.class);
|
||||
cb1.goTo(new ProgramLocation(p, a), true);
|
||||
|
||||
waitForSwing();
|
||||
|
||||
CodeBrowserPlugin cb2 = getPlugin(tool2, CodeBrowserPlugin.class);
|
||||
ProgramLocation loc = cb2.getCurrentLocation();
|
||||
assertNotNull(loc);
|
||||
assertEquals(a, loc.getAddress());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user