0x01 必备技能
- Apktool 的使用
- Smali 简单语法
0x02 前期准备
-
Android Studio (我的是 Android Studio 3.4)
-
smalidea-xxx.zip 插件(我的是 smalidea-0.05.zip)
-
Android Studio -> Preferences… -> Plugins -> 点击设置按钮,选择 Install Plugin from Disk… -> 选择下载好的 zip 文件,应用并重启 Android Studio
-
-
Apktool (我的是 2.3.0)
-
最好是一部 root 过的手机(下面会解释)
0x03 开始调试
-
使应用变的可调试
- 我们知道,当我们正向开发和调试的时候会在自己的设备上运行 debug 版本的安装包,而正式发版的时候是 release 版的安装包。一般而言,debug 版本的安装包是可以调试的,而 release 版本的安装包是无法调试的,区别在于打包出的安装包的
AndroidManifest.xml
文件的application
节点下是否有android:debuggable="true"
这个属性。所以我们想要无源码调试 release 应用(一般是别人的应用)的时候,第一步需要做的就是反编译别人的应用,添加或修改这个 debuggable 属性,然后打包、重新签名、安装。 - 但是,上述方法有个弊端,就是我们修改并重新签名后的应用较原应用签名发生了变化(因为我们重新签名时使用的是自己的签名),如果原应用在 Java 代码或者打包的 so 类库里校验了应用的签名,我们修改完的应用安装后很可能无法正常使用,更别提调试了。所以,为了方便,我们还是找个已经 root 过的手机,直接安装原应用就可以调试(我用的 root 过的小米 4 手机上所有非系统应用都是可调试的)。
- 我们知道,当我们正向开发和调试的时候会在自己的设备上运行 debug 版本的安装包,而正式发版的时候是 release 版的安装包。一般而言,debug 版本的安装包是可以调试的,而 release 版本的安装包是无法调试的,区别在于打包出的安装包的
-
反编译目标应用
- 使用
apktool d xxx.apk
反编译并生成 Smali 源码到当前目录。
- 使用
-
Andorid Studio 导入源码并配置
-
进入 Android Studio 后,通过 File -> Open… 选择上面生成的源码目录,并切换到 Project 视图
上面的步骤也可以直接使用 Android Studio 开始页面的 Profile or debug APK 并选择对应 apk 进入
-
右键工程主目录,选择 Mark Directory As -> Sources Root
-
右键工程主目录,选择 Open Module Settings,设置 Project SDK 和测试手机的系统版本保持一致
-
添加 Configurations,选择 Add Configuration… -> + ->Remote -> 指定端口
注意:上面的 Name 可以随便写,只要你能清除这个对应的是一会儿你要调试某应用的某个进程就可以。Port 也可以用默认的,只要当前电脑该端口没有被占用就好。
-
-
建立端口映射并开始调试
-
运行要调试的应用,并打开 Android Studio 的 Terminal (或者电脑自带的命令行工具),运行
adb shell ps | grep com.jerry.live.tv
拿到要调试进程的 id,然后运行adb forward tcp:5005 jdwp:xxxx
进行端口映射转发 -
找到源代码里要调试的地方,打上断点,并点击 Debug 按钮,操作应用到断点处并开始调试
这里需要注意,如果弹出了下面的提示,则说明可能电脑上的端口被占用或者手机上对应应用进程的 id 发生了变化,需要重新进行上一步,重新建立电脑端口和应用进程 id 的映射关系
-
参考链接