From 14d25ce2a8ccbcbbf2fc5efd8b81abf1e7d02f68 Mon Sep 17 00:00:00 2001 From: d-millar <33498836+d-millar@users.noreply.github.com> Date: Tue, 24 Feb 2026 17:56:34 +0000 Subject: [PATCH] GP-6482: fixes --- .../data/debugger-launchers/local-x64dbg.ps1 | 3 +++ .../src/main/py/src/ghidraxdbg/methods.py | 15 +++++++++++---- .../debug/service/tracermi/TraceRmiTarget.java | 17 ++++++++++++++++- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/local-x64dbg.ps1 b/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/local-x64dbg.ps1 index e2099a571e..e291c9e931 100644 --- a/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/local-x64dbg.ps1 +++ b/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/local-x64dbg.ps1 @@ -48,6 +48,9 @@ function Compute-Python-Args { if ("$Env:OPT_TARGET_IMG" -ne "") { $arglist+=($Env:OPT_TARGET_IMG) } + if ("$Env:OPT_X64DBG_EXE" -ne "") { + $arglist+=($Env:OPT_X64DBG_EXE) + } if ("$Env:OPT_TARGET_DIR" -ne "") { $arglist+=($Env:OPT_TARGET_DIR) } diff --git a/Ghidra/Debug/Debugger-agent-x64dbg/src/main/py/src/ghidraxdbg/methods.py b/Ghidra/Debug/Debugger-agent-x64dbg/src/main/py/src/ghidraxdbg/methods.py index d3fa95740c..09b4966ebe 100644 --- a/Ghidra/Debug/Debugger-agent-x64dbg/src/main/py/src/ghidraxdbg/methods.py +++ b/Ghidra/Debug/Debugger-agent-x64dbg/src/main/py/src/ghidraxdbg/methods.py @@ -665,15 +665,22 @@ def read_mem(process: Process, range: AddressRange) -> None: def write_mem(process: Process, address: Address, data: bytes) -> None: """Write memory.""" nproc = find_proc_by_obj(process) - offset = process.trace.extra.required_mm().map_back(nproc, address) + offset = process.trace.extra.require_mm().map_back(nproc, address) dbg().write_memory(offset, data) + with commands.open_tracked_tx('Write memory'): + commands.putmem(offset, len(data), True, True) -@REGISTRY.method(action='set_reg', display='Set Register') -def write_reg(reg: RegisterValueContainer, name: str, value: int) -> None: +@REGISTRY.method(action='write_reg', display='Write Register') +def write_reg(reg: RegisterValueContainer, name: str, value: bytes) -> None: """Write a register.""" nproc = util.selected_process() - dbg().set_reg(name, value) + trace: Trace[commands.Extra] = reg.trace + rv = trace.extra.require_rm().map_value_back(nproc, name, value) + rval = int.from_bytes(rv.value, signed=False) + dbg().set_reg(name, rval) + with commands.open_tracked_tx('Write Register'): + commands.putreg() def dbg(): diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/service/tracermi/TraceRmiTarget.java b/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/service/tracermi/TraceRmiTarget.java index c6a1650d47..60c48eb119 100644 --- a/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/service/tracermi/TraceRmiTarget.java +++ b/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/service/tracermi/TraceRmiTarget.java @@ -765,6 +765,10 @@ public class TraceRmiTarget extends AbstractTarget { } record WriteRegMatcher(int score, List spec) implements MethodMatcher { + static final WriteRegMatcher HAS_CONTAINER_NAME_VALUE = new WriteRegMatcher(4, List.of( + new TypeParamSpec("container", TraceRegisterContainer.class), + new TypeParamSpec("name", String.class), + new TypeParamSpec("value", byte[].class))); static final WriteRegMatcher HAS_FRAME_NAME_VALUE = new WriteRegMatcher(3, List.of( new TypeParamSpec("frame", TraceStackFrame.class), new TypeParamSpec("name", String.class), @@ -776,7 +780,8 @@ public class TraceRmiTarget extends AbstractTarget { static final WriteRegMatcher HAS_REG_VALUE = new WriteRegMatcher(1, List.of( new TypeParamSpec("register", TraceRegister.class), new TypeParamSpec("value", byte[].class))); - static final List ALL = matchers(HAS_FRAME_NAME_VALUE, HAS_REG_VALUE); + static final List ALL = matchers(HAS_CONTAINER_NAME_VALUE, + HAS_FRAME_NAME_VALUE, HAS_THREAD_NAME_VALUE, HAS_REG_VALUE); } record BreakExecMatcher(int score, List spec) implements MethodMatcher { @@ -1357,6 +1362,16 @@ public class TraceRmiTarget extends AbstractTarget { .toCompletableFuture() .thenApply(__ -> null); } + + RemoteParameter paramContainer = writeReg.params.get("container"); + if (paramContainer != null) { + return writeReg.method.invokeAsync(Map.ofEntries( + Map.entry(paramContainer.name(), thread.getObject().findRegisterContainer(0)), + Map.entry(writeReg.params.get("name").name(), found.name()), + Map.entry(writeReg.params.get("value").name(), getBytes(value)))) + .toCompletableFuture() + .thenApply(__ -> null); + } if (found == null || !found.value.isObject()) { return AsyncUtils.nil(); }