From be98f20ed0261a05b8a98bbe8c29e52cd7b862bf Mon Sep 17 00:00:00 2001 From: d-millar <33498836+d-millar@users.noreply.github.com> Date: Fri, 28 Mar 2025 17:30:04 -0400 Subject: [PATCH] GP-5546: standalone listener --- .../data/support/standalone_listener.py | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 Ghidra/Debug/Debugger-agent-dbgeng/data/support/standalone_listener.py diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/data/support/standalone_listener.py b/Ghidra/Debug/Debugger-agent-dbgeng/data/support/standalone_listener.py new file mode 100644 index 0000000000..3c11f2aaf2 --- /dev/null +++ b/Ghidra/Debug/Debugger-agent-dbgeng/data/support/standalone_listener.py @@ -0,0 +1,80 @@ +## ### +# IP: GHIDRA +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +## + +# TO LAUNCH: py -i standalone_listener.py "path_to_target.exe" + +import os +import sys + + +home = os.getenv('GHIDRA_HOME') + +if os.path.isdir(f'{home}\\ghidra\\.git'): + sys.path.append( + f'{home}\\ghidra\\Ghidra\\Debug\\Debugger-agent-dbgeng\\build\\pypkg\\src') + sys.path.append( + f'{home}\\ghidra\\Ghidra\\Debug\\Debugger-rmi-trace\\build\\pypkg\\src') +elif os.path.isdir(f'{home}\\.git'): + sys.path.append( + f'{home}\\Ghidra\\Debug\\Debugger-agent-dbgeng\\build\\pypkg\\src') + sys.path.append( + f'{home}\\Ghidra\\Debug\\Debugger-rmi-trace\\build\\pypkg\\src') +else: + sys.path.append( + f'{home}\\Ghidra\\Debug\\Debugger-agent-dbgeng\\pypkg\\src') + sys.path.append(f'{home}\\Ghidra\\Debug\\Debugger-rmi-trace\\pypkg\\src') + + +def main(): + # Delay these imports until sys.path is patched + from ghidradbg import commands as cmd + from pybag.dbgeng import core as DbgEng + from ghidradbg.hooks import on_state_changed + from ghidradbg.util import dbg + + # So that the user can re-enter by typing repl() + global repl + repl = cmd.repl + + cmd.ghidra_trace_listen() + args = os.getenv('OPT_TARGET_ARGS') + if args: + args = ' ' + args + else: + args = '' + target = sys.argv[1] + if target is None or target == "": + print("dbgeng requires a target image - please try again.") + cmd.ghidra_trace_disconnect() + return + + cmd.ghidra_trace_create(target + args, start_trace=False) + + # TODO: HACK + try: + dbg.wait() + except KeyboardInterrupt as ki: + dbg.interrupt() + + cmd.ghidra_trace_start(target) + cmd.ghidra_trace_sync_enable() + + on_state_changed(DbgEng.DEBUG_CES_EXECUTION_STATUS, DbgEng.DEBUG_STATUS_BREAK) + cmd.repl() + + +if __name__ == '__main__': + main()