GP-4441: new option for target remote

GP-4441: post-review edits
GP-4441: first pass
GP-4441: working remote gdb/lldbGP-4441: updated via 4437GP-4441: embedded updatesGP-4441: set arch conditionally
This commit is contained in:
d-millar 2024-03-20 15:24:04 -04:00
parent f034eca003
commit 918d38c468
10 changed files with 204 additions and 30 deletions

View file

@ -1,4 +1,4 @@
#!/usr/bin/bash
#!/usr/bin/env bash
## ###
# IP: GHIDRA
#
@ -30,9 +30,11 @@
#@menu-group remote
#@icon icon.debugger
#@help TraceRmiLauncherServicePlugin#gdb
#@arg :str "Image" "The target binary executable image on the remote system"
#@enum TargetType:str remote extended-remote
#@env OPT_TARGET_TYPE:TargetType="remote" "Target" "The type of remote target"
#@env OPT_HOST:str="localhost" "Host" "The hostname of the target"
#@env OPT_PORT:str="9999" "Port" "The host's listening port"
#@env OPT_ARCH:str="" "Architecture (optional)" "Target architecture override"
#@env OPT_GDB_PATH:str="gdb" "Path to gdb" "The path to gdb on the local system. Omit the full path to resolve using the system PATH."
if [ -d ${GHIDRA_HOME}/ghidra/.git ]
@ -48,13 +50,21 @@ else
export PYTHONPATH=$GHIDRA_HOME/Ghidra/Debug/Debugger-rmi-trace/pypkg/src:$PYTHONPATH
fi
if [ -z "$OPT_ARCH" ]
then
archcmd=
else
archcmd=-ex "set arch $OPT_ARCH"
fi
"$OPT_GDB_PATH" \
-q \
-ex "set pagination off" \
-ex "set confirm off" \
-ex "show version" \
-ex "python import ghidragdb" \
-ex "target remote $OPT_HOST:$OPT_PORT" \
$archcmd \
-ex "target $OPT_TARGET_TYPE $OPT_HOST:$OPT_PORT" \
-ex "ghidra trace connect \"$GHIDRA_TRACE_RMI_ADDR\"" \
-ex "ghidra trace start" \
-ex "ghidra trace sync-enable" \

View file

@ -1524,7 +1524,7 @@ def ghidra_trace_sync_synth_stopped(*, is_mi, **kwargs):
"""
hooks.on_stop(object()) # Pass a fake event
@cmd('ghidra util wait-stopped', '-ghidra-util-wait-stopped', gdb.COMMAND_NONE, False)
def ghidra_util_wait_stopped(timeout='1', *, is_mi, **kwargs):

View file

@ -541,18 +541,18 @@ def install_hooks():
HOOK_STATE.mem_catchpoint.enabled = True
else:
breaks_before = set(gdb.breakpoints())
gdb.execute("""
catch syscall group:memory
commands
silent
hooks-ghidra event-memory
cont
end
""")
bpts = gdb.breakpoints()
# NB: this is unnecessary for gdb 11+
if len(bpts) > 0:
HOOK_STATE.mem_catchpoint = (set(bpts) - breaks_before).pop()
try:
gdb.execute("""
catch syscall group:memory
commands
silent
hooks-ghidra event-memory
cont
end
""")
HOOK_STATE.mem_catchpoint = (set(gdb.breakpoints()) - breaks_before).pop()
except Exception as e:
print(f"Error setting memory catchpoint: {e}")
gdb.events.cont.connect(on_cont)
gdb.events.stop.connect(on_stop)

View file

@ -74,7 +74,7 @@ THREADS_PATTERN = extre(INFERIOR_PATTERN, '\.Threads')
THREAD_PATTERN = extre(THREADS_PATTERN, '\[(?P<tnum>\\d*)\]')
STACK_PATTERN = extre(THREAD_PATTERN, '\.Stack')
FRAME_PATTERN = extre(STACK_PATTERN, '\[(?P<level>\\d*)\]')
REGS_PATTERN = extre(FRAME_PATTERN, '.Registers')
REGS_PATTERN = extre(FRAME_PATTERN, '\.Registers')
MEMORY_PATTERN = extre(INFERIOR_PATTERN, '\.Memory')
MODULES_PATTERN = extre(INFERIOR_PATTERN, '\.Modules')
MODULE_PATTERN = extre(MODULES_PATTERN, '\[(?P<modname>.*)\]')