自动化脚本

#!/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

扫码免费获取资源: