GP-6041 bsim h2 database script improvements

This commit is contained in:
James
2026-03-18 13:51:03 -04:00
parent 210be332cd
commit 09a58af68d
4 changed files with 30 additions and 12 deletions

View File

@@ -57,7 +57,7 @@ public class AddProgramToH2BSimDatabaseScript extends GhidraScript {
if (currentProgram.isChanged()) {
popup(currentProgram.getName() + " has unsaved changes. Please save the program" +
" before adding it to a BSim database.");
" before adding it to a BSim database.");
return;
}
@@ -90,6 +90,16 @@ public class AddProgramToH2BSimDatabaseScript extends GhidraScript {
h2Database.initialize();
DatabaseInformation dbInfo = h2Database.getInfo();
// check whether the executable is already in the database
// before generating signatures
QueryExeInfo exeInfo = new QueryExeInfo();
exeInfo.filterMd5 = currentProgram.getExecutableMD5();
ResponseExe response = exeInfo.execute(h2Database);
if (response.recordCount > 0) {
popup(currentProgram.getName() + " is already in the database.");
return;
}
LSHVectorFactory vectorFactory = h2Database.getLSHVectorFactory();
GenSignatures gensig = null;
try {

View File

@@ -23,6 +23,7 @@ import org.apache.commons.lang3.StringUtils;
import ghidra.app.script.GhidraScript;
import ghidra.features.base.values.GhidraValuesMap;
import ghidra.features.bsim.gui.BSimServerManager;
import ghidra.features.bsim.query.*;
import ghidra.features.bsim.query.FunctionDatabase.BSimError;
import ghidra.features.bsim.query.description.DatabaseInformation;
@@ -37,6 +38,7 @@ public class CreateH2BSimDatabaseScript extends GhidraScript {
private static final String DATABASE_TEMPLATE = "Database Template";
private static final String FUNCTION_TAGS = "Function Tags (CSV)";
private static final String EXECUTABLE_CATEGORIES = "Executable Categories (CSV)";
private static final String ADD_TO_MANAGER = "Add New Server to Server Manager";
private static final String[] templates =
{ "medium_nosize", "medium_32", "medium_64", "medium_cpool" };
@@ -54,6 +56,7 @@ public class CreateH2BSimDatabaseScript extends GhidraScript {
values.defineChoice(DATABASE_TEMPLATE, "medium_nosize", templates);
values.defineString(FUNCTION_TAGS);
values.defineString(EXECUTABLE_CATEGORIES);
values.defineBoolean(ADD_TO_MANAGER, true);
values.setValidator((valueMap, status) -> {
String databaseName = valueMap.getString(NAME);
@@ -86,6 +89,7 @@ public class CreateH2BSimDatabaseScript extends GhidraScript {
String exeCatCSV = values.getString(EXECUTABLE_CATEGORIES);
List<String> cats = parseCSV(exeCatCSV);
boolean addToManager = values.getBoolean(ADD_TO_MANAGER);
File dbFile = new File(dbDir, databaseName);
BSimServerInfo serverInfo = new BSimServerInfo(dbFile.getAbsolutePath());
@@ -130,6 +134,10 @@ public class CreateH2BSimDatabaseScript extends GhidraScript {
throw new LSHException(lastError.message);
}
}
if (addToManager) {
BSimServerManager serverManager = BSimServerManager.getBSimServerManager();
serverManager.addServer(serverInfo);
}
popup("Database " + values.getString(NAME) + " created successfully!");
}
finally {

View File

@@ -18,6 +18,7 @@ package ghidra.features.bsim.gui;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import ghidra.features.bsim.gui.search.dialog.BSimServerManagerListener;
@@ -30,7 +31,6 @@ import ghidra.framework.Application;
import ghidra.framework.options.GProperties;
import ghidra.framework.options.JSonProperties;
import ghidra.util.Msg;
import ghidra.util.Swing;
/**
* Managers BSim database server definitions and connections
@@ -43,14 +43,14 @@ public class BSimServerManager {
* Get static singleton instance for BSimServerManager
* @return BSimServerManager instance
*/
static synchronized BSimServerManager getBSimServerManager() {
public static synchronized BSimServerManager getBSimServerManager() {
if (instance == null) {
instance = new BSimServerManager();
}
return instance;
}
private Set<BSimServerInfo> serverInfos = new HashSet<>();
private Set<BSimServerInfo> serverInfos = ConcurrentHashMap.newKeySet();
private List<BSimServerManagerListener> listeners = new CopyOnWriteArrayList<>();
private BSimServerManager() {
@@ -64,7 +64,7 @@ public class BSimServerManager {
}
/**
* Get list of defined servers. Method must be invoked from swing thread only.
* Get list of defined servers.
* @return list of defined servers
*/
public Set<BSimServerInfo> getServerInfos() {
@@ -130,7 +130,7 @@ public class BSimServerManager {
}
/**
* Add server to list. Method must be invoked from swing thread only.
* Add server to list.
* @param newServerInfo new BSim DB server
*/
public void addServer(BSimServerInfo newServerInfo) {
@@ -166,7 +166,7 @@ public class BSimServerManager {
}
/**
* Remove BSim DB server from list. Method must be invoked from swing thread only.
* Remove BSim DB server from list.
* Specified server datasource will be dispose unless it is active or force is true.
* @param info BSim DB server to be removed
* @param force true if server datasource should be disposed even when active.
@@ -192,11 +192,9 @@ public class BSimServerManager {
}
private void notifyServerListChanged() {
Swing.runLater(() -> {
for (BSimServerManagerListener listener : listeners) {
listener.serverListChanged();
}
});
for (BSimServerManagerListener listener : listeners) {
listener.serverListChanged();
}
}
/**

View File

@@ -4,6 +4,8 @@ In this section, we demonstrate some applications of our BSim database.
## Registering a BSim Database
**Note**: This step is not necessary if the **Add New Server to Server Manager** option was checked in ``CreateH2BSimDatabaseScript.java``.
In order to query the database, you must register it with Ghidra:
1. From The Code Browser, Select **BSim -> Manage Servers**.