逆向方式有多种:静态、动态, 工具也很多:JEB、IDA、IDEA/AndroidStudio,调试内容:Smali、So库。
本文介绍IDEA动态调试Smali方式。
获取Smali文件
用Apktool反编译获取Smali文件,也可使用集成工具AndroidKiller反编译apk。
- Apktool 在jar和apk所在目录使用命令行
apktool d ***.apk -o Project
,即反编译到Project目录。 - AndroidKiller 直接将apk拖进主界面即可,反编译后结构:
生成可调式APK
- 在
AndroidManifest.xml
中添加android:debuggable="true"
- 在入口Activity的onCreate方法开始处添加
android.os.Debug.waitForDebugger()
,
对应的smali代码为:invoke-static {}, Landroid/os/Debug;->waitForDebugger()V
。
- 重新打包。
- Apktool:
b -d Project -o debug.apk
- AndroidKiller: 菜单栏 Android -> 编译
- 安装生成apk。
IDEA 导入Project
- 导入反编译项目:Import Project,选择Project目录后将反编译文件导入到IDEA。
-
在目标Smali文件打上断点。
IDEA的smalidea插件用0.0.3断点进不去,升级至0.0.5后调试成功。
smalidea下载地址
调试环境配置
- 运行程序,手机会显示白屏或等待调试界面。
-
打开DDMS,目录\sdk\tools下运行monitor.bat,DDMS出现程序待调试状态。
** 红色Debug表示此进程正等待调试,15745为pid/进程ID,8600为此进程的远程机器调试端口号,8700为通用备用端口号**。
- 配置远程调试选项,
点击菜单栏** Run ,选择 Edit Configurations ,点击 ** + ** 选择 Remote **。
** 配置远程调试选项 **
Host:localhost
Port:8600
调试模式:Attach
项目:<whole project> 或 Project
远程调试
点击Debug开始远程调试。
开始调试后,DDMS中Debug标志变成绿色,表示已经成功连接远程调试服务端。
Console中也有成功连接输入Connected to the target VM, address: 'localhost:8600', transport: 'socket'
然后触发断点条件后,就会进入断点。
剩下的就跟平时开发断点调试一样。
相关推荐:
JEB动态调试apk
AndroidStudio 动态调试Smali代码
参考: