动态调试无源码的apk
概览:使用smalidea插件,通过jdwp,用AndroidStudio动态调试smali。
一、所需技能
1、使用AndroidStudio的debug的功能
2、理解smali语法
3、使用apktool反编译apk,并且重新打包
二、方法
1、安装AndroidStudio和smalidea插件
(1)AndroidStudio下载地址:https://developer.android.com/studio/
(2)smalidea插件下载地址:https://bitbucket.org/JesusFreke/smalidea/downloads/smalidea-0.06.zip
插件安装:smalidea-0.06.zip下载完成后,打开AndroidStudio选择
Android Studio -> Preferences -> Plugins -> Install plugin from disk -> 选择 smalidea-0.06.zip 插件 -> 重启,插件就安装好了。
2、使app可调试
(1)假设要调试的apk文件名为androidapp.apk,用apktool d androidapp.apk
反编译
(3)在生成的androidapp目录中找到AndroidManifest.xml
(4)用文本编辑器打开并修改里面的<application>
标签,如果有debuggable
属性,修改为true
,如果没有,给<application>
标签添加android:debuggable="true"
(5)运行apktool b androidapp
,这时候会在./androidapp/dist目录下生成重新打包好的apk。
(6)给这个apk签名。
(7)把这个自签名后的apk安装到安卓模拟器。
3、在AndroidStudio中导入smail源码
(1)打开AndroidStudio后,通过File->Open…选择刚才反编译出来的那个目录“androidapp”,然后等待AndroidStudio建立完索引。
(2)左侧选择Project视图
(3)右键工程主目录:Mark Directory As -> Sources Root
(4)设置sdk,尽量和模拟器的系统版本一致:项目目录->右键->Open ModuleSettings:
4、Android Studio的配置
(1)Run -> Edit Configurations…
(2)点击上面的+符号,然后选择Remote JVM Debug,添加一个远程调试
(3)配置远程调试的端口和一些其他信息
5、打通AndroidStudio和可调试apk之间的通道
(1)在安卓模拟器中运行刚才重新打包并安装好的apk
(2)判断你要debug的那个页面(Activity)在哪个进程里面(信息里面包含了apk的包名):adb shell dumpsys activity | grep mFocusedActivity
(3)命令行运行adb shell ps | grep apk的包名
,左边第二列的数字就是apk运行的PID
(4)端口映射:adb forward tcp:5005 jdwp:apk运行的PID
(5)下断点:在刚才找到的Activity页面中的相关代码设置断点
(6)启动debug:点击Attach Debugger to Android Process按钮
(7)选中主进程,然后点击OK按钮
(8)操作apk,使其触发下过断点的代码,AndroidStudio会在相应的代码位置暂停,并显示堆栈和变量等信息