安卓逆向——Log插桩调试smali代码

admin 2022年12月10日20:40:17评论115 views字数 2092阅读6分58秒阅读模式
安卓逆向——Log插桩调试smali代码
安卓逆向——Log插桩调试smali代码

公众号:易锦课堂

点击右方领取,回复1即可领取安卓逆向教学大礼包一份。


领取



安卓逆向——Log插桩调试smali代码


安卓逆向——Log插桩调试smali代码

编辑:陈情

文章:易锦课堂



安卓逆向——Log插桩调试smali代码

Log

插桩

安卓逆向——Log插桩调试smali代码

smali

代码

分析APP程序的时候,怎么样快速地定位关键点打印log日志信息呢?

“插桩”这个学术词语,第一次看见的时候小伙伴们会想到什么呢?

插桩,是不是就是农民伯伯在地里插的木桩?

安卓逆向——Log插桩调试smali代码

“插桩”在农业中确实指的就是在田地里插木桩,但是在我们的安卓逆向技术范畴内,它有一个高端的定义——定位关键代码技巧。

五种定位技巧

1. 信息反馈法

通过搜索它的资源id字符串来进行定位

2. 特征函数法

通过搜索一些会调用的关键的api函数

3. 顺序查看法

通过用来分析程序的执行流程,比如UNclick点击事件,或者是activity的一些活动周期等等

4. 代码注入法

通过插入一些log或者是查看一些logcat等等

5. 栈跟踪法

栈跟踪法属于动态调试的一种,通过分析它的一个函数的调用流程

6. Method Profiling(方法剖析)

方法剖析也是属于动态调试的一种,可以用来分析一些函数的调用流程


Log插桩定义:

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

安卓逆向——Log插桩调试smali代码

以“好搜小说大全.apk”文件为例,首先下载一个“好搜小说大全”APP,打开雷电模拟器将它拖进去,

安卓逆向——Log插桩调试smali代码

插入log日志信息,然后我们来分析一下程序的启动流程。


这里可以思考一下,程序的入口页面和入口点,哪一个启动的时机更早?


我们可以通过Log日志信息来测试一下:


先打开Android Killer,将apk文件拖进来反编译,

安卓逆向——Log插桩调试smali代码

反编译完成后出现弹窗,选择“否”即可,而后找到“工程信息”一栏,

安卓逆向——Log插桩调试smali代码

找到“入口页面”并单击点开它。

安卓逆向——Log插桩调试smali代码

由于我们分析的是程序的启动流程,在启动活动界面的时候,最先被调用的是onCreate方法,所以我们要先浏览相关的方法找到“oncreate”,

安卓逆向——Log插桩调试smali代码

选择“oncreate”方法我们可以找到代码开始的位置,在这里可以直接插入Log日志信息,然后右键选择“插入代码”,再选择Log信息输出,

安卓逆向——Log插桩调试smali代码

具体操作流程演示

在空白部分输入我们想要输入的文字,然后ctrl+S保存,然后在程序的入口页面插入Log日志信息就已经完成了。


接下来还需要在程序入口点插入Log日志信息,点击“工程管理器”找“AndroidManifest.xml”文件,

安卓逆向——Log插桩调试smali代码

里面有个“<application”标签,找到程序的“入口点”

安卓逆向——Log插桩调试smali代码

找到程序“入口点”所在的位置“com.reader”,然后找到“re”文件

安卓逆向——Log插桩调试smali代码

选择右上角三角图标快速浏览相关的方法,通过浏览相关的方法我们找到oncreate这样一样函数方法,点击跳转到该方法对应的smali代码位置,在空白处插入Log日志信息。

安卓逆向——Log插桩调试smali代码

右键,插入代码,输入Log日志信息,输入文字并保存,点击“Android”这一选项,点击“编译”,回编译我们刚刚修改好的这样一个程序

安卓逆向——Log插桩调试smali代码

接下来就需要将之前所安装的apk进行卸载,然后把回编译后的apk安装上,

安卓逆向——Log插桩调试smali代码

然后打开DDMS工具,找到这个文件,由于我们刚才插入了一些Log日志的的信息,然后选择添加过滤器,

安卓逆向——Log插桩调试smali代码

在其中搜索我们刚刚创建修改好的入口点和启动页面,

安卓逆向——Log插桩调试smali代码

仔细观察这个过程可以发现,应用程序的执行时机要早于我们的程序入口页面的!



但是也要注意,在某些方法插入Log日志会导致程序崩溃,当然也是有对应的解决方法的。


如果在其他位置插入Log会有什么效果呢?可以测试一下:



选择程序的入口页面,UNclick方法,


安卓逆向——Log插桩调试smali代码

在<init>处可以插入Log日志信息,

安卓逆向——Log插桩调试smali代码

选中的部分输入随意的文字即可,

安卓逆向——Log插桩调试smali代码

保存之后进行回编译,编译完成后把apk卸载再重新安装,会出现弹窗显示“很抱歉,好搜小说大全已停止运行”

安卓逆向——Log插桩调试smali代码

这是什么问题导致的呢?让我们把局部变量寄存器的个数改为1看看会出现什么效果:

安卓逆向——Log插桩调试smali代码

编译竟然成功了?是不是很意外呢?这是什么原因呢?

首先我们来看一下这个smali代码,

安卓逆向——Log插桩调试smali代码

发现该方法的局部变量寄存器个数为“0”,

安卓逆向——Log插桩调试smali代码

而我们插入的代码使用了一个寄存器,这里我们需要将局部变量寄存器个数改为“1”

安卓逆向——Log插桩调试smali代码

这是什么问题呢?让我们来看一下,改好后CTRL+S保存一下,然后再进行编译,显示编译完成。然后把改崩了的apk删除,再重新下载安装,发现apk又可以正常运行了。

总结


由此可以得出结论:我们在分析一些smali代码的时候,可以通过更改局部变量寄存器的总数,可以达到解决上面产生的程序崩溃的问题。这也提醒我们在后面的smali代码修改中,需要特别注意使用到的局部变量寄存器个数,是否大于方法指定的局部变量寄存器个数,如果大于了就需要修改方法指定的局部变量寄存器个数,反之即不需要修。


当然如果你的能力不足以分析smali代码中出现的逻辑问题,就老老实实用两种插桩的方法进行操作吧


安卓逆向——Log插桩调试smali代码

小福利

最后
推荐一个免费领取各种逆向工具包的公众号:

易锦课堂

不仅高级工具很齐全

你回复咨询还会及时解答你在逆向学习工作上的疑难杂症

长按下方二维码关注免费领取专属工具包吧

还有更多惊喜等着你哦

安卓逆向——Log插桩调试smali代码


原文始发于微信公众号(映山红coin安全团队):安卓逆向——Log插桩调试smali代码

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年12月10日20:40:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   安卓逆向——Log插桩调试smali代码http://cn-sec.com/archives/1056559.html

发表评论

匿名网友 填写信息