Skip to content

Commit

Permalink
added support to change registers from ghidra
Browse files Browse the repository at this point in the history
  • Loading branch information
Benedikt Schmotzle committed May 28, 2019
1 parent 35b7aa8 commit c817839
Show file tree
Hide file tree
Showing 5 changed files with 152 additions and 1 deletion.
14 changes: 14 additions & 0 deletions data/gdb_ghidra_bridge_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,13 +95,23 @@ def run(self):
msg = json.loads(b"".join(line))
if msg["type"] == "BREAKPOINT":
self.handle_breakpoint(msg)
elif msg['type'] == "REGISTER":
self.handle_register(msg)
break
else:
line.append(c)

except socket.timeout:
pass

def handle_register(self, msg):
data = msg["data"][0]
if data["action"] == "change":
r = data["register"]
v = data["value"]
print("[GDBBridge] setting register '%s' to '%s'\n" % (r, v))
GDBUtils.set_register(r, v)

def handle_breakpoint(self, msg):
data = msg["data"][0]
for address in data["breakpoints"]:
Expand Down Expand Up @@ -354,4 +364,8 @@ def get_endian():
return GDBUtils.query_gdb('show endian', 'endianess', "(currently ", " endian)")


@staticmethod
def set_register(register, value):
gdb.execute("set $%s = %s" % (register, value))

GhidraBridgeCommand()
25 changes: 24 additions & 1 deletion src/main/java/gdbghidra/GDBGhidraProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ of this software and associated documentation files (the "Software"), to deal

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JLabel;
Expand Down Expand Up @@ -56,14 +58,23 @@ public class GDBGhidraProvider extends ComponentProviderAdapter {
private Program currentProgram;
private GDBGhidraPlugin plugin;
private Thread gdbReceiverThread = null;
private DefaultTableModel model = new DefaultTableModel( new String[] {"register", "value"}, 0);
private DefaultTableModel model = null;
private JLabel status = new JLabel();
private Address previousAddress;
private Color previousColor;


public GDBGhidraProvider(GDBGhidraPlugin plugin, String owner) {
super(plugin.getTool(), owner, owner);
this.model = new DefaultTableModel( new String[] {"register", "value"}, 0) {
@Override
public boolean isCellEditable(int row, int column) {
if(column == 0) {
return false;
}
return true;
}
};
this.plugin = plugin;
buildTable();

Expand All @@ -88,6 +99,18 @@ public void buildTable() {
status.setHorizontalAlignment(SwingConstants.LEFT);
statusPanel.add(status);

var a = new AbstractAction() {
public void actionPerformed(ActionEvent a) {
RegisterChangeListener l = (RegisterChangeListener)a.getSource();
if(l.getColumn() != 1) {
return;
}
gdbReceiver.ChangeRegister((String)table.getValueAt(l.getRow(), 0), (String)l.getNewValue());
}
};

new RegisterChangeListener(table, a);

setVisible(true);
}

Expand Down
9 changes: 9 additions & 0 deletions src/main/java/gdbghidra/GDBReceiver.java
Original file line number Diff line number Diff line change
Expand Up @@ -227,4 +227,13 @@ public void restoreBreakpoints() {
sendResponse(response);
}
}

public void ChangeRegister(String register, String newValue) {
if(this.helloEvent == null) {
return;
}

var response = RegisterEvent.constructJSONResponse(register, newValue, "change");
sendResponse(response);
}
}
87 changes: 87 additions & 0 deletions src/main/java/gdbghidra/RegisterChangeListener.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package gdbghidra;

import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.Action;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

public class RegisterChangeListener implements PropertyChangeListener, Runnable {
private JTable table;
private Action action;

private int row;
private int column;
private Object oldValue;
private Object newValue;

public RegisterChangeListener(JTable table, Action action) {
this.table = table;
this.action = action;
this.table.addPropertyChangeListener(this);
}

private RegisterChangeListener(JTable table, int row, int column, Object oldValue, Object newValue) {
this.table = table;
this.row = row;
this.column = column;
this.oldValue = oldValue;
this.newValue = newValue;
}

public int getColumn() {
return column;
}

public Object getNewValue() {
return newValue;
}

public Object getOldValue() {
return oldValue;
}

public int getRow() {
return row;
}

public JTable getTable() {
return table;
}

@Override
public void propertyChange(PropertyChangeEvent e) {
if ("tableCellEditor".equals(e.getPropertyName())) {
if (table.isEditing())
processEditingStarted();
else
processEditingStopped();
}
}

private void processEditingStarted() {
SwingUtilities.invokeLater(this);
}

@Override
public void run() {
row = table.convertRowIndexToModel(table.getEditingRow());
column = table.convertColumnIndexToModel(table.getEditingColumn());
oldValue = table.getModel().getValueAt(row, column);
newValue = null;
}

private void processEditingStopped() {
newValue = table.getModel().getValueAt(row, column);

if (!newValue.equals(oldValue)) {
RegisterChangeListener tcl = new RegisterChangeListener(getTable(), getRow(), getColumn(), getOldValue(),
getNewValue());

ActionEvent event = new ActionEvent(tcl, ActionEvent.ACTION_PERFORMED, "");
action.actionPerformed(event);
}
}
}
18 changes: 18 additions & 0 deletions src/main/java/gdbghidra/events/RegisterEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ of this software and associated documentation files (the "Software"), to deal

import java.math.BigInteger;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

import ghidra.app.cmd.register.SetRegisterCmd;
import ghidra.app.plugin.ProgramPlugin;
import ghidra.framework.cmd.CompoundCmd;
Expand Down Expand Up @@ -88,4 +91,19 @@ public static void handleEvent(RegisterEvent registerEvent, Program currentProgr
plugin.getTool().execute(cmd, currentProgram);
}

public static JSONObject constructJSONResponse(String register, String newValue, String action) {
var response = new JSONObject();
var datamap = new JSONObject();
var data = new JSONArray();

response.put("type", "REGISTER");
datamap.put("register", register);
datamap.put("value", newValue);
datamap.put("action", action);
data.add(datamap);
response.put("data", data);

return response;
}

}

0 comments on commit c817839

Please sign in to comment.