基于Android studio动态调试smali全过程

1 工具和环境

1、Android studio 用于集成idea插件和导入smali源码/
2、idea插件
3、首先得有一部已经 root 的手机

第三条条件没有那没办法了
插件下载 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还要转发接口,现在点点鼠标就可以了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章