动态调试能干什么?对于静态分析不容易理解的地方,就是动态调试的用武之地!
动态调试可以跟踪程序的运行流程,从而理解竞品的业务逻辑等。
操作步骤
- 注意不能用Android P
- 用android killer修改后的apk安装到手机(要有
android:debuggable="true"
) - 以调试模式启动
adb shell am start -D -n com.example.myapplication/com.example.myapplication.MainActivity
,app会处于等待调试的状态中。 adb shell ps | findstr com.example.myapplication
查看pidu0_a78 3813 1399 1375708 30176 futex_wait 00000000 S com.example.myapplication
adb forward tcp:8700 jdwp:3813
建立端口转发- 用android studio 3.x: File-> open反编译的smali文件夹
AndroidKiller_v1.3.1\projects\app-debug\Project
。这一步也可以直接android studio 3.x:File-> Profile or debug APK
- 用 Project 视图,在项目目录右键 --> Mark Directory as ... --> Sources root
- android studio 3.x:Run -> Edit Configuration -> Remote -> 8700
- debug app
懒人脚本 (更多脚本请移步https://github.com/andych008/cmd)
adbbind.bat com.example.myapplication
一句,完成进程号查找和端口转发。
用到了busybox,确认你手机里有。
@echo off
adb forward --remove tcp:8700
for /F %%i in ('adb shell busybox pidof %1') do ( set pid=%%i)
echo pid=%pid%
adb forward tcp:8700 jdwp:%pid%
netstat -nao | findstr "8700"
扩展阅读
-
error: cannot bind listener: cannot bind to 127.0.0.1:8700:
出现这个错误说明8700端口被占用。通常每个套接字地址(协议/网络地址/端口)只允许使用一次。解决办法
netstat -nao | findstr "8700"
根据PID找到该进程,结束进程 打开任务管理器—>查看—>选项列(S)—>勾选 PID,确定—>进程按钮栏