1 工具和环境
1、Android studio 用于集成idea插件和导入smali源码
2、idea插件
3、首先得有一部已经 root 的手机
首先第三个条件如果没有那没办法了
要return了
插件下载 https://link.jianshu.com/?t=https://bitbucket.org/JesusFreke/smali/downloads/
或者在studio中搜索Smalidea进行插件下载(要翻墙)
在Android studio中通过idea插件来调试smali和在idea中调试很类似,下面就来讲解调试的步骤。
2 smali反编译和导入
调试的步骤大概如下:
通过apktool工具反编译目标Apk获取smali文件,修改xml中android:debuggable="true"。
导入smali文件至Android studio
在相应位置打好断点后,启动调试进程。
开始Apk动态调试调试吧!
2.1 获取smali文件
通过apktool获取反编译之后的smali文件非常简单。
apktool d *.apk
通过上面的apktool命令获取反编译的smali文件。
根目录demo-release默认为apk的名字,也可以通过-o指定路径名。如果遇到某些apk(如支付宝、微信等)采取了防止apktool破解的策略,我们也可以通过修改apktool码来修复漏洞(因为是开源代码),但是这不是本文的重点。
2.2 打开smali文件夹
通过Android studio 提供的Open an existing Android Studio project功能来打开文件夹。注意:smali作为根目录导入。
导入后,工程目录如下:
我们可以在as中查看和修改smali代码。
2.3 调试smali
下面的调试方法可以在进程起来就能附加调试进程。
2.3.1 配置Android Studio调试环境
成功导入smali文件夹后配置远程调试的选项。选择 Run -->Edit Configurations,增加一个Remote调试的调试选项,端口选择:8700(未占用端口均可)。
2.3.2 进入等待调试
在需要的地方打好断点,通过一下命令行启动进程调试等待模式:
命令行启动调试模式,
adb shell am start -D -n packagename/ MainActivity
packagename为进程名,MainActivity为首页Activity
启动调试app,通过
adb shell dumpsys "activity top | grep --color=always ACTIVITY"
在终端获取包名和页面信息。
执行
adb shell ps | grep packagename
获取进程pid
执行
adb forward tcp:8700 jdwp:pid
建立端口转发
也可以通过shell脚本,直接进入等待调试:
#!/bin/sh
if [[ $# == 0 ]]; then
echo "./debugTool [package] [activity] "
exit 1
fi
package=$1
activity=$2
adb shell am start -D -n ${package}/${activity}
varId=`adb shell ps | grep package| awk '{print $2}'`
adb forward tcp:8700 jdwp:$varId
进入等待调试后,在Android studio中执行Run -> Debug启动刚才创建的远程调试器,进入动态调试了。通过断点可以查看内存的信息。
如下,查看smali中寄存器v3的对象:
--------------------更新 Android Studio 4.0之后 --------------------------------------------------
更新 Android Studio 4.0之后, debug 可以直接使用
去 attach 调试目标的进程,能够直接调试 smali 代码,以前还要看要调试的进程pid还要转发接口,现在点点鼠标就可以了!