阅读 81

Hook

Hook

Hook 又叫“钩子”,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行融入。这样当这些方法被调用时,也就可以执行我们自己的代码,这也是面向切面编程的思想(AOP)。他是开闭原则的体现。因为我们常常会有需求想不改变原有接口的时候实现我们的需求,它使用到反射和代理完成功能需求。

Hook 选择的关键点

     尽量静态变量和单例,因为一旦创建对象,它们不容易变化,非常容易定位。

Hook 过程需要注意

     寻找 Hook 点,原则是尽量静态变量或者单例对象,尽量 Hook public 的对象和方法。

     选择合适的代理方式,如果是接口可以用动态代理。

     偷梁换柱——用代理对象替换原始对象。

     Android 的 API 版本比较多,方法和类可能不一样,所以要做好 API 的兼容工作。


例:我们hook一下view的点击事件






从图上3张图,我们就找到了hook点。

①我们进入setOnClickListener方法找到getListenerInfo()方法,发现getListenerInfo()方法返回的是一个单例对象。这里就当做我们hook备用点。

②看一下ListenerInfo对象。它持有OnClickListener对象,正好我们需要代理的接口就是OnClickListener中的onClick方法。

于是乎我们就有思路了,开干。

①通过反射拿到单例方法getListenerInfo(),执行该方法后我们得到一个ListenerInfo对象。


②我们需要用代理替换ListenerInfo中的OnClickListener对象,因为我们需要在代理里面实现我们的需求。




成果


总结

hook需要总结的点很多,特别注意的就是版本适配,因为androidAPI 版本太多,每个版本可能实现都有区别,当你hook一些方法的时候,尽可能的要把版本适配做好。

作者:森屿暖茶

原文链接:https://www.jianshu.com/p/70f899b650df

文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