使用脚本来简化ida附加app的操作
本帖最后由 Slimu 于 2023-12-3 20:10 编辑>
# 自动化脚本
``` zsh
#!/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** 来看看呢。。 感谢楼主分享 有windows的吗 感谢分享 呵呵,正在学习中 感谢楼主分享 感谢分享!学习一下~~ 牛,学习了