方法栈跟踪

往期推荐

Log插桩调试smali代码

DDMS工具使用

快速定位关键代码

Smali文件详解

Java层逆向分析-Dalvik字节码

修改资源去广告

今天分享方法栈跟踪,掌握本次的内容,有助于在关键方法里面插入栈跟踪代码,理清该方法的上层调用关系。

一:方法栈跟踪定义

之前在学习虚拟机的时候,提到过栈结构,它是一种先进后出的数据结构。

栈跟踪法属于动态调试的方法,原理是输出运行时栈调用跟踪信息,然后查看函数调用序列来理解方法的执行流程。

二:下载、安装好搜小说应用程序

以“好搜小说大全.apk”文件作为案例,下载“好搜小说大全.apk”文件,打开雷电模拟器安装该APK,安装完成后,点击运行,如下图所示。

方法栈跟踪

第一次打开该程序会有一个引导界面,引导界面结束后,会出现一个“应用更新”弹窗,点击“取消”按钮,不更新该程序。

打开命令窗口,输入adb shell dumpsys activity top命令,获取应用程序的包名信息。

然后打开“DDMS”工具,添加过滤器,点击+号,名称设置为“yijindaxue”,在过滤器中增加“好搜小说大全.apk”包名,查Log日志信息,如下图所示。

方法栈跟踪

三:查看栈跟踪信息

通过查看Log日志信息,发现该程序在运行时打印的Log日志信息非常多。“system.err”标签是栈信息的标志,由此我们可以看到,这其中大多数Log日志信息都是“栈”信息,如下图所示,还有一些是其它级别的信息,暂时不做过多的讲解。

方法栈跟踪

阅读打印输出的“栈”信息,上层是被调用者,下层是调用者,总的来说就是自下而上的调用关系,如下图所示。

方法栈跟踪

四:插入栈跟踪代码

把“好搜小说大全.apk”文件,拖入AndroidKiller工具里面进行反编译,反编译完成后会弹出一个弹窗,在这里点击“否”,在工程信息栏点击程序“入口”界面,如下图所示。

方法栈跟踪

然后点击三角形图标快速浏览相关方法,如下图所示。

方法栈跟踪

可以看到存在多种方法,比如loaddata,loadDefault等,想查看哪一种方法上层调用关系,就进行对应方法的选择,如下图所示。

方法栈跟踪

以“loadData”方法为例,选择查看“loadData”方法上层调用关系,点击跳转到该方法对应的smali代码位置,如下图所示。
方法栈跟踪

沿用上节课的逻辑,找到“.prologue”,在“.prologue”下面插入方法栈跟踪代码,具体的操作是右键=》插入代码=》StackTrace栈跟踪,如果没有“.prologue”,就在参数后面插入栈跟踪代码,然后CTRL+S保存,如下图所示。

注意:

在插入栈跟踪代码时,需要查看该方法的局部变量寄存器总个数,如果小于2需要修改,局部变量寄存器的总数为2,原因是插入的栈跟踪代码要使用两个局部变量寄存器

方法栈跟踪

最后点击“编译”按钮开始编译,编译完成后,安装到雷电模拟器上。安装完成后,打开“DDMS”工具,选择之前我们添加的过滤器“yijindaxue”,点击运行 “好搜小说大全”APP程序,查看程序启动的过程中出现的Log日志信息,如下图所示。

方法栈跟踪

通过查看栈跟踪信息,我们得出结论:“loadData”是在“onCreate”方法中被调用的,而“onCreate”方法是被系统函数调用的。分析到这里,我们就知道“loadData”方法的上层调用流程了。

在操作的过程中我们需要频繁的安装打开程序,每次都会弹出是否要更新APP程序的弹窗,那么给大家传授一个小技巧,教大家如何去除APP程序的更新弹窗,实现免更新功能。

具体的操作流程:

(1)在“工程管理器”中找到“apktool.yml”文件,双击打开该文件。 这个文件是工程配置文件,里面包含工程文件信息以及版本信息。应用程序会进行判断,这个版本信息是否大于当前发布的最新版本信息,如下图所示。

方法栈跟踪

(2)继续浏览该文件,找到“versionCode”对应的属性的值,将该值改大,这里改为“999”,点击“编译”按钮开始编译,编译完成后安装运行,发现没有更新APP程序的弹窗了,说明成功实现免更新功能,如下图所示。

方法栈跟踪

小结:

今天主要学习方法栈跟踪,理解栈跟踪原理,掌握插入栈跟踪代码技巧,插入栈跟踪,分析方法的上层调用流程的关键:插入栈跟踪的位置选择,操作:右键=》插入代码=》StackTrace栈跟踪,插入栈跟踪代码时,需要查看该方法的局部变量寄存器总个数。

如果你也对安卓逆向感兴趣。可以加下方的群,大家一起讨论问题,或者扫描下方二维码,关注回复 “安卓逆向” 获取免费教程

安卓逆向交流学习:1139349849
vx:Yjxiaox

方法栈跟踪