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