关于adb参与android调试的理解

adb server,adb client与adbd

  • adb client是运行在PC端的一个进程,一般我们在命令行使用adb shell时就会创建此进程。它会连接adb server进程监听的5037端口,然后发送用户输入的命令。
  • adb server是运行在PC端的一个后台进程,通过USB/TCP与android端的adbd交互。adb server进程只能存在一个,如果在命令行执行adb shell时adb server进程还未创建就会主动创建一个。此进程会监听5037端口等待adb client的连接,也可以通过此端口等待DDMS的连接,所以DDMS也相当于adb client。需要注意的是一般情况下只能存在一个adb client,如果存在多个adb client就会因为端口占用导致除了最开始启动的adb client进程外的adb client无法与adb server进行通讯。
  • adbd是android端的一个守护进程,从开机开始就一直存在。他通过监听5555端口来等待adb server的连接。

jdb调试apk文件

  • 执行am start -D -n com.example.name/.MainActivity调试模式启动apk
  • 执行adb forward tcp:port jdwp:PID 让adb.exe(server)进程进行转发,PID为需要调试进程的PID。执行这条命令之后adb.exe(server)进程会监听port端口等待调试器连接,同时通知到adbd进程待调试进程PID,adbd进而与app进程的vm建立通讯。
  • 执行jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=xxx使jdb调试器连接到adb.exe(server)监听的那个端口并与它进行通讯, 这样jdb就通过adb.exe(server)和adbd与app进程的vm建立了通讯。

还有一种方式是通过DDMS进程。

  • 执行am start -D -n com.example.name/.MainActivity调试模式启动apk
  • 启动ddms
  • 执行jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700,使jdb调试器连接到ddms(ddms默认进行监听8700端口)。ddms会连接到adb.exe(server)的5037端口。

IDA调试APK的so文件

  • 执行am start -D -n com.example.name/.MainActivity调试模式启动apk
  • 启动android_server64,其会在移动端监听默认的23946端口,并与被调试进程交互
  • 执行adb forward tcp:23946 tcp:23946进程端口转发,这样adb.exe(server)会监听23946端口等待IDA的连接,同时会连接移动端android_server64的23946端口
  • IDA附加到进程,F9运行。IDA通过adb.exe与android_server64通讯并进一步与被调试进程交互。

我们发现在F9执行后程序是无法运行的,这是因为android_server64只是控制进程让进程运行起来,但是因为我们是以调试模式启动的apk所以其进程的虚拟机模块还没有运行(还在等待中)。
DDMS在与adb.exe(server)通讯时每当有一个vm进程启动都会通知到ddms,ddms会为其分配一个端口(从8600开始)并进行监听,等待调试器jdb连接。我们通过执行jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=86xxport为ddms为对应进程分配的监听端口,然后就会通知到对应调试进程的vm继续执行(阻塞结束)。

通过上面的研究,我们可以利用jdb调试apk的方法,在IDAF9运行时主要是因为被调试APP进程的vm还在阻塞等待中,只要通知让其运行就ok了,我们也可以不利用DDMS为app进程分配的监听端口号,直接利用app进程的pid执行adb forward tcp:port jdwp:PID,然后在执行jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=xxx通知到被调试app进程的vm继续执行即可。

获取到调试进程pid=7985(通过adb jdwp可以获取到最新启动可调试进程pid),随便找一个没有使用过的端口号比如23947进行端口转发adb forward tcp:23947 jdwp:7985

查看顶层activity的方法

运行命令 adb shell "dumpsys activity top | grep ACTIVITY"

tips:进行调试的时候最好保证只有一个adb client实例运行,其他可能会运行adb client实例的软件都不要运行(ddms,androidstudio, 一些android投屏软件等),因为多个adb client 与adb server进程连接可能会造成端口占用。
以上为个人研究观点,如果错误还请指出。

posted @ 2022-04-21 20:32  怎么可以吃突突  阅读(607)  评论(0编辑  收藏  举报