无法定位程序输入点adddlldirectory 于动态_AS+smalidea插件动态调式

本文详细介绍了如何使用Android Studio结合smalidea插件进行smali代码的动态调试。从下载安装Android Studio和smalidea插件,到反编译APK,设置debuggable属性,再到导入反编译项目,配置调试环境,最后通过普通模式和调试模式启动调试。文中还提到了关键步骤,如设置断点,端口转发,以及常用的调试快捷键。
摘要由CSDN通过智能技术生成
点击蓝字默默关注1 Android Studio 调试的原理

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

2 Android Studio 调试的流程

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

下载两款工具以及安装Android Studio工具,这里略过。

着重介绍安装smalidea插件,打开Android Studio工具,点击File,选择Settings,或者按快捷键Ctrl+Alt+S打开设置界面,点击Plugin,再点击install plugin from disk。找到之前我们下载的smalidea插件选中点击OK,插件就添加成功了,会弹出弹窗,提示重启Android Studio,点击重启,如图1.1所示。

注意:如果没有重启,smalidea是没有生效的,就会导致后面无法在smali代码上打断点。

895f3ea4e9d964b263d2722d81fac916.png

                               (图1.1)

2.反编译待调试的apk

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

79ed0e6797b90bc142c35e8af542ddfe.png

                               (图1.2)

探究:为什么要增加这个属性呢?

因为在开发的过程中,这个属性是由开发人员开发并调试的属性,但是在发布的时候这个属性会自动删除,而我们要调试该程序,就需要将其进行增加。当然如果是使用第三方模拟器或安卓自带模拟器,它是自动默认开启的,就不需要进行增加。

然后将apk打包安装到模拟器里,如图1.3所示。并且将工程下的project目录复制到桌面,方便后面AndroidStudio工具查找,如图1.4所示。

c6bef450edcd66e7babd11d1f63fd14e.png     

                               (图1.3)

f7dd8727e720270210eba549bd3466bc.png

                               (图1.4)

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

打开AndroidStudio工具选择Import Project选项,点击该选项,如图1.5所示。并找到桌面上的project目录选中后点击OK,如图1.6所示。

9cc1bf95db5b18ae07fadc11bddd47b3.png       

                                   (图1.5)

9e1dee7bddff75a94f4870f09eb54330.png

                                   (图1.6)

这些页面中选择第一个,然后一直点击 “Next”,直到Finish完成导入项目,如图1.7所示。

28934e64dcfa142f2a0ec64cd81ae231.png

                               (图1.7)

如果打开之后是默认上一次的工程,可以选择关闭默认打开上一次工程。关闭的操作流程:在主界面中,选择单击菜单栏File选项;弹出File菜单列表,单击Settings设置选项,弹出对话窗口选择Appearance&Behavior选项,Appearance & Behavior展开后,选择System Settings选项,取消勾选Reopen last project on startup选项。

4.调试环境配置

(1)在AndroidStudio工程中右键点击smali文件夹,设定Mark Directory as => Sources Root,如图1.8所示。

48d1ce8bae52b385ddb681991ad6f1bd.png

                               (图1.8)

(2)打开AndroidStudio的File => Project Structure选择,选择对应的JDK,如图1.9所示。

a8ecac0d836d9f753b83cb0303c3b133.png

                               (图1.9)

(3)配置远程调试的选项,选择Run =>Edit Configurations选项,1.10所示。

e12dede2e07c0b2b2a5693f780682bda.png

                               (图1.10)

点击“+”号,新建remote类型调试器,如图1.11所示。

bc3325c15a5e85bbdaba165775bf90b0.png

                               (图1.11)

设置Name,修改端口号,可以选择未被占用的任意端口,本次设置为8700,如图1.12所示。

ab09751aea162e7433545470a17280d4.png

                               (图1.12)

5.开始调试分析smali代码

和Jeb动态调试一样,也有两种调试方法:一种是普通模式调试,另外一种是通过命令行“adb shell am start –D  -n 应用程序包名/应用程序入口界面”命令,以调试模式启动应用程序调试。

探究:JEB动态调试的两种方法分别是什么呢?

(1)普通模式调试

第一步:以“注册机”APP为例,打开雷电模拟器安装“注册机”APP,安装完成后打开“注册机”程序。

第二步:点击左下角的“windows”图标,输入cmd命令,打开命令窗口。输入“adb shell ps”命令,查看当前设备的进程信息,通过浏览进程信息,找到“注册机”程序的进程pid ,并且记录下来,如图1.13所示。

8d4763817a30f4f42af98a064a5ce3ee.png

                               (图1.13)

