0. 目标
反编译后对 Smali 源码执行打点调试。
1. 实现流程
1.1 重新打包可调试的 APK
- 使用 Apktool 反编译,得到源码文件夹;
apktool d decompilerdemo.apk
反编译后的文件夹
-
找到文件夹下的 AndroidManifest.xml,设置 debuggable = true;
修改 AndroidManifest -
使用 Apktool 重新打包成 Apk,签名并安装。
// 重新打包成 Apk
apktool b decompilerdemo -o decompilerdemo_unsigned.apk
// 签名
/Users/你的文件夹名/Library/Android/sdk/build-tools/版本号/apksigner sign -verbose --ks 你的签名文件.jks --v1-signing-enabled true --v2-signing-enabled true --ks-pass pass:签名密码 --ks-key-alias key0 --out decompilerdemo_new.apk decompilerdemo_unsigned.apk
新的 Apk
1.2 配置 JDB 调试器
- 下载 IntelliJ IDEA;
新版 Android Studio 不支持 JDB 调试器。
- 从 该网址 下载 smalidea-0.05.zip;
- IntelliJ IDEA 选择 Settings -> Plugins,点击设置按钮 -> Install Plugin from Disk,选择上一步的 zip 进行安装,安装完毕后重启;
1.3 使用 JDB 进行动态调试
- 将要调试的应用(例子中为 decompilerdemo_new.apk)使用 Apktool 反编译,得到源码文件夹;
apktool d decompilerdemo_new.apk
反编译后的文件夹
- 使用 IntelliJ IDEA 打开该文件夹,打开后,右击 Smali 目录,选择 Mark Directory as -> Resources Root,将 Smali 目录标记为资源根目录。
- 配置调试 Configuration。点击 Edit Configurations 打开 Run/Debug Configurations 选项卡,点击 + 号新建一个 Remote JVM Debug。名字可自定,其它配置保留默认亦可,点击 Apply 保存配置。
- 使用 ADB 链接设备并以调试模式启动 Apk,并转发至配置端口 5005。
// 1. 调试模式启动 Apk
adb shell am start -D -n "com.dixon.app.decompilerdemo/com.dixon.app.decompilerdemo.MainActivity"
// 2. 获取进程 PID
adb shell "ps -ef | grep com.dixon.app.decompilerdemo"
// 例如结果为:
// u0_a139 8237 843 1 15:27:55 ? 00:00:00 com.dixon.app.decompilerdemo
// 则 8237 为我们所需的端口号
// 3. 转发至配置端口
adb forward tcp:5005 jdwp:第二步获取的端口号
-
设置断点,点击调试按钮开始动态调试。
打点
2. 总结
动态调试支持反编译后打点,可以进一步帮助我们分析逻辑走向,但是需要对 Smali 文件有一定的阅读能力。
网友评论