首页
论坛
课程
招聘
[原创]AndroidStudio+smalidea插件动态调式
3天前 509

[原创]AndroidStudio+smalidea插件动态调式

3天前
509

环境搭建是实践操作程序编写、反编译等等的基础操作,除了常用的Jeb动态调试外,我们还有什么方式进行动态调试呢?今天就来给大家介绍一下另外一种动态调试方式——AndroidStudio+smalidea插件调试。

什么是AndroidStudio+smalidea插件调试?

Android Studio 调试的原理

使用 Android Studio 进行动态调试,通过 Android Studio 导入反编译出的完整的 smali 代码,设置好调试所需的条件,设置断点。将移动设备连接至 PC端,然后运行待调试的apk应用程序,当该应用程序执行流程,运行至smali代码的断点处时,就会触发断点。从而可以进行进一步的分析和调试,让程序的运行流程和中间参数更清晰。

Android Studio 调试的流程

(1)下载并安装Android Studio工具和smalidea插件

●首先下载调试需要使用到的两款工具,Android Studio工具、smalidea插件。
●安装Android Studio工具。
●安装smalidea插件
打开Android Studio工具,点击File,选择Settings,或者按快捷键Ctrl+Alt+S打开设置界面,点击Plugin,再点击install plugin from disk。找到之前我们下载的smalidea插件选中点击OK,插件就添加成功了,会弹出弹窗,提示重启Android Studio,点击重启。
注意:这里要注意,如果没有重启,smalidea是没有生效的,就会导致后面无法在smali代码上打断点。
图片描述

(2)反编译待调试的apk

使用AndroidKiller工具,反编译我们要调试的APK文件,反编译成功后,在“工程管理器”找到AndroidManiFest.xml文件,再找到该文件里的application标签,查看标签中是否存在android:debuggable=“true”属性,如果文件中不存在android:debuggable=“true”,则需要进行添加。

 

注意:为什么要增加这个属性呢?

 

因为在开发的过程中,这个属性是由开发人员发开发并调试的属性,但是在发布的时候这个属性会自动删除,而我们要调试该程序,就需要将其进行增加。当然啦,如果是使用第三方模拟器或安卓自带模拟器的话,它是自动默认开启的,就不需要进行增加。可能有些小伙伴采用的是真机,这个真机不是山上跑的真鸡啊,这里是指我们生活中使用手机,系统调试的开关没有默认开启,就需要增加。然后我们将apk重打包安装到模拟器里,并且将工程下的project目录复制到桌面,方便后面AndroidStudio工具查找。

 

图片描述

 

图片描述
图片描述

(3)将反编译的文件夹导入AndroidStudio

打开AndroidStudio工具选择Import Project选项,点击该选项,并找到桌面上的project目录选中后点击OK。
图片描述%20图片描述

 

在这里选择第一个,然后一直选择“Next”,直到Finish完成导入项目。
图片描述
如果一打开,就是默认上一次的工程的话,点击左上角file选项下的open按钮,就会出现和上面一样的选择文件路径的窗口。
如果方便一点的话,就可以将默认打开上一次工程关掉。
关闭的操作流程如下:
主界面中,选择单击菜单栏File选项;弹出File菜单列表,单击Settings设置选项。弹出对话窗口选择Appearance&Behavior选项。Appearance & Behavior展开后,选择System Settings选项。取消勾选Reopen last project on startup选项,OK。
以上就是Android Studio启动时不自动打开项目的设置方法。

(4)调试环境配置

●在AndroidStudio工程中右键点击smali文件夹,设定Mark Directory as -> Sources Root。
图片描述
●打开AndroidStudio的File -> Project Structure选择,选择对
应的JDK。
图片描述
图片描述

 

●配置远程调试的选项,选择Run–>Edit Configurations选项,点击“+”号,新建remote类型调试器,设置Name,修改端口号,可以选择未被占用的任意端口,本次设置为8700。
图片描述
图片描述

(5)开始调试分析smali代码

※ 和Jeb动态调试一样,这里也是有两种调试方法的
一种是普通模式调试;另外一种是通过命令行“adb shell am start –D -n 应用程序包名/应用程序入口界面”命令,以调试模式启动应用程序调试。
那么问题来喽,Jeb动态调试的两种方法分别是什么呢?
※ Jeb动态调试有两种方式:
一种是普通模式调试;另外一种是debug模式启动程序调试。
①普通模式调试
案例:以“注册机”APP为例
●打开雷电模拟器安装“注册机”APP,安装完成后打开“注册机”程序。

 

图片描述
●点击左下角的“windows”图标,输入cmd命令,打开命令窗口。
输入“adb shell ps”命令,查看当前设备的进程信息,通过浏览进程信息,找到“注册机”程序的进程pid ,并且记录下来。
图片描述
图片描述
图片描述
●再次点击左下角的“windows”图标,输入cmd命令,打开新的命令窗口。输入“adbforwardtcp:8700jdwp:2524”命令,进行端口转发,其中的“tcp”是之前配置调试环境时指定的端口号,“jdwp”这里指的是我们要调试的程序的进程pid,在此之前已经记录下来。
图片描述
●在菜单中找到“debug”调试按钮,点击该按钮开始调试,出现下面的“socket”信息,这就说明附加成功了
图片描述
附加上了之后呢我们去进行下断,找到MainActivity.smali文件里面的checkSN方法,在方法前面的行号处点击即可下断。
有小伙伴可能有点懵逼了……为什么要在这里下段了?
因为jeb调试时,已经逆向分析过这个APP程序了。
图片描述
●我们会发现,没有立即断下来,这是因为程序还没有调用该方法 ,接下来,我们去操作程序,让他调用该方法,在这里随便输入“用户名”,但注册码必须是16位的,这点要记住,否则,会影响到后面的调试分析。输入相应的信息后了直接点击 “注册”按钮,发现程序被断下来了,出现了参数寄存器的值。
图片描述

 

图片描述
●此刻呢,我们会使用到一些按钮和快捷键进行后续操作:
F9:跳到下一个断点
F8:单步步过
F7:单步步入
Alt+shift+F7:强制进入
Shift+F8:单步步出

 

图片描述
●我们可以一直按f8或者可以在这个位置下个断,按f9程序就会在这个断点断下来。
图片描述
●此刻我们发现,正确的注册码已经出现,复制注册码,然后停掉as,去模拟器里面粘贴注册码,点击注册发现注册成功了,说明我们已经获取到正确注册码。

 

图片描述%20%20%20%20%20图片描述

 

② 以调试模式启动调试
●在这里呢,设置断点和普通模式是一样的。
首先我们先打开模拟器,然后再cmd里面输入“adb shell am start
-D -n 应用程序包名/应用程序入口界面”命令回车,我们可以看到模拟器弹出了一个弹窗,等待被调试。
图片描述
图片描述
●此时,我们需要打开cmd命令窗口,进行端口转发,输入“adb forward
tcp:8700 jdwp:2700”回车转发端口。
●转发成功后,点击调试按钮开始调试。
图片描述
●同样去操作程序,点击注册,马上就断下来
图片描述
调试成功就算是完成了环境搭建了。
以上就是AndroidStudio+smalidea插件调试的过程、步骤以及需要注意的事项,小伙伴们看完是不是觉得很简单呢?快动手试试吧。


[公告]《使用DCI技术进行全栈调试》训练营,硬件调试器你的,《软件调试》作者张银奎亲自授课!

收藏
点赞0
打赏
分享
最新回复 (1)
雪    币: 203
活跃值: 活跃值 (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
听风叶落 活跃值 2天前
2
0
Smali调试 步入能使用嘛
游客
登录 | 注册 方可回帖
返回