diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-dbgeng.ps1 b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-dbgeng.ps1 index df1110b240..c06d0bc0f5 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-dbgeng.ps1 +++ b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-dbgeng.ps1 @@ -39,6 +39,7 @@ function Compute-Python-Args { param($TempFile) $arglist = @("$Env:OPT_PYTHON_EXE") + $arglist+=@("-i") if ("$Env:OPT_PYTHON_ARGS" -ne "") { $arglist+=($Env:OPT_PYTHON_ARGS) } 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 index 849d353aed..8f16c6aa0a 100644 --- 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 @@ -41,6 +41,7 @@ function Compute-Python-Args { param($TempFile) $arglist = @("$Env:OPT_PYTHON_EXE") + $arglist+=@("-i") if ("$Env:OPT_PYTHON_ARGS" -ne "") { $arglist+=($Env:OPT_PYTHON_ARGS) } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng-attach.sh b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng-attach.sh new file mode 100755 index 0000000000..245bc51e58 --- /dev/null +++ b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng-attach.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash +## ### +# 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 (shell) +#@image-opt arg:1 +#@desc +#@desc

Launch with dbgeng via ssh

+#@desc

+#@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_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.sh + +target_image=$(echo $OPT_TARGET_IMG | sed 's/\\/\\\\/g') + +OPT_OS_WINDOWS=true + +function launch-dbg-scp() { + local -a scpargs + compute-scp-args "../support/local-dbgeng-attach.py" + + "${scpargs[@]}" +} + +function launch-dbg-ssh() { + local -a sshargs + compute-ssh-args true "$OPT_PYTHON_EXE -i $OPT_PYTHON_ARGS .\\local-dbgeng-attach.py localhost:$OPT_REMOTE_PORT $OPT_USE_DBGMODEL $OPT_TARGET_PID $OPT_ATTACH_FLAGS" + + "${sshargs[@]}" +} + +version=$(get-ghidra-version) + +function do-installation() { + local -a pipargs + compute-dbg-pipinstall-args "'-f'" "os.environ['HOME']" "'ghidradbg>=$version'" + local -a sshargs + compute-ssh-args false "${pipargs[@]}" + + "${sshargs[@]}" +} + +launch-dbg-scp +launch-dbg-ssh "$@" +if check-result-and-prompt-mitigation $? " +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 dbgeng. + +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'?"; then + + echo "Copying Wheels to $OPT_HOST" + mitigate-scp-pymodules "Debugger-rmi-trace" "" + + echo "Installing Wheels into Python" + do-installation +fi diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng.ps1 b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng.ps1 index 2208baa218..e1eca494ce 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng.ps1 +++ b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng.ps1 @@ -42,6 +42,7 @@ function Compute-Python-Args { param($TempFile) $arglist = @("$Env:OPT_PYTHON_EXE") + $arglist+=@("-i") if ("$Env:OPT_PYTHON_ARGS" -ne "") { $arglist+=($Env:OPT_PYTHON_ARGS) } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng.sh b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng.sh new file mode 100755 index 0000000000..a5bc2814c6 --- /dev/null +++ b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/ssh-dbgeng.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash +## ### +# 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 via ssh (shell) +#@image-opt arg:1 +#@desc +#@desc

Launch with dbgeng via ssh

+#@desc

+#@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.sh + +target_image=$(echo $OPT_TARGET_IMG | sed 's/\\/\\\\/g') + +OPT_OS_WINDOWS=true + +function launch-dbg-scp() { + local -a scpargs + compute-scp-args "../support/local-dbgeng.py" + + "${scpargs[@]}" +} + +function launch-dbg-ssh() { + local -a sshargs + compute-ssh-args true "$OPT_PYTHON_EXE -i $OPT_PYTHON_ARGS .\\local-dbgeng.py localhost:$OPT_REMOTE_PORT $OPT_USE_DBGMODEL $target_image $OPT_TARGET_ARGS" + + "${sshargs[@]}" +} + +version=$(get-ghidra-version) + +function do-installation() { + local -a pipargs + compute-dbg-pipinstall-args "'-f'" "os.environ['HOME']" "'ghidradbg>=$version'" + local -a sshargs + compute-ssh-args false "${pipargs[@]}" + + "${sshargs[@]}" +} + +launch-dbg-scp +launch-dbg-ssh "$@" +if check-result-and-prompt-mitigation $? " +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 dbgeng. + +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'?"; then + + echo "Copying Wheels to $OPT_HOST" + mitigate-scp-pymodules "Debugger-rmi-trace" "" + + echo "Installing Wheels into Python" + do-installation +fi diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/data/support/dbgsetuputils.sh b/Ghidra/Debug/Debugger-agent-dbgeng/data/support/dbgsetuputils.sh new file mode 100644 index 0000000000..6b6a4f1aae --- /dev/null +++ b/Ghidra/Debug/Debugger-agent-dbgeng/data/support/dbgsetuputils.sh @@ -0,0 +1,24 @@ +## ### +# 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. +## +. $MODULE_Debugger_rmi_trace_HOME/data/support/setuputils.sh + +compute-dbg-pipinstall-args() { + local argvpart + printf -v argvpart ", %s" "$@" + pipargs=("$OPT_PYTHON_EXE") + pipargs+=(-c) + pipargs+=("import os, sys, runpy; sys.argv=['pip', 'install', '--force-reinstall'$argvpart]; os.environ['PIP_BREAK_SYSTEM_PACKAGE']='1'; runpy.run_module('pip', run_name='__main__')") +} diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/data/support/local-dbgeng-attach.py b/Ghidra/Debug/Debugger-agent-dbgeng/data/support/local-dbgeng-attach.py index 4be21167c8..bb0aca17eb 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/data/support/local-dbgeng-attach.py +++ b/Ghidra/Debug/Debugger-agent-dbgeng/data/support/local-dbgeng-attach.py @@ -51,7 +51,11 @@ def append_paths(): def main(): + global cxn, target, args append_paths() + if not parse_parameters(): + return + # Delay these imports until sys.path is patched try: import ghidradbg 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 e291c9e931..ab1f7c3f53 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 @@ -39,6 +39,7 @@ function Compute-Python-Args { param($TempFile) $arglist = @("$Env:OPT_PYTHON_EXE") + $arglist+=@("-i") if ("$Env:OPT_PYTHON_ARGS" -ne "") { $arglist+=($Env:OPT_PYTHON_ARGS) } 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 index 1b55f480c1..b2b6287fdd 100644 --- 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 @@ -41,6 +41,7 @@ function Compute-Python-Args { param($TempFile) $arglist = @("$Env:OPT_PYTHON_EXE") + $arglist+=@("-i") if ("$Env:OPT_PYTHON_ARGS" -ne "") { $arglist+=($Env:OPT_PYTHON_ARGS) } diff --git a/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg-attach.sh b/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg-attach.sh new file mode 100755 index 0000000000..440f1a4cb7 --- /dev/null +++ b/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg-attach.sh @@ -0,0 +1,106 @@ +#!/usr/bin/env bash +## ### +# 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 (shell) +#@image-opt arg:1 +#@desc +#@desc

Launch with x64dbg via ssh

+#@desc

+#@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_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.sh + +target_image=$(echo $OPT_TARGET_IMG | sed 's/\\/\\\\/g') +x64dbg_exe=$(echo $OPT_X64DBG_EXE | sed 's/\\/\\\\/g') + +OPT_OS_WINDOWS=true + +function launch-x64dbg-scp() { + local -a scpargs + compute-scp-args "../support/local-x64dbg-attach.py" + + "${scpargs[@]}" +} + +function launch-x64dbg-ssh() { + local -a sshargs + compute-ssh-args true "$OPT_PYTHON_EXE -i $OPT_PYTHON_ARGS .\\local-x64dbg-attach.py localhost:$OPT_REMOTE_PORT $OPT_TARGET_PID $x64dbg_exe" + + "${sshargs[@]}" +} + +version=$(get-ghidra-version) + +function do-installation() { + local -a pipargs + compute-dbg-pipinstall-args "'-f'" "os.environ['HOME']" "'ghidraxdbg>=$version'" + local -a sshargs + compute-ssh-args false "${pipargs[@]}" + + "${sshargs[@]}" +} + +launch-x64dbg-scp +launch-x64dbg-ssh "$@" +if check-result-and-prompt-mitigation $? " +It appears ghidraxdbg 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 x64dbg. + +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'?"; then + + echo "Copying Wheels to $OPT_HOST" + mitigate-scp-pymodules "Debugger-rmi-trace" "" + + echo "Installing Wheels into python" + do-installation +fi diff --git a/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg.ps1 b/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg.ps1 index 8da0081fd7..075668c2d5 100644 --- a/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg.ps1 +++ b/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg.ps1 @@ -43,6 +43,7 @@ function Compute-Python-Args { param($TempFile) $arglist = @("$Env:OPT_PYTHON_EXE") + $arglist+=@("-i") if ("$Env:OPT_PYTHON_ARGS" -ne "") { $arglist+=($Env:OPT_PYTHON_ARGS) } diff --git a/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg.sh b/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg.sh new file mode 100755 index 0000000000..045bdc06fd --- /dev/null +++ b/Ghidra/Debug/Debugger-agent-x64dbg/data/debugger-launchers/ssh-x64dbg.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash +## ### +# 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 via ssh (shell) +#@image-opt arg:1 +#@desc +#@desc

Launch with x64dbg via ssh

+#@desc

+#@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.sh + +target_image=$(echo $OPT_TARGET_IMG | sed 's/\\/\\\\/g') +x64dbg_exe=$(echo $OPT_X64DBG_EXE | sed 's/\\/\\\\/g') + +OPT_OS_WINDOWS=true + +function launch-x64dbg-scp() { + local -a scpargs + compute-scp-args "../support/local-x64dbg.py" + + "${scpargs[@]}" +} + +function launch-x64dbg-ssh() { + local -a sshargs + compute-ssh-args true "$OPT_PYTHON_EXE -i $OPT_PYTHON_ARGS .\\local-x64dbg.py localhost:$OPT_REMOTE_PORT $target_image $x64dbg_exe $OPT_TARGET_DIR $OPT_TARGET_ARGS" + + "${sshargs[@]}" +} + +version=$(get-ghidra-version) + +function do-installation() { + local -a pipargs + compute-x64dbg-pipinstall-args "'-f'" "os.environ['HOME']" "'ghidradbg>=$version'" + local -a sshargs + compute-ssh-args false "${pipargs[@]}" + + "${sshargs[@]}" +} + +launch-x64dbg-scp +launch-x64dbg-ssh "$@" +if check-result-and-prompt-mitigation $? " +It appears ghidraxdbg 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 x64dbg. + +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'?"; then + + echo "Copying Wheels to $OPT_HOST" + mitigate-scp-pymodules "Debugger-rmi-trace" "" + + echo "Installing Wheels into python" + do-installation +fi diff --git a/Ghidra/Debug/Debugger-agent-x64dbg/data/support/local-x64dbg-attach.py b/Ghidra/Debug/Debugger-agent-x64dbg/data/support/local-x64dbg-attach.py index eaf85d9126..69a1570bee 100644 --- a/Ghidra/Debug/Debugger-agent-x64dbg/data/support/local-x64dbg-attach.py +++ b/Ghidra/Debug/Debugger-agent-x64dbg/data/support/local-x64dbg-attach.py @@ -47,13 +47,16 @@ def append_paths(): def main(): + global cxn, target, args, initdir append_paths() + if not parse_parameters(): + return + # Delay these imports until sys.path is patched try: import ghidraxdbg except: - print(e) - exit(253) + exit(253) from ghidraxdbg import commands as cmd from ghidraxdbg.hooks import on_state_changed from ghidraxdbg.util import dbg diff --git a/Ghidra/Debug/Debugger-agent-x64dbg/data/support/local-x64dbg.py b/Ghidra/Debug/Debugger-agent-x64dbg/data/support/local-x64dbg.py index 6fffa36d7f..d5aacc64e0 100644 --- a/Ghidra/Debug/Debugger-agent-x64dbg/data/support/local-x64dbg.py +++ b/Ghidra/Debug/Debugger-agent-x64dbg/data/support/local-x64dbg.py @@ -66,7 +66,6 @@ def main(): try: import ghidraxdbg except Exception as e: - print(e) exit(253) from ghidraxdbg import commands as cmd from ghidraxdbg.hooks import on_state_changed diff --git a/Ghidra/Debug/Debugger-agent-x64dbg/data/support/x64dbgsetuputils.sh b/Ghidra/Debug/Debugger-agent-x64dbg/data/support/x64dbgsetuputils.sh new file mode 100644 index 0000000000..a25de6975e --- /dev/null +++ b/Ghidra/Debug/Debugger-agent-x64dbg/data/support/x64dbgsetuputils.sh @@ -0,0 +1,24 @@ +## ### +# 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. +## +. $MODULE_Debugger_rmi_trace_HOME/data/support/setuputils.sh + +compute-x64dbg-pipinstall-args() { + local argvpart + printf -v argvpart ", %s" "$@" + pipargs=("$OPT_PYTHON_EXE") + pipargs+=(-c) + pipargs+=("import os, sys, runpy; sys.argv=['pip', 'install', '--force-reinstall'$argvpart]; os.environ['PIP_BREAK_SYSTEM_PACKAGE']='1'; runpy.run_module('pip', run_name='__main__')") +} diff --git a/Ghidra/Debug/Debugger-rmi-trace/data/support/setuputils.sh b/Ghidra/Debug/Debugger-rmi-trace/data/support/setuputils.sh index fd0bdf8890..ed927a2223 100644 --- a/Ghidra/Debug/Debugger-rmi-trace/data/support/setuputils.sh +++ b/Ghidra/Debug/Debugger-rmi-trace/data/support/setuputils.sh @@ -90,7 +90,9 @@ compute-ssh-args() { printf -v qargs '%q ' "$@" sshargs+=("$OPT_SSH_PATH") - sshargs+=(-t) + if [ -n "$OPT_OS_WINDOWS" ]; then + sshargs+=(-t) + fi if [ "$forward" == "true" ]; then sshargs+=("-R$OPT_REMOTE_PORT:$GHIDRA_TRACE_RMI_ADDR") fi @@ -105,6 +107,14 @@ compute-ssh-args() { fi } +compute-scp-args() { + tmpfile=$1 + + scpargs+=$(echo $OPT_SSH_PATH | sed 's/ssh/scp/g') + scpargs+=("$tmpfile") + scpargs+=("$OPT_HOST:~/") +} + check-result-and-prompt-mitigation() { exitcode=$1 msg=$2