自动化脚本
#!/bin/zsh
# 启动AndroidServer
function startAndroidServer() {
local port=$1
echo "启动 AndroidServer, 端口: $port"
adb shell /data/local/tmp/android_server64 -p$port &
}
# 启动Jdb
function startJdb() {
local port=$1
echo "启动Jdb, 端口: $port"
#jdb -connect com.sun.jdi.SocketAttach:127.0.0.1,port=$port
#不要使用上面的命令, 会出现错误: java.lang.IllegalArgumentException: 非法连接器参数: 127.0.0.1,port
#卡我半天, 我还以为是版本的问题
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=$port
}
# 转发IDA端口
function forwardIDAPort() {
local port=$1
echo "转发 IDA 端口, 端口: $port"
adb forward tcp:$port tcp:$port &
}
# 转发Jdb端口
function forwardJdbPort() {
local port=$1
local pid=$2
echo "转发 Jdb 端口, 端口: $port, PID: $pid"
adb forward tcp:$port jdwp:$pid &
}
# 一键启动IDA调试
function idaAttach() {
# 判断是否传入包名
if [ -z "$1" ]; then
echo "请提供目标应用的包名"
return 1
fi
# 目标应用包名
local package_name=$1
# 目标应用pid
local pid=$(adb shell pidof -s "$package_name")
# ida端口
local idaPort=2345
# Jdb端口
local jdbPort=6789
# 使用"&"使任务在后台运行
# 启动AndroidServer, 默认x64
startAndroidServer $idaPort
# 等待一会确保 AndroidServer 已经启动
sleep 2
# ida端口转发
forwardIDAPort $idaPort
# 延时一会等待IDA附加
echo "等待IDA附加"
sleep 30
# 需要注意的是, 只有当点击IDA的运行的时候才会运行jdb
# jdb端口转发
forwardJdbPort $jdbPort $pid
# 启动jdb
startJdb $jdbPort
}
使用方法
将上面的内容放置到~/.zshrc
中即可
执行命令:idaAttach 包名
当出现等待IDA附加的时候可以打开IDA选择目标应用了
需要注意的是, 只有当点击IDA的运行的时候才会运行jdb
错误修复1
执行命令:jdb -connect com.sun.jdi.SocketAttach:127.0.0.1,port=1234
提示错误:
内部异常错误:
java.lang.IllegalArgumentException: 非法连接器参数: 127.0.0.1,port=1234,
at com.sun.tools.example.debug.tty.VMConnection.parseConnectorArgs(VMConnection.java:107)
at com.sun.tools.example.debug.tty.VMConnection.<init>(VMConnection.java:320)
at com.sun.tools.example.debug.tty.Env.init(Env.java:61)
at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1083)
这是因为少了hostname=
,网上的大部分文章都少了这个,导致我一直卡在这里
解决办法:jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=$port
错误修复2
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210<span><span>)
at java.net.SocketInputStream.read(SocketInputStream.java:141<span>)
at com.sun.tools.jdi.SocketTransportService.handshake(SocketTransportService.java:130<span>)
at com.sun.tools.jdi.SocketTransportService.attach(SocketTransportService.java:232<span>)
at com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:116<span>)
at com.sun.tools.jdi.SocketAttachingConnector.attach(SocketAttachingConnector.java:90<span>)
at com.sun.tools.example.debug.tty.VMConnection.attachTarget(VMConnection.java:519<span>)
at com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:328<span>)
at com.sun.tools.example.debug.tty.Env.init(Env.java:63<span>)
at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1082)
这是AndroidStudio占用了jdb,解决办法:关闭Android Studio