Smali强大之处就是可以随心所欲的进行插桩操作。
Log插桩指的是反编译APK文件,在对应的smali文件里添加相应的smali代码,将程序中的关键信息,以log日志的形式进行输出。
本次以“好搜小说大全.apk”文件作为案例,下载“好搜小说全.apk”文件,打开雷电模拟器安装该APK,安装完成后,点击运行,如下图所示。
第一次打开该程序会有一个引导界面,引导界面结束后,会出现一个“应用更新”弹窗,点击“取消”按钮,不更新该程序,直接进入该程序。如下图所示。
探究:程序的入口界面和入口点哪一个启动的时机更早?
1.在程序入口界面插入Log日志信息
把“好搜小说大全.apk”文件,拖入到AndroidKiller工具里面进行反编译,反编译完成后会弹出一个弹窗,点击“否”,在工程信息栏点击程序“入口”界面,如下图所示。
然后点击三角形图标快速浏览相关方法,如下图所示。
由于我们要分析的是程序的启动流程,而在启动活动界面时,最先被调用的是onCreate方法,所以选择在onCreate方法,插入Log日志信息,通过浏览相关方法找到“onCreate”方法,如下图所示。
点击跳转到该方法对应的smali代码位置,如下图所示。
在“.prologue”下面插入Log日志信息,具体的操作是右键=》插入代码=》Log信息输出。如果没有“.prologue”,则在参数后面插入Log日志信息,修改需要输出的信息,CTRL+S保存,在程序入口界面插入Log日志信息就完成了,如下图所示。
2.在程序入口点插入Log日志信息
点击“工程管理器”找“AndroidManifest.xml”文件,双击打开该文件,如下图所示。
在“AndroidManifest.xml”文件里面找到“<application”标签,找到该标签下“android:name”属性对应的值“com.reader.ReaderApplication”,如下图所示。
根据该值在“工程管理器”里面找到对应的smali文件,然后双击打开,如下图所示。
继续点击三角形图标快速浏览相关方法,如下图所示。
通过浏览相关方法找到“onCreate”方法,如下图所示。
点击该方法,跳转到该方法对应的smali代码位置,如下图所示。
在“.prologue”下面插入Log日志信息,具体的操作是右键=》插入代码=》Log信息输出,如果没有“.prologue”,就在参数后面插入Log日志信息,修改需要输出的信息,CTRL+S保存,在程序入口点插入Log日志信息就完成了,如下图所示。
点击“编译”按钮开始编译,编译完成后,安装到雷电模拟器上。
然后打开“DDMS”工具,添加过滤器,查看Log日志信息。如下图所示。
通过打印的Log日志信息,可以得出:应用程序的入口点的执行时机,要早于程序入口界面。
探究:如果在其它位置插入Log,会有什么样的效果呢?
选择程序入口点的“<init>”方法,尝试在此处插入Log日志信息,如下图所示。
依然右键=》插入代码=》Log信息输出点击“编译”按钮,开始编译,编译完成后,安装运行程序,结果程序崩溃了,如下图所示。
程序崩溃是什么原因造成的呢?通过分析smali代码,发现该方法的局部变量寄存器个数为0,而我们插入的代码使用了“v1”寄存器。如果将局部变量寄存器个数改为1,安装运行,结果程序可以正常运行。
由此可以得出:通过分析smali代码,更改局部变量寄存器的总数可以解决上面程序崩溃的问题。
注意:如果使用到的局部变量寄存器个数大于方法指定的局部变量寄存器个数,需要修改方法指定的局部变量寄存器个数,反之,则不修改。
有必要提醒大家的是,如果你的能力不足以去分析smali代码中出现的逻辑问题,就按照前面讲的两种插桩的方法进行操作,一定是准确无误的。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课