安卓逆向——Log插桩调试smali代码Log
插桩
smali
代码分析APP程序的时候,怎么样快速地定位关键点打印log日志信息呢?
“插桩”这个学术词语,第一次看见的时候小伙伴们会想到什么呢?
插桩,是不是就是农民伯伯在地里插的木桩?
“插桩”在农业中确实指的就是在田地里插木桩,但是在我们的安卓逆向技术范畴内,它有一个高端的定义——定位关键代码技巧。
五种定位技巧
1. 信息反馈法
通过搜索它的资源id字符串来进行定位
2. 特征函数法
通过搜索一些会调用的关键的api函数
3. 顺序查看法
通过用来分析程序的执行流程,比如UNclick点击事件,或者是activity的一些活动周期等等
4. 代码注入法
通过插入一些log或者是查看一些logcat等等
5. 栈跟踪法
栈跟踪法属于动态调试的一种,通过分析它的一个函数的调用流程
6. Method Profiling(方法剖析)
方法剖析也是属于动态调试的一种,可以用来分析一些函数的调用流程
Log插桩定义:Log插桩指的是反编译APK文件时,在对应的smali文件里,添加相应的smali代码,将程序中的关键信息,以log日志的形式进行输出。
以“好搜小说大全.apk”文件为例,首先下载一个“好搜小说大全”APP,打开雷电模拟器将它拖进去,
插入log日志信息,然后我们来分析一下程序的启动流程。
这里可以思考一下,程序的入口页面和入口点,哪一个启动的时机更早?
我们可以通过Log日志信息来测试一下:
先打开Android Killer,将apk文件拖进来反编译,
反编译完成后出现弹窗,选择“否”即可,而后找到“工程信息”一栏,
找到“入口页面”并单击点开它。
由于我们分析的是程序的启动流程,在启动活动界面的时候,最先被调用的是onCreate方法,所以我们要先浏览相关的方法找到“oncreate”,
选择“oncreate”方法我们可以找到代码开始的位置,在这里可以直接插入Log日志信息,然后右键选择“插入代码”,再选择Log信息输出,
具体操作流程演示在空白部分输入我们想要输入的文字,然后ctrl+S保存,然后在程序的入口页面插入Log日志信息就已经完成了。
接下来还需要在程序入口点插入Log日志信息,点击“工程管理器”找“AndroidManifest.xml”文件,
里面有个“<application”标签,找到程序的“入口点”
找到程序“入口点”所在的位置“com.reader”,然后找到“re”文件
选择右上角三角图标快速浏览相关的方法,通过浏览相关的方法我们找到oncreate这样一样函数方法,点击跳转到该方法对应的smali代码位置,在空白处插入Log日志信息。
右键,插入代码,输入Log日志信息,输入文字并保存,点击“Android”这一选项,点击“编译”,回编译我们刚刚修改好的这样一个程序
接下来就需要将之前所安装的apk进行卸载,然后把回编译后的apk安装上,
然后打开DDMS工具,找到这个文件,由于我们刚才插入了一些Log日志的的信息,然后选择添加过滤器,
在其中搜索我们刚刚创建修改好的入口点和启动页面,
仔细观察这个过程可以发现,应用程序的执行时机要早于我们的程序入口页面的!
但是也要注意,在某些方法插入Log日志会导致程序崩溃,当然也是有对应的解决方法的。
如果在其他位置插入Log会有什么效果呢?可以测试一下:
选择程序的入口页面,UNclick方法,
在<init>处可以插入Log日志信息,
选中的部分输入随意的文字即可,
保存之后进行回编译,编译完成后把apk卸载再重新安装,会出现弹窗显示“很抱歉,好搜小说大全已停止运行”
这是什么问题导致的呢?让我们把局部变量寄存器的个数改为1看看会出现什么效果:
编译竟然成功了?是不是很意外呢?这是什么原因呢?
首先我们来看一下这个smali代码,
发现该方法的局部变量寄存器个数为“0”,
而我们插入的代码使用了一个寄存器,这里我们需要将局部变量寄存器个数改为“1”
这是什么问题呢?让我们来看一下,改好后CTRL+S保存一下,然后再进行编译,显示编译完成。然后把改崩了的apk删除,再重新下载安装,发现apk又可以正常运行了。总结
由此可以得出结论:我们在分析一些smali代码的时候,可以通过更改局部变量寄存器的总数,可以达到解决上面产生的程序崩溃的问题。这也提醒我们在后面的smali代码修改中,需要特别注意使用到的局部变量寄存器个数,是否大于方法指定的局部变量寄存器个数,如果大于了就需要修改方法指定的局部变量寄存器个数,反之即不需要修。
当然如果你的能力不足以分析smali代码中出现的逻辑问题,就老老实实用两种插桩的方法进行操作吧