调试线上apk作为一个比较简单、有效的逆向手段,能够简单粗暴对smali文件打断点,从而猜测开发者的意图,了解app内部的逻辑。
本次只对java代码做一个调试,对于C/C++编写的native代码编译的so文件,下篇分析。为了能够方便的调试,本次使用的手机是debug版本的Android rom。
反编译
本次以微信的最新版本6.7.3版本为例,使用apktool工具反编译获取获取smali文件。
➜ ~ apktool d /Users/cmm/com.tencent.mm.apk
I: Using Apktool 2.3.3 on com.tencent.mm.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /Users/cmm/Library/apktool/framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
S: Could not decode file, replacing by FALSE value: layout-v14/chatting_item_to_shortvideo.xml
S: Could not decode file, replacing by FALSE value: drawable-xxhdpi-v4/reader_news_fontfour.png
S: Could not decode file, replacing by FALSE value: layout/ipcall_share_dialog_ui.xml
复制代码
加载smali文件
- 新建一个项目,复制smali文件到src目录下。
- 安装android studio的smali插件(github.com/JesusFreke/…)
- 开始调试,启动微信
bash adb shell am start -D -n "com.tencent.mm/com.tencent.mm.ui.LauncherUI"
小试牛刀
先看下拿到了这个源代码能够干啥。
调试逻辑
就看下微信登录的流程,学习下。先看下当前的登录的activity是哪个:
➜ ~ activity
mCurrentFocus=Window{eba6f62 u0 com.tencent.mm/com.tencent.mm.plugin.account.ui.MobileInputUI}
mFocusedApp=AppWindowToken{10c4e57 token=Token{11b6bd6 ActivityRecord{9eca3f1 u0 com.tencent.mm/.plugin.account.ui.MobileInputUI t1799}}}
➜ ~
复制代码
搜索result_data
关键字,能够看到所有的rpc请求返回。
结尾
本文的方法无法对加了壳的apk调试。由于加壳会导致性能问题、crash问题等,目前很多大厂的apk没有加壳。