Log插桩调试smali代码

往期推荐

DDMS工具使用

快速定位关键代码

Smali文件详解

Java层逆向分析-Dalvik字节码

修改资源去广告

Smali强大之处就是可以随心所欲的进行插桩操作。

一:Log插桩定义

Log插桩指的是反编译APK文件,在对应的smali文件里添加相应的smali代码,将程序中的关键信息,以log日志的形式进行输出。

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

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

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

Log插桩调试smali代码

Log插桩调试smali代码

三:插入Log日志信息分析应用程序启动流程

探究:程序的入口界面和入口点哪一个启动的时机更早?

1.在程序入口界面插入Log日志信息

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

Log插桩调试smali代码

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

Log插桩调试smali代码

由于我们要分析的是程序的启动流程,而在启动活动界面时,最先被调用的是onCreate方法,所以选择在onCreate方法,插入Log日志信息,通过浏览相关方法找到“onCreate”方法,如下图所示。

Log插桩调试smali代码

点击跳转到该方法对应的smali代码位置,如下图所示。

Log插桩调试smali代码

在“.prologue”下面插入Log日志信息,具体的操作是右键=》插入代码=》Log信息输出。如果没有“.prologue”,则在参数后面插入Log日志信息,修改需要输出的信息,CTRL+S保存,在程序入口界面插入Log日志信息就完成了,如下图所示。

Log插桩调试smali代码

2.在程序入口点插入Log日志信息

点击“工程管理器”找“AndroidManifest.xml”文件,双击打开该文件,如下图所示。

Log插桩调试smali代码

在“AndroidManifest.xml”文件里面找到“<application”标签,找到该标签下“android:name”属性对应的值“com.reader.ReaderApplication”,如下图所示。

Log插桩调试smali代码

根据该值在“工程管理器”里面找到对应的smali文件,然后双击打开,如下图所示。

Log插桩调试smali代码

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

Log插桩调试smali代码

通过浏览相关方法找到“onCreate”方法,如下图所示。

Log插桩调试smali代码

点击该方法,跳转到该方法对应的smali代码位置,如下图所示。

Log插桩调试smali代码

在“.prologue”下面插入Log日志信息,具体的操作是右键=》插入代码=》Log信息输出,如果没有“.prologue”,就在参数后面插入Log日志信息,修改需要输出的信息,CTRL+S保存,在程序入口点插入Log日志信息就完成了,如下图所示。

Log插桩调试smali代码

点击“编译”按钮开始编译,编译完成后,安装到雷电模拟器上。

然后打开“DDMS”工具,添加过滤器,查看Log日志信息。如下图所示。

Log插桩调试smali代码
Log插桩调试smali代码

通过打印的Log日志信息,可以得出:应用程序的入口点的执行时机,要早于程序入口界面。

四:插入Log日志导致程序崩溃的解决方法

探究:如果在其它位置插入Log,会有什么样的效果呢?

选择程序入口点的“”方法,尝试在此处插入Log日志信息,如下图所示。

Log插桩调试smali代码

依然右键=》插入代码=》Log信息输出点击“编译”按钮,开始编译,编译完成后,安装运行程序,结果程序崩溃了,如下图所示。

Log插桩调试smali代码

程序崩溃是什么原因造成的呢?通过分析smali代码,发现该方法的局部变量寄存器个数为0,而我们插入的代码使用了“v1”寄存器。如果将局部变量寄存器个数改为1,安装运行,结果程序可以正常运行。

由此可以得出:通过分析smali代码,更改局部变量寄存器的总数可以解决上面程序崩溃的问题。

注意:如果使用到的局部变量寄存器个数大于方法指定的局部变量寄存器个数,需要修改方法指定的局部变量寄存器个数,反之,则不修改。

有必要提醒大家的是,如果你的能力不足以去分析smali代码中出现的逻辑问题,就按照前面讲的两种插桩的方法进行操作,一定是准确无误的。

小结:

今天主要分享了插入Log日志信息分析应用程序启动流程,掌握在关键位置插入smali代码,打印Log日志信息进行调试。找到“onCreate”方法,程序入口界面和入口点插入了Log日志信息的位置选择,插桩操作:右键=》插入代码=》Log信息输出。

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

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

Log插桩调试smali代码