android动态调试-java层

前备条件

  1. AS &安装smalidea插件
  2. device monitor(DDMS)-位于SDK/tool
  3. android真机/模拟器

步骤

  1. 拆包apk在AndroidMainfest.xml中添加debuggable=“true”,打包签名。
    将反编译后的文件夹导入Android Studio,import Project。可以右键smali文件夹Mark Direcotry as->Generated S R即将smali目录设置为源码根目录(导入前重命名为src)。
  2. 首先运行device moniter与android(测试海马模拟器可行),当dm无法找到android时使用adb connect连接。
    输入:adb connect 127.0.0.1:26944。如下:
    海马玩模拟器的端口号是26944。
    逍遥安卓模拟器的端口号是21503。
    夜神玩模拟器的端口号是62001。
    当dm可显示android进程时即可
  3. android中安装需要调试的apk,
    adb shell am start -D -n packageName/ActivityName来开启程序进入等待调试状态后面俩个name在AndroidManifest.xml下找,如:
    adb shell am start -D -n com.example.imbaya.crackme01/com.example.imbaya.crackme01.MainActivity
    这样就可以让android中该应用处于调试状态
    在dm中找到选中进程就会开启8700调试端口
  4. 在AS中打开Edit Configuration,添加remote类型的调试,port为8700
  5. 此时随意在smali中添加断点然后开启debug即可进入调试

原理

因为安卓的应用程序都是Zygote fork自己来快速启动进程进而快速启动程序的,因此不能直接以调试方式打开app,只能先启动app,再依靠android上的虚拟机与gdb调试,将调试信息通过adb发给主机

关于端口转发:
adb forward 本机: 设备:
本机的端口转发到设备的端口上

当一个设备链接上时,DDSM和ADB之间又会建立VM monitoring service用于监控设备上的虚拟机。 对于设备上每个虚拟机的进程, DDMS都会在主机开启一个监听端口。端口从8600开始。将设备中的调试信息通过adb取出转发到主机上的监听端口中。其中选中的额外开一个8700
等价于
adb forward tcp:8700 jdwp:PID(目标应用的进程号)转发pc端口到android指定调试进程

android进程->adb映射到主机端口并转化调试协议JDWP->AS连接pc的端口从而调试android进程