Android逆向 动态调试smali

动态调试smali应该是每个Android****师的基本功,其原理其实就是改包为debuggable,再用debuggable启动应用,基于JDWP协议端口转发调试应用,JDB Client(被调试程序)在被调试时会启动jdwp线程通过JDWP协议与JDB Server(调试端)进行通信,JDWP协议用于传输调试的行号及局部变量等信息。

1.改包

1.1利用apktool解包apk

Android逆向 动态调试smali
调用apktool d 包名
解包获得android 源码

1.2修改AndroidManifest.xml

添加debuggable为true,使应用可调式
Android逆向 动态调试smali

1.3修改入口activity smali代码(可选)

在入口activity 的onCreate 函数里添加
invoke-static {}, Landroid/os/Debug;->waitForDebugger()V
这行代码表示等待调试,也可以不加,后面用命令
adb shell am start -D -n 包名/入口acitivity
启动应用也可以使应用进入调试模式
Android逆向 动态调试smali

1.4签名应用

https://blog.****.net/qq951127336/article/details/88524377

1.5打开DDMS ,且安装运行应用

DDMS的位置在SDK目录下的tool目录
Android逆向 动态调试smali
Android逆向 动态调试smali
打开DDMS ,打开要调试的应用,可以看到下图被调试的应用有红色昆虫标志,表示debuggable状态
Android逆向 动态调试smali

2.配置smali代码

2.1导入smali代码

修改smali目录名为src目录名

2.2Android studio打开解包目录(即src的父目录)

2.3设置src目录为root目录

右键src目录,进入Mark Directory as选项,右边有set as Root
Android逆向 动态调试smali

2.4配置调试configure

点击run ,然后点Edit Configuration
Android逆向 动态调试smali
配置端口号为DDMS 的端口,module为当前目录
(调试模式Attach和listen的区别,Attach是调试服务端(被调试程序运行的机器)启动一个端口等待我们(调试客户端)去连接,Listen是我们(调试客户端)监听一个端口,一般选择attach)
Android逆向 动态调试smali

3.断点调试

3.1 添加断点

Android逆向 动态调试smali

3.2 点击调试按钮

Android逆向 动态调试smali
可以看到DDMS的小昆虫变绿,调试成功
Android逆向 动态调试smali