mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-28 12:36:25 +08:00
Merge remote-tracking branch
'origin/GP-6174_d-millar_android_attach--SQUASHED' (#6386, #8225)
This commit is contained in:
@@ -0,0 +1,48 @@
|
|||||||
|
## ###
|
||||||
|
# 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 lldb Android (Attach)
|
||||||
|
#@image-opt arg:1
|
||||||
|
#@desc <html><body width="300px">
|
||||||
|
#@desc <h3>Launch with local <tt>lldb</tt> and attach to an Android target.</h3>
|
||||||
|
#@desc <p>
|
||||||
|
#@desc This will start <tt>lldb</tt> on the local system and then use it to connect to the remote system.
|
||||||
|
#@desc For setup instructions, press <b>F1</b>.
|
||||||
|
#@desc </p>
|
||||||
|
#@desc </body></html>
|
||||||
|
#@menu-group lldb
|
||||||
|
#@icon icon.debugger
|
||||||
|
#@help lldb#android-attach
|
||||||
|
#@depends Debugger-rmi-trace
|
||||||
|
#@env OPT_TARGET_PID:int=0 "Process id" "The target process id"
|
||||||
|
#@env OPT_DEVICE:str="" "Device" "The device name (e.g. from 'adb devices')"
|
||||||
|
#@env OPT_PORT:str="9999" "Port" "The host's listening port"
|
||||||
|
#@env OPT_ARCH:str="" "Architecture" "Target architecture override"
|
||||||
|
#@env OPT_LLDB_PATH:file="lldb" "lldb command" "The path to lldb on the local system. Omit the full path to resolve using the system PATH."
|
||||||
|
#@env OPT_EXTRA_CMDS:str="" "Additional commands" "Follow-up lldb commands."
|
||||||
|
|
||||||
|
. ..\support\lldbsetuputils.ps1
|
||||||
|
|
||||||
|
$pypathTrace = Ghidra-Module-PyPath "Debugger-rmi-trace"
|
||||||
|
$pypathLldb = Ghidra-Module-PyPath
|
||||||
|
$Env:PYTHONPATH = "$pypathLldb;$pypathTrace;$Env:PYTHONPATH"
|
||||||
|
|
||||||
|
$arglist = Compute-Lldb-Platform-Args-Attach `
|
||||||
|
-TargetPid "$Env:OPT_TARGET_PID" `
|
||||||
|
-TargetType "remote-android" `
|
||||||
|
-TargetUrl "connect://$Env:OPT_DEVICE`:$Env:OPT_PORT" `
|
||||||
|
-RmiAddress "$Env:GHIDRA_TRACE_RMI_ADDR"
|
||||||
|
|
||||||
|
Start-Process -FilePath $arglist[0] -ArgumentList $arglist[1..$arglist.Count] -NoNewWindow -Wait
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
#!/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 lldb Android (Attach)
|
||||||
|
#@image-opt arg:1
|
||||||
|
#@desc <html><body width="300px">
|
||||||
|
#@desc <h3>Launch with local <tt>lldb</tt> and attach to an Android target.</h3>
|
||||||
|
#@desc <p>
|
||||||
|
#@desc This will start <tt>lldb</tt> on the local system and then use it to connect to the remote system.
|
||||||
|
#@desc For setup instructions, press <b>F1</b>.
|
||||||
|
#@desc </p>
|
||||||
|
#@desc </body></html>
|
||||||
|
#@menu-group lldb
|
||||||
|
#@icon icon.debugger
|
||||||
|
#@help lldb#android-attach
|
||||||
|
#@depends Debugger-rmi-trace
|
||||||
|
#@env OPT_TARGET_PID:int=0 "Process id" "The target process id"
|
||||||
|
#@env OPT_DEVICE:str="" "Device" "The device name (e.g. from 'adb devices')"
|
||||||
|
#@env OPT_PORT:str="9999" "Port" "The host's listening port"
|
||||||
|
#@env OPT_ARCH:str="" "Architecture" "Target architecture override"
|
||||||
|
#@env OPT_LLDB_PATH:file="lldb" "lldb command" "The path to lldb on the local system. Omit the full path to resolve using the system PATH."
|
||||||
|
#@env OPT_EXTRA_CMDS:str="" "Additional commands" "Follow-up lldb commands."
|
||||||
|
|
||||||
|
. ../support/lldbsetuputils.sh
|
||||||
|
|
||||||
|
pypathTrace=$(ghidra-module-pypath "Debugger-rmi-trace")
|
||||||
|
pypathLldb=$(ghidra-module-pypath)
|
||||||
|
export PYTHONPATH=$pypathLldb:$pypathTrace:$PYTHONPATH
|
||||||
|
|
||||||
|
function launch-lldb() {
|
||||||
|
local -a args
|
||||||
|
compute-lldb-platform-args-attach "$OPT_TARGET_PID" remote-android "connect://$OPT_DEVICE:$OPT_PORT" "$GHIDRA_TRACE_RMI_ADDR" "$@"
|
||||||
|
|
||||||
|
"${args[@]}"
|
||||||
|
}
|
||||||
|
launch-lldb "$@"
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
#@enum StartCmd:str "process launch" "process launch --stop-at-entry"
|
#@enum StartCmd:str "process launch" "process launch --stop-at-entry"
|
||||||
#@arg :file "Image" "The target binary executable image"
|
#@arg :file "Image" "The target binary executable image"
|
||||||
#@env OPT_TARGET_ARGS:str="" "Arguments" "Command-line arguments to pass to the target"
|
#@env OPT_TARGET_ARGS:str="" "Arguments" "Command-line arguments to pass to the target"
|
||||||
#@env OPT_HOST:str="localhost" "Host" "The hostname of the target"
|
#@env OPT_DEVICE:str="" "Device" "The device name (e.g. from 'adb devices')"
|
||||||
#@env OPT_PORT:str="9999" "Port" "The host's listening port"
|
#@env OPT_PORT:str="9999" "Port" "The host's listening port"
|
||||||
#@env OPT_ARCH:str="" "Architecture" "Target architecture override"
|
#@env OPT_ARCH:str="" "Architecture" "Target architecture override"
|
||||||
#@env OPT_LLDB_PATH:file="lldb" "lldb command" "The path to lldb on the local system. Omit the full path to resolve using the system PATH."
|
#@env OPT_LLDB_PATH:file="lldb" "lldb command" "The path to lldb on the local system. Omit the full path to resolve using the system PATH."
|
||||||
@@ -44,7 +44,7 @@ $Env:PYTHONPATH = "$pypathLldb;$pypathTrace;$Env:PYTHONPATH"
|
|||||||
$arglist = Compute-Lldb-Platform-Args `
|
$arglist = Compute-Lldb-Platform-Args `
|
||||||
-TargetImage $args[0] `
|
-TargetImage $args[0] `
|
||||||
-TargetType "remote-android" `
|
-TargetType "remote-android" `
|
||||||
-TargetUrl "connect://$Env:OPT_HOST`:$Env:OPT_PORT" `
|
-TargetUrl "connect://$Env:OPT_DEVICE`:$Env:OPT_PORT" `
|
||||||
-RmiAddress "$Env:GHIDRA_TRACE_RMI_ADDR"
|
-RmiAddress "$Env:GHIDRA_TRACE_RMI_ADDR"
|
||||||
|
|
||||||
Start-Process -FilePath $arglist[0] -ArgumentList $arglist[1..$arglist.Count] -NoNewWindow -Wait
|
Start-Process -FilePath $arglist[0] -ArgumentList $arglist[1..$arglist.Count] -NoNewWindow -Wait
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
#@enum StartCmd:str "process launch" "process launch --stop-at-entry"
|
#@enum StartCmd:str "process launch" "process launch --stop-at-entry"
|
||||||
#@arg :file "Image" "The target binary executable image"
|
#@arg :file "Image" "The target binary executable image"
|
||||||
#@args "Arguments" "Command-line arguments to pass to the target"
|
#@args "Arguments" "Command-line arguments to pass to the target"
|
||||||
#@env OPT_HOST:str="localhost" "Host" "The hostname of the target"
|
#@env OPT_DEVICE:str="" "Device" "The device name (e.g. from 'adb devices')"
|
||||||
#@env OPT_PORT:str="9999" "Port" "The host's listening port"
|
#@env OPT_PORT:str="9999" "Port" "The host's listening port"
|
||||||
#@env OPT_ARCH:str="" "Architecture" "Target architecture override"
|
#@env OPT_ARCH:str="" "Architecture" "Target architecture override"
|
||||||
#@env OPT_LLDB_PATH:file="lldb" "lldb command" "The path to lldb on the local system. Omit the full path to resolve using the system PATH."
|
#@env OPT_LLDB_PATH:file="lldb" "lldb command" "The path to lldb on the local system. Omit the full path to resolve using the system PATH."
|
||||||
@@ -48,7 +48,7 @@ target_args="$@"
|
|||||||
|
|
||||||
function launch-lldb() {
|
function launch-lldb() {
|
||||||
local -a args
|
local -a args
|
||||||
compute-lldb-platform-args "$target_image" remote-android "connect://$OPT_HOST:$OPT_PORT" "$GHIDRA_TRACE_RMI_ADDR" "$@"
|
compute-lldb-platform-args "$target_image" remote-android "connect://$OPT_DEVICE:$OPT_PORT" "$GHIDRA_TRACE_RMI_ADDR" "$@"
|
||||||
|
|
||||||
"${args[@]}"
|
"${args[@]}"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,19 @@ function Add-Lldb-Image-And-Args {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Add-Lldb-Pid {
|
||||||
|
param([ref]$ArgList, $TargetPid)
|
||||||
|
|
||||||
|
if ("$TargetPid" -ne "") {
|
||||||
|
$ArgList.Value+=("-o", "`"process attach --pid '$TargetPid'`"")
|
||||||
|
}
|
||||||
|
if ("$TargetArgs" -ne "") {
|
||||||
|
$tgtargs = $TargetArgs -replace "`"", "\`""
|
||||||
|
# Escaping parentheses in the arguments is no longer necessary in powershell vs cmd
|
||||||
|
$ArgList.Value+=("-o", "`"settings set target.run-args $tgtargs`"")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function Add-Lldb-Connect-And-Sync {
|
function Add-Lldb-Connect-And-Sync {
|
||||||
param([ref]$ArgList, $Address)
|
param([ref]$ArgList, $Address)
|
||||||
|
|
||||||
@@ -60,6 +73,14 @@ function Add-Lldb-Start-If-Image {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Add-Lldb-Extra-Cmds {
|
||||||
|
param([ref]$ArgList)
|
||||||
|
|
||||||
|
if ("$Env:OPT_EXTRA_CMDS" -ne "") {
|
||||||
|
$ArgList.Value+=("-o", "`"$Env:OPT_EXTRA_CMDS`"")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function Add-Lldb-Tail-Args {
|
function Add-Lldb-Tail-Args {
|
||||||
param([ref]$ArgList)
|
param([ref]$ArgList)
|
||||||
# NOP
|
# NOP
|
||||||
@@ -93,12 +114,27 @@ function Compute-Lldb-Platform-Args {
|
|||||||
return $arglist
|
return $arglist
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Compute-Lldb-Platform-Args-Attach {
|
||||||
|
param($TargetPid, $TargetType, $TargetUrl, $RmiAddress)
|
||||||
|
|
||||||
|
$arglist = @("`"$Env:OPT_LLDB_PATH`"")
|
||||||
|
Add-Lldb-Init-Args -ArgList ([ref]$arglist)
|
||||||
|
$arglist+=("-o", "`"platform select '$TargetType'`"")
|
||||||
|
$arglist+=("-o", "`"platform connect '$TargetUrl'`"")
|
||||||
|
Add-Lldb-Pid -ArgList ([ref]$arglist) -TargetPid $TargetPid -TargetArgs $Env:OPT_TARGET_ARGS
|
||||||
|
Add-Lldb-Connect-And-Sync -ArgList ([ref]$arglist) -Address $RmiAddress
|
||||||
|
Add-Lldb-Extra-Cmds -ArgList ([ref]$arglist)
|
||||||
|
Add-Lldb-Tail-Args -ArgList ([ref]$arglist)
|
||||||
|
|
||||||
|
return $arglist
|
||||||
|
}
|
||||||
|
|
||||||
function Compute-Lldb-Remote-Args {
|
function Compute-Lldb-Remote-Args {
|
||||||
param($TargetImage, $TargetCx, $RmiAddress)
|
param($TargetImage, $TargetCx, $RmiAddress)
|
||||||
|
|
||||||
$arglist = @("`"$Env:OPT_LLDB_PATH`"")
|
$arglist = @("`"$Env:OPT_LLDB_PATH`"")
|
||||||
Add-Lldb-Init-Args -ArgList ([ref]$arglist)
|
Add-Lldb-Init-Args -ArgList ([ref]$arglist)
|
||||||
Add-Lldb-Image-And-Args -ArgList ([ref]$arglist) -TargetImge $TargetImage -TargetArgs ""
|
Add-Lldb-Image-And-Args -ArgList ([ref]$arglist) -TargetImage $TargetImage -TargetArgs ""
|
||||||
$arglist+=("-o", "`"$TargetCx`"")
|
$arglist+=("-o", "`"$TargetCx`"")
|
||||||
Add-Lldb-Connect-And-Sync -ArgList ([ref]$arglist) -Address $RmiAddress
|
Add-Lldb-Connect-And-Sync -ArgList ([ref]$arglist) -Address $RmiAddress
|
||||||
$arglist+=("-o", "`"ghidra trace sync-synth-stopped`"")
|
$arglist+=("-o", "`"ghidra trace sync-synth-stopped`"")
|
||||||
@@ -107,6 +143,21 @@ function Compute-Lldb-Remote-Args {
|
|||||||
return $arglist
|
return $arglist
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Compute-Lldb-Remote-Args-Attach {
|
||||||
|
param($TargetPid, $TargetCx, $RmiAddress)
|
||||||
|
|
||||||
|
$arglist = @("`"$Env:OPT_LLDB_PATH`"")
|
||||||
|
Add-Lldb-Init-Args -ArgList ([ref]$arglist)
|
||||||
|
Add-Lldb-Pid -ArgList ([ref]$arglist) -TargetPid $TargetPid
|
||||||
|
$arglist+=("-o", "`"$TargetCx`"")
|
||||||
|
Add-Lldb-Connect-And-Sync -ArgList ([ref]$arglist) -Address $RmiAddress
|
||||||
|
$arglist+=("-o", "`"ghidra trace sync-synth-stopped`"")
|
||||||
|
Add-Lldb-Extra-Cmds -ArgList ([ref]$arglist)
|
||||||
|
Add-Lldb-Tail-Args -ArgList ([ref]$arglist)
|
||||||
|
|
||||||
|
return $arglist
|
||||||
|
}
|
||||||
|
|
||||||
function Compute-Lldb-PipInstall-Args {
|
function Compute-Lldb-PipInstall-Args {
|
||||||
$argvpart = $args -join ", "
|
$argvpart = $args -join ", "
|
||||||
$arglist = @("`"$Env:OPT_LLDB_PATH`"")
|
$arglist = @("`"$Env:OPT_LLDB_PATH`"")
|
||||||
|
|||||||
@@ -43,6 +43,15 @@ add-lldb-image-and-args() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
add-lldb-pid() {
|
||||||
|
target_pid=$1
|
||||||
|
shift
|
||||||
|
|
||||||
|
if [ -n "$target_pid" ]; then
|
||||||
|
args+=(-o "process attach --pid '$target_pid'")
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
add-lldb-io-tty() {
|
add-lldb-io-tty() {
|
||||||
if [ -n "$TTY_TARGET" ]; then
|
if [ -n "$TTY_TARGET" ]; then
|
||||||
args+=(-o "settings set target.output-path '$TTY_TARGET'")
|
args+=(-o "settings set target.output-path '$TTY_TARGET'")
|
||||||
@@ -66,6 +75,12 @@ add-lldb-start-if-image() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
add-lldb-extra-cmds() {
|
||||||
|
if [ -n "$OPT_EXTRA_CMDS" ]; then
|
||||||
|
args+=(-o "$OPT_EXTRA_CMDS")
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
add-lldb-tail-args() {
|
add-lldb-tail-args() {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
@@ -105,6 +120,26 @@ compute-lldb-platform-args() {
|
|||||||
add-lldb-tail-args
|
add-lldb-tail-args
|
||||||
}
|
}
|
||||||
|
|
||||||
|
compute-lldb-platform-args-attach() {
|
||||||
|
target_pid=$1
|
||||||
|
target_type=$2
|
||||||
|
target_url=$3
|
||||||
|
rmi_address=$4
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
|
||||||
|
args+=("$OPT_LLDB_PATH")
|
||||||
|
add-lldb-init-args
|
||||||
|
args+=(-o "platform select '$target_type'")
|
||||||
|
args+=(-o "platform connect '$target_url'")
|
||||||
|
add-lldb-pid "$target_pid"
|
||||||
|
add-lldb-connect-and-sync "$rmi_address"
|
||||||
|
add-lldb-extra-cmds
|
||||||
|
add-lldb-tail-args
|
||||||
|
}
|
||||||
|
|
||||||
compute-lldb-remote-args() {
|
compute-lldb-remote-args() {
|
||||||
target_image=$1
|
target_image=$1
|
||||||
target_cx=$2
|
target_cx=$2
|
||||||
@@ -119,6 +154,21 @@ compute-lldb-remote-args() {
|
|||||||
add-lldb-tail-args
|
add-lldb-tail-args
|
||||||
}
|
}
|
||||||
|
|
||||||
|
compute-lldb-remote-args-attach() {
|
||||||
|
target_pid=$1
|
||||||
|
target_cx=$2
|
||||||
|
rmi_address=$3
|
||||||
|
|
||||||
|
args+=("$OPT_LLDB_PATH")
|
||||||
|
add-lldb-init-args
|
||||||
|
add-lldb-pid "$target_pid" ""
|
||||||
|
args+=(-o "$target_cx")
|
||||||
|
add-lldb-connect-and-sync "$rmi_address"
|
||||||
|
args+=(-o "ghidra trace sync-synth-stopped")
|
||||||
|
add-lldb-extra-cmds
|
||||||
|
add-lldb-tail-args
|
||||||
|
}
|
||||||
|
|
||||||
compute-lldb-pipinstall-args() {
|
compute-lldb-pipinstall-args() {
|
||||||
local argvpart
|
local argvpart
|
||||||
printf -v argvpart ", %s" "$@"
|
printf -v argvpart ", %s" "$@"
|
||||||
|
|||||||
@@ -206,8 +206,8 @@ perl -i -pe 's/(?<=pendingNMI\x00{4})\x00/\x01/' macOS_15-1234567.vmss
|
|||||||
<H2><A name="android"></A>Android</H2>
|
<H2><A name="android"></A>Android</H2>
|
||||||
|
|
||||||
<P>This has the same options as the <A href="#ssh">LLDB via SSH</A> launcher, which are
|
<P>This has the same options as the <A href="#ssh">LLDB via SSH</A> launcher, which are
|
||||||
necessary for connecting to the Android debugger, but executes via the normal lldb
|
necessary for connecting to the Android debugger, but uses <B>Device</B> in place of <B>Host</B>
|
||||||
mechanism.</P>
|
(typically retrieved using 'adb devices').</P>
|
||||||
|
|
||||||
<H3><A name="setup_ndk"></A>Setup for Android NDK</H3>
|
<H3><A name="setup_ndk"></A>Setup for Android NDK</H3>
|
||||||
|
|
||||||
@@ -266,5 +266,13 @@ PS> C:\path\to\android-ndk\...\python -m pip install ...
|
|||||||
...</TT>.
|
...</TT>.
|
||||||
</LI>
|
</LI>
|
||||||
</OL>
|
</OL>
|
||||||
|
|
||||||
|
<H2><A name="android-attach"></A>Android (Attach)</H2>
|
||||||
|
|
||||||
|
<P>This has the same options as the <A href="#android">Andoid</A> launcher, but uses the
|
||||||
|
target's <B>Process Id</B> instead of the executable <B>Image</B>. <B>Additional commands</B> has been added
|
||||||
|
to allow commands like 'process handle --pass true --stop false --notify false SIGSEGV'
|
||||||
|
to be saved and executed for each run.</P>
|
||||||
|
|
||||||
</BODY>
|
</BODY>
|
||||||
</HTML>
|
</HTML>
|
||||||
|
|||||||
Reference in New Issue
Block a user