From e1776460c44ec8e8f2b7386a86d3ae8ed181c6a4 Mon Sep 17 00:00:00 2001 From: d-millar <33498836+d-millar@users.noreply.github.com> Date: Fri, 13 Feb 2026 12:51:27 -0500 Subject: [PATCH] GP-6401: better setuptuils GP-6401: missed one GP-6401: more re-run tweaks GP-6401: allow re-run GP-6401: minor fixes GP-6401: post-review GP-6401: help GP-6401: attach variants GP-6401: opt dbgmodel GP-6401: args fix GP-6401: better x64dbg GP-6401: simpler dbgeng GP-6401: x64dbg impl GP-6401: first pass w/ file GP-6401: first pass w/ file GP-6401: first successful attempt --- .../data/debugger-launchers/local-dbgeng.bat | 2 +- .../data/debugger-launchers/local-dbgeng.ps1 | 66 ++++++++++ .../debugger-launchers/ssh-dbgeng-attach.ps1 | 102 ++++++++++++++++ .../data/debugger-launchers/ssh-dbgeng.ps1 | 105 ++++++++++++++++ .../data/support/dbgsetuputils.ps1 | 27 +++++ .../data/support/local-dbgeng-attach.py | 37 ++++-- .../data/support/local-dbgeng.py | 43 +++++-- .../src/main/help/help/TOC_Source.xml | 3 + .../main/help/help/topics/dbgeng/dbgeng.html | 30 ++++- .../data/debugger-launchers/local-x64dbg.bat | 2 +- .../data/debugger-launchers/local-x64dbg.ps1 | 68 +++++++++++ .../debugger-launchers/ssh-x64dbg-attach.ps1 | 105 ++++++++++++++++ .../data/debugger-launchers/ssh-x64dbg.ps1 | 114 ++++++++++++++++++ .../data/support/local-x64dbg-attach.py | 31 ++++- .../data/support/local-x64dbg.py | 46 +++++-- .../data/support/x64dbgsetuputils.ps1 | 27 +++++ .../src/main/help/help/TOC_Source.xml | 3 + .../main/help/help/topics/x64dbg/x64dbg.html | 29 ++++- .../src/main/py/src/ghidraxdbg/hooks.py | 16 ++- .../data/support/setuputils.ps1 | 16 ++- .../data/support/setuputils.sh | 6 +- 21 files changed, 835 insertions(+), 43 deletions(-) create mode 100644 Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-dbgeng.ps1 create mode 100644 Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng-attach.ps1 create mode 100644 Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng.ps1 create mode 100644 Ghidra/Debug/Debugger-agent-dbgeng/data/support/dbgsetuputils.ps1 create mode 100644 Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/local-x64dbg.ps1 create mode 100644 Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg-attach.ps1 create mode 100644 Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg.ps1 create mode 100644 Ghidra/Debug/Debugger-agent-x64dbg/data/support/x64dbgsetuputils.ps1 diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-dbgeng.bat b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-dbgeng.bat index 49fdaa01dd..ed1324ef72 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-dbgeng.bat +++ b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-dbgeng.bat @@ -13,7 +13,7 @@ :: See the License for the specific language governing permissions and :: limitations under the License. :: ## -::@title dbgeng +::@title dbgeng (.bat) ::@image-opt env:OPT_TARGET_IMG ::@desc
::@desc+#@desc This will launch the target on the local machine using dbgeng. +#@desc For setup instructions, press F1. +#@desc
+#@desc +#@menu-group dbgeng +#@icon icon.debugger +#@help dbgeng#local +#@depends Debugger-rmi-trace +#@arg :file "Image" "The target binary executable image" +#@env OPT_TARGET_IMG:file="" "Image" "The target binary executable image" +#@env OPT_TARGET_ARGS:str="" "Arguments" "Command-line arguments to pass to the target" +#@env OPT_PYTHON_EXE:file!="python" "Python command" "The path to the Python 3 interpreter. Omit the full path to resolve using the system PATH." +#@env OPT_PYTHON_ARGS:str="" "python cmd args" "Arguments passed to python (versus the target)" +#@env OPT_USE_DBGMODEL:bool=true "Use dbgmodel" "Load and use dbgmodel.dll if it is available." +#@env WINDBG_DIR:dir="" "Path to dbgeng.dll directory" "Path containing dbgeng and associated DLLS (if not Windows Kits)." + +. ..\support\dbgsetuputils.ps1 + +function Compute-Python-Args { + param($TempFile) + + $arglist = @("$Env:OPT_PYTHON_EXE") + if ("$Env:OPT_PYTHON_ARGS" -ne "") { + $arglist+=($Env:OPT_PYTHON_ARGS) + } + $arglist+=($TempFile) + + $arglist+=($Env:GHIDRA_TRACE_RMI_ADDR) + $arglist+=($Env:OPT_USE_DBGMODEL) + $arglist+=($Env:OPT_TARGET_IMG) + + if ("$Env:OPT_TARGET_ARGS" -ne "") { + $arglist+=($Env:OPT_TARGET_ARGS) + } + return $arglist +} + +$pypathTrace = Ghidra-Module-PyPath "Debugger-rmi-trace" +$pypathDbg = Ghidra-Module-PyPath +$Env:PYTHONPATH = "$pypathDbg;$pypathTrace;$Env:PYTHONPATH" + +$tmpfile = "..\support\local-dbgeng.py" +$arglist = Compute-Python-Args -TempFile $tmpfile + +Start-Process -FilePath $arglist[0] -ArgumentList $arglist[1..$arglist.Count] ` + -NoNewWindow -Wait diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng-attach.ps1 b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng-attach.ps1 new file mode 100644 index 0000000000..a4ad65fa9b --- /dev/null +++ b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng-attach.ps1 @@ -0,0 +1,102 @@ +## ### +# 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. +## +#@title dbgeng attach via ssh +#@desc +#@desc+#@desc This will attach to a running target on the local machine using dbgeng.dll. +#@desc For setup instructions, press F1. +#@desc
+#@desc +#@menu-group dbgeng +#@icon icon.debugger +#@help dbgeng#ssh +#@depends Debugger-rmi-trace +#@env OPT_TARGET_PID:int=0 "Process id" "The target process id" +#@env OPT_ATTACH_FLAGS:int=0 "Attach flags" "Attach flags" +#@env OPT_SSH_PATH:file="ssh" "ssh command" "The path to ssh on the local system. Omit the full path to resolve using the system PATH." +#@env OPT_HOST:str="localhost" "[User@]Host" "The hostname or user@host" +#@env OPT_REMOTE_PORT:int=12345 "Remote Trace RMI Port" "A free port on the remote end to receive and forward the Trace RMI connection." +#@env OPT_EXTRA_SSH_ARGS:str="" "Extra ssh arguments" "Extra arguments to pass to ssh. Use with care." +#@env OPT_PYTHON_EXE:file!="python" "Python command" "The path to the Python 3 interpreter. Omit the full path to resolve using the system PATH." +#@env OPT_PYTHON_ARGS:str="" "python cmd args" "Arguments passed to python (versus the target)" +#@env OPT_USE_DBGMODEL:bool=true "Use dbgmodel" "Load and use dbgmodel.dll if it is available." + +. ..\support\dbgsetuputils.ps1 + +function Compute-Python-Args { + param($TempFile) + + $arglist = @("$Env:OPT_PYTHON_EXE") + if ("$Env:OPT_PYTHON_ARGS" -ne "") { + $arglist+=($Env:OPT_PYTHON_ARGS) + } + $arglist+=($TempFile) + + $arglist+=("localhost:$Env:OPT_REMOTE_PORT") + $arglist+=($Env:OPT_USE_DBGMODEL) + $arglist+=($Env:OPT_TARGET_PID) + $arglist+=($Env:OPT_ATTACH_FLAGS) + + return $arglist +} + +$tmpfile = "local-dbgeng-attach.py" +$arglist = Compute-Python-Args -TempFile $tmpfile + +$scpargs = Compute-Scp-Args "..\support\$tmpfile" +$sshargs = Compute-Ssh-Args $arglist True + +$scpproc = Start-Process -FilePath $scpargs[0] -ArgumentList $scpargs[1..$scpargs.Count] -NoNewWindow -Wait -PassThru +$sshproc = Start-Process -FilePath $sshargs[0] -ArgumentList $sshargs[1..$sshargs.Count] -NoNewWindow -Wait -PassThru + +$version = Get-Ghidra-Version +$answer = Check-Result-And-Prompt-Mitigation $sshproc @" +It appears ghidradbg is missing from the remote system. This can happen if you +forgot to install the required package. This can also happen if you installed +the packages to a different Python environment than is being used by the +remote's gdb. + +This script is about to offer automatic resolution. If you'd like to resolve +this manually, answer no to the next question and then see Ghidra's help by +pressing F1 in the dialog of launch parameters. + +WARNING: Answering yes to the next question will invoke pip to try to install +missing or incorrectly-versioned dependencies. It may attempt to find packages +from the PyPI mirror configured on the REMOTE system. If you have not configured +one, it will connect to the official one. + +WARNING: We invoke pip with the --break-system-packages flag, because some +debuggers that embed Python (gdb, lldb) may not support virtual environments, +and so the packages must be installed to your user environment. + +NOTE: This will copy Python wheels into the HOME directory of the user on the +remote system. You may be prompted to authenticate a few times while packages +are copied and installed. + +NOTE: Automatic resolution will cause this session to terminate. When it has +finished, try launching again. +"@ "Would you like to install 'ghidradbg>=$version'?" + +if ($answer) { + Write-Host "Copying Wheels to $Env:OPT_HOST" + Mitigate-Scp-PyModules "Debugger-rmi-trace" "+#@desc This will start dbgeng on the remote system via a Python interpreter. +#@desc For setup instructions, press F1. +#@desc
+#@desc +#@menu-group dbgeng +#@icon icon.debugger +#@help dbgeng#ssh +#@depends Debugger-rmi-trace +#@env OPT_TARGET_IMG:file="" "Image" "The target binary executable image" +#@env OPT_TARGET_ARGS:str="" "Arguments" "Command-line arguments to pass to the target" +#@env OPT_SSH_PATH:file="ssh" "ssh command" "The path to ssh on the local system. Omit the full path to resolve using the system PATH." +#@env OPT_HOST:str="localhost" "[User@]Host" "The hostname or user@host" +#@env OPT_REMOTE_PORT:int=12345 "Remote Trace RMI Port" "A free port on the remote end to receive and forward the Trace RMI connection." +#@env OPT_EXTRA_SSH_ARGS:str="" "Extra ssh arguments" "Extra arguments to pass to ssh. Use with care." +#@env OPT_PYTHON_EXE:file!="python" "Python command" "The path to the Python 3 interpreter. Omit the full path to resolve using the system PATH." +#@env OPT_PYTHON_ARGS:str="" "python cmd args" "Arguments passed to python (versus the target)" +#@env OPT_USE_DBGMODEL:bool=true "Use dbgmodel" "Load and use dbgmodel.dll if it is available." + +. ..\support\dbgsetuputils.ps1 + +function Compute-Python-Args { + param($TempFile) + + $arglist = @("$Env:OPT_PYTHON_EXE") + if ("$Env:OPT_PYTHON_ARGS" -ne "") { + $arglist+=($Env:OPT_PYTHON_ARGS) + } + $arglist+=($TempFile) + + $arglist+=("localhost:$Env:OPT_REMOTE_PORT") + $arglist+=($Env:OPT_USE_DBGMODEL) + $arglist+=($Env:OPT_TARGET_IMG) + + if ("$Env:OPT_TARGET_ARGS" -ne "") { + $arglist+=($Env:OPT_TARGET_ARGS) + } + return $arglist +} + +$tmpfile = "local-dbgeng.py" +$arglist = Compute-Python-Args -TempFile $tmpfile + +$scpargs = Compute-Scp-Args "..\support\$tmpfile" +$sshargs = Compute-Ssh-Args $arglist True + +$scpproc = Start-Process -FilePath $scpargs[0] -ArgumentList $scpargs[1..$scpargs.Count] -NoNewWindow -Wait -PassThru +$sshproc = Start-Process -FilePath $sshargs[0] -ArgumentList $sshargs[1..$sshargs.Count] -NoNewWindow -Wait -PassThru + +$version = Get-Ghidra-Version +$answer = Check-Result-And-Prompt-Mitigation $sshproc @" +It appears ghidradbg is missing from the remote system. This can happen if you +forgot to install the required package. This can also happen if you installed +the packages to a different Python environment than is being used by the +remote's gdb. + +This script is about to offer automatic resolution. If you'd like to resolve +this manually, answer no to the next question and then see Ghidra's help by +pressing F1 in the dialog of launch parameters. + +WARNING: Answering yes to the next question will invoke pip to try to install +missing or incorrectly-versioned dependencies. It may attempt to find packages +from the PyPI mirror configured on the REMOTE system. If you have not configured +one, it will connect to the official one. + +WARNING: We invoke pip with the --break-system-packages flag, because some +debuggers that embed Python (gdb, lldb) may not support virtual environments, +and so the packages must be installed to your user environment. + +NOTE: This will copy Python wheels into the HOME directory of the user on the +remote system. You may be prompted to authenticate a few times while packages +are copied and installed. + +NOTE: Automatic resolution will cause this session to terminate. When it has +finished, try launching again. +"@ "Would you like to install 'ghidradbg>=$version'?" + +if ($answer) { + Write-Host "Copying Wheels to $Env:OPT_HOST" + Mitigate-Scp-PyModules "Debugger-rmi-trace" ""ssh-dbgeng" is the remote equivalent to "dbgeng"; + "ssh-dbgeng-attach" is the remote equivalent to "dbgeng-attach". +
+ +Instructions are indentical to those above but executed on the remote machine.
+ +The "dbgeng-svrcx" launcher extends the base dbgeng launcher adding an option for connecting through a remote process server.
diff --git a/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/local-x64dbg.bat b/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/local-x64dbg.bat index 73d5c1e8fd..79185f0158 100644 --- a/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/local-x64dbg.bat +++ b/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/local-x64dbg.bat @@ -13,7 +13,7 @@ :: See the License for the specific language governing permissions and :: limitations under the License. :: ## -::@title x64dbg +::@title x64dbg (.bat) ::@image-opt env:OPT_TARGET_IMG ::@desc ::@desc+#@desc This will launch the target on the local machine using x64dbg.dll. +#@desc For setup instructions, press F1. +#@desc
+#@desc +#@menu-group x64dbg +#@icon icon.debugger +#@help x64dbg#local +#@depends Debugger-rmi-trace +#@env OPT_TARGET_IMG:file="" "Image" "The target binary executable image" +#@env OPT_TARGET_ARGS:str="" "Arguments" "Command-line arguments to pass to the target" +#@env OPT_TARGET_DIR:str="" "Dir" "Initial directory" +#@env OPT_X64DBG_EXE:file="C:\\Software\\release\\x64\\x64dbg.exe" "Path to x64dbg.exe" "Path to x64dbg.exe (or equivalent)." +#@env OPT_PYTHON_EXE:file!="python" "Python command" "The path to the Python 3 interpreter. Omit the full path to resolve using the system PATH." +#@env OPT_PYTHON_ARGS:str="" "python cmd args" "Arguments passed to python (versus the target)" + +. ..\support\x64dbgsetuputils.ps1 + +function Compute-Python-Args { + param($TempFile) + + $arglist = @("$Env:OPT_PYTHON_EXE") + if ("$Env:OPT_PYTHON_ARGS" -ne "") { + $arglist+=($Env:OPT_PYTHON_ARGS) + } + $arglist+=($TempFile) + + $arglist+=($Env:GHIDRA_TRACE_RMI_ADDR) + if ("$Env:OPT_TARGET_IMG" -ne "") { + $arglist+=($Env:OPT_TARGET_IMG) + } + if ("$Env:OPT_TARGET_DIR" -ne "") { + $arglist+=($Env:OPT_TARGET_DIR) + } + if ("$Env:OPT_TARGET_ARGS" -ne "") { + $arglist+=($Env:OPT_TARGET_ARGS) + } + return $arglist +} + +$pypathTrace = Ghidra-Module-PyPath "Debugger-rmi-trace" +$pypathDbg = Ghidra-Module-PyPath +$Env:PYTHONPATH = "$pypathDbg;$pypathTrace;$Env:PYTHONPATH" + +$tmpfile = "..\support\local-x64dbg.py" +$arglist = Compute-Python-Args -TempFile $tmpfile + +Start-Process -FilePath $arglist[0] -ArgumentList $arglist[1..$arglist.Count] ` + -NoNewWindow -Wait diff --git a/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg-attach.ps1 b/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg-attach.ps1 new file mode 100644 index 0000000000..e7dbce57a8 --- /dev/null +++ b/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg-attach.ps1 @@ -0,0 +1,105 @@ +## ### +# 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. +## +#@title x64dbg attach via ssh +#@desc +#@desc+#@desc This will attach to a running target on the rempote machine using x64dbg.dll. +#@desc For setup instructions, press F1. +#@desc
+#@desc +#@menu-group x64dbg +#@icon icon.debugger +#@help x64dbg#ssh +#@depends Debugger-rmi-trace +#@env OPT_TARGET_PID:int=0 "Process id" "The target process id" +#@env OPT_TARGET_DIR:str="" "Dir" "Initial directory" +#@env OPT_SSH_PATH:file="ssh" "ssh command" "The path to ssh on the local system. Omit the full path to resolve using the system PATH." +#@env OPT_HOST:str="localhost" "[User@]Host" "The hostname or user@host" +#@env OPT_REMOTE_PORT:int=12345 "Remote Trace RMI Port" "A free port on the remote end to receive and forward the Trace RMI connection." +#@env OPT_EXTRA_SSH_ARGS:str="" "Extra ssh arguments" "Extra arguments to pass to ssh. Use with care." +#@env OPT_X64DBG_EXE:file="C:\\Software\\release\\x64\\x64dbg.exe" "Path to x64dbg.exe" "Path to x64dbg.exe (or equivalent)." +#@env OPT_PYTHON_EXE:file!="python" "Python command" "The path to the Python 3 interpreter. Omit the full path to resolve using the system PATH." +#@env OPT_PYTHON_ARGS:str="" "python cmd args" "Arguments passed to python (versus the target)" + +. ..\support\x64dbgsetuputils.ps1 + +function Compute-Python-Args { + param($TempFile) + + $arglist = @("$Env:OPT_PYTHON_EXE") + if ("$Env:OPT_PYTHON_ARGS" -ne "") { + $arglist+=($Env:OPT_PYTHON_ARGS) + } + $arglist+=($TempFile) + if ("$Env:OPT_REMOTE_PORT" -ne "") { + $arglist+=("localhost:$Env:OPT_REMOTE_PORT") + } + else { + $arglist+=($Env:GHIDRA_TRACE_RMI_ADDR) + } + + $arglist+=($Env:OPT_TARGET_PID) + + return $arglist +} + +$tmpfile = "local-x64dbg-attach.py" +$arglist = Compute-Python-Args -TempFile $tmpfile + +$scpargs = Compute-Scp-Args "..\support\$tmpfile" +$sshargs = Compute-Ssh-Args $arglist True + +$scpproc = Start-Process -FilePath $scpargs[0] -ArgumentList $scpargs[1..$scpargs.Count] -NoNewWindow -Wait -PassThru +$sshproc = Start-Process -FilePath $sshargs[0] -ArgumentList $sshargs[1..$sshargs.Count] -NoNewWindow -Wait -PassThru + +$version = Get-Ghidra-Version +$answer = Check-Result-And-Prompt-Mitigation $sshproc @" +It appears ghidradbg is missing from the remote system. This can happen if you +forgot to install the required package. This can also happen if you installed +the packages to a different Python environment than is being used by the +remote's gdb. + +This script is about to offer automatic resolution. If you'd like to resolve +this manually, answer no to the next question and then see Ghidra's help by +pressing F1 in the dialog of launch parameters. + +WARNING: Answering yes to the next question will invoke pip to try to install +missing or incorrectly-versioned dependencies. It may attempt to find packages +from the PyPI mirror configured on the REMOTE system. If you have not configured +one, it will connect to the official one. + +WARNING: We invoke pip with the --break-system-packages flag, because some +debuggers that embed Python (gdb, lldb) may not support virtual environments, +and so the packages must be installed to your user environment. + +NOTE: This will copy Python wheels into the HOME directory of the user on the +remote system. You may be prompted to authenticate a few times while packages +are copied and installed. + +NOTE: Automatic resolution will cause this session to terminate. When it has +finished, try launching again. +"@ "Would you like to install 'ghidradbg>=$version'?" + +if ($answer) { + Write-Host "Copying Wheels to $Env:OPT_HOST" + Mitigate-Scp-PyModules "Debugger-rmi-trace" "+#@desc This will start x64dbg on the remote system via a Python interpreter. +#@desc For setup instructions, press F1. +#@desc
+#@desc +#@menu-group x64dbg +#@icon icon.debugger +#@help x64dbg#ssh +#@depends Debugger-rmi-trace +#@env OPT_TARGET_IMG:file="" "Image" "The target binary executable image" +#@env OPT_TARGET_ARGS:str="" "Arguments" "Command-line arguments to pass to the target" +#@env OPT_TARGET_DIR:str="" "Dir" "Initial directory" +#@env OPT_SSH_PATH:file="ssh" "ssh command" "The path to ssh on the local system. Omit the full path to resolve using the system PATH." +#@env OPT_HOST:str="localhost" "[User@]Host" "The hostname or user@host" +#@env OPT_REMOTE_PORT:int=12345 "Remote Trace RMI Port" "A free port on the remote end to receive and forward the Trace RMI connection." +#@env OPT_EXTRA_SSH_ARGS:str="" "Extra ssh arguments" "Extra arguments to pass to ssh. Use with care." +#@env OPT_X64DBG_EXE:file="C:\\Software\\release\\x64\\x64dbg.exe" "Path to x64dbg.exe" "Path to x64dbg.exe (or equivalent)." +#@env OPT_PYTHON_EXE:file!="python" "Python command" "The path to the Python 3 interpreter. Omit the full path to resolve using the system PATH." +#@env OPT_PYTHON_ARGS:str="" "python cmd args" "Arguments passed to python (versus the target)" + +. ..\support\x64dbgsetuputils.ps1 + +function Compute-Python-Args { + param($TempFile) + + $arglist = @("$Env:OPT_PYTHON_EXE") + if ("$Env:OPT_PYTHON_ARGS" -ne "") { + $arglist+=($Env:OPT_PYTHON_ARGS) + } + $arglist+=($TempFile) + if ("$Env:OPT_REMOTE_PORT" -ne "") { + $arglist+=("localhost:$Env:OPT_REMOTE_PORT") + } + else { + $arglist+=($Env:GHIDRA_TRACE_RMI_ADDR) + } + + if ("$Env:OPT_TARGET_IMG" -ne "") { + $arglist+=($Env:OPT_TARGET_IMG) + } + if ("$Env:OPT_TARGET_DIR" -ne "") { + $arglist+=($Env:OPT_TARGET_DIR) + } + if ("$Env:OPT_TARGET_ARGS" -ne "") { + $arglist+=($Env:OPT_TARGET_ARGS) + } + return $arglist +} + +$tmpfile = "local-x64dbg.py" +$arglist = Compute-Python-Args -TempFile $tmpfile + +$scpargs = Compute-Scp-Args "..\support\$tmpfile" +$sshargs = Compute-Ssh-Args $arglist True + +$scpproc = Start-Process -FilePath $scpargs[0] -ArgumentList $scpargs[1..$scpargs.Count] -NoNewWindow -Wait -PassThru +$sshproc = Start-Process -FilePath $sshargs[0] -ArgumentList $sshargs[1..$sshargs.Count] -NoNewWindow -Wait -PassThru + +$version = Get-Ghidra-Version +$answer = Check-Result-And-Prompt-Mitigation $sshproc @" +It appears ghidradbg is missing from the remote system. This can happen if you +forgot to install the required package. This can also happen if you installed +the packages to a different Python environment than is being used by the +remote's gdb. + +This script is about to offer automatic resolution. If you'd like to resolve +this manually, answer no to the next question and then see Ghidra's help by +pressing F1 in the dialog of launch parameters. + +WARNING: Answering yes to the next question will invoke pip to try to install +missing or incorrectly-versioned dependencies. It may attempt to find packages +from the PyPI mirror configured on the REMOTE system. If you have not configured +one, it will connect to the official one. + +WARNING: We invoke pip with the --break-system-packages flag, because some +debuggers that embed Python (gdb, lldb) may not support virtual environments, +and so the packages must be installed to your user environment. + +NOTE: This will copy Python wheels into the HOME directory of the user on the +remote system. You may be prompted to authenticate a few times while packages +are copied and installed. + +NOTE: Automatic resolution will cause this session to terminate. When it has +finished, try launching again. +"@ "Would you like to install 'ghidradbg>=$version'?" + +if ($answer) { + Write-Host "Copying Wheels to $Env:OPT_HOST" + Mitigate-Scp-PyModules "Debugger-rmi-trace" "Two launchers are included out of the box, one for a local process and one for a local pid:
+Local launchers are included, one for a local process and one for a local pid, and ssh equivalents:
"ssh-x64dbg" is the remote equivalent to "x64dbg"; + "ssh-x64dbg-attach" is the remote equivalent to "x64dbg-attach". +
+ +Instructions are indentical to those above but executed on the remote machine.
+ +