第三步:再次点击左下角的“windows”图标,输入cmd命令,打开新的命令窗口。输入“adb forward tcp:8700 jdwp:2524”命令,进行端口转发,其中的“tcp”是之前配置调试环境时指定的端口号,“jdwp”这里指的是我们要调试的程序的进程pid,在此之前已经记录下来,如图1.14所示。

6a4ddc98f0278e980171c745abf2bee0.png

                               (图1.14)

第四步:在菜单中找到“debug”调试按钮,点击该按钮开始调试,出现下面的“socket”信息,这就说明附加成功,如图1.15所示。

b3969ef309a6241e536cfbf1e264a6b7.png

                               (图1.15)

附加完成之后进行下断,找到MainActivity.smali文件里面的checkSN方法,在方法前面的行号处点击即可下断,如图1.16所示。

01ca158c98db920284b8fa023414a245.png

                               (图1.16)

这个过程中会发现,没有立即断下来,这是因为程序还没有调用该方法,这时去操作程序,让他调用该方法,在这里随意输入一个“用户名”,但注册码必须是16位的,否则,会影响到后面的调试分析。输入相应的信息后直接点击 “注册”按钮,如图1.17所示。

858ed5adb7421a09d011f6b8d8d20ea9.png

                               (图1.17)

发现程序被断下来了,出现了参数寄存器的值,如图1.18所示。

84021b6a87e132cb5b43701bbff57a10.png

                               (图1.18)

接下来会使用到一些按钮和快捷键进行后续操作,简单介绍一下它们的用法,如图1.19所示:

F9:跳到下一个断点

F8:单步步过

F7:单步步入

Alt+shift+F7:强制进入

Shift+F8:单步步出

68f78a7b1b7bb8db106a3a6f2345a90b.png

                               (图1.19)

一直按f8或者可以在这个位置下断,按f9程序就会在这个断点断下来,如图1.20所示。

673ed0950813a809a9b0602a9e12ec1b.png

                               (图1.20)

发现正确的注册码已经出现,如图1.21所示。

33f4b7adfe8b6adba62dcc294c2d34a3.png

                               (图1.21)

然后停掉as,如图1.22所示。

c5e588773bc2d847f92424cf2038396b.png

                               (图1.22)

去模拟器里面粘贴注册码,点击注册,注册成功了,如图1.23所示,说明我们已经获取到正确注册码。

7aef8e82807d06e61938d18046dd1ef3.png

                               (图1.23)

以调试模式启动调试

设置断点的方法和普通模式是一样的,先打开模拟器,然后再cmd里面输入“adb shell am start -D -n  应用程序包名/应用程序入口界面”命令回车,如图1.24所示。

7db9d325841d01a42a3f4bcf714d6e46.png

                               (图1.24)

模拟器弹出了一个弹窗,等待被调试,如图1.25所示。

e6561a763452004df14a71201171ffb2.png

                               (图1.25)

此时,打开cmd命令窗口,进行端口转发,输入“adb forward tcp:8700 jdwp:2700”回车转发端口,如图1.26所示。

ba8da4b08e0e44914413520703237228.png

                               (图1.26)

转发成功后,点击调试按钮开始调试,如图1.27所示。

4932258e1c58144ba4f360b07aecd464.png

                               (图1.27)

同样去操作程序,点击注册,马上就断下来,如图1.28所示。

73d2af1ef0c7a0258f66b30467f58388.png

                               (图1.28)

接下来的操作参考普通模式调试。

3小结

本次主要分享了AndroidStudio+smalidea插件动态调试,主要掌握的重点内容有:

1. 调试环境配置:安装插件->反编译apk ->复制project目录到桌面、安装反编译后的apk ->导入project到as工程 ->设置smali文件夹为资源文件夹 -> 配置工程jdk ->配置调试选项 ->下断。

2.普通调试模式:配置好一切之后,打开模拟器里面的apk -> cmd命令查找进程PID  ->然后转发端口 ->点击调试按钮开始调试分析。

3.以调试模式启动调试:配置好一切之后 ->cmd命令以调试模式启动程序,记下pid->转发端口 ->点击调试按钮开始调试分析。

4、快捷键:

F9:跳到下一个断点

F8:单步步过

F7:单步步入

Alt+shift+F7:强制进入

Shift+F8:单步步出

文章推荐 JEB动态调试 DDMS method profiling案列分析 Java 方法栈跟踪 Log插桩调试smali代码 DDMS工具介绍——内含实战教学 java代码几千行如何快速定位关键代码

44c554fc63319b90c3199d57911696d3.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值