前备条件
- AS &安装smalidea插件
- device monitor(DDMS)-位于SDK/tool
- android真机/模拟器
步骤
- 拆包apk在AndroidMainfest.xml中添加debuggable=“true”,打包签名。
将反编译后的文件夹导入Android Studio,import Project。可以右键smali文件夹Mark Direcotry as->Generated S R即将smali目录设置为源码根目录(导入前重命名为src)。 - 首先运行device moniter与android(测试海马模拟器可行),当dm无法找到android时使用adb connect连接。
输入:adb connect 127.0.0.1:26944。如下:
海马玩模拟器的端口号是26944。
逍遥安卓模拟器的端口号是21503。
夜神玩模拟器的端口号是62001。
当dm可显示android进程时即可 - 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调试端口 - 在AS中打开Edit Configuration,添加remote类型的调试,port为8700
- 此时随意在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进程