Hook

时间:2021-7-4 作者:qvyue

Hook

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

Hook 选择的关键点

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

Hook 过程需要注意

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

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

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

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

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

Hook

Hook

Hook

Hook

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

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

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

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

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

Hook

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

Hook

Hook

Hook

成果

Hook

总结

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

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。