AnHookd Hook

1.Hook

Hook译为“钩子”,就是在事件传送到终点前截获并监控事件的传输,像个钩子钩上事件一样,并且能够在钩上事件时处理一些自己特定的事件。

Android操作系统有一套自己的事件分发机制,所有的代码调用和回调都是按照一定顺序执行的,因此可以使用Hook在事件传送到终点前截获并监控该事件的传输,并且做一些自己的处理。可以简单的理解为把一件事中间拦截掉了,然后搞了点自己的小动作然后让它继续走下去。

Hook能将自己的代码“融入”被勾住的进程中,成为目标进程的一部分。API Hook技术是一种用于改变API执行结果的技术,能够将系统的API函数执行重定向。在Android系统中使用了沙箱机制,普通用户程序的进程空间都是独立的,程序的运行互不干扰。这就使我们希望通过一个程序改变其他程序的某些行为的想法不能直接实现,但是Hook的出现给我们开拓了解决此类问题的道路,使得我们能通过一个程序改变其他程序某些行为得以实现。

比如对象A调用对象B,待对象B处理完后,将结果回调给对象A。而钩子,正是在这个类对象之间的调用与回调过程中,通过反射或代理的方式,串改系统进程的代码执行顺序,如下图:

2aaad13bbbc84972acf82e9bf9d27ef1.png

可以看出Hook将自己注入到它要劫持的系统对象B所在的进程中,成为系统进程的一部分。而对象B就是就是我们所说的Hook点。

为了保证Hook的稳定性,一般拦截的点都会选择比较容易找到并且不易发生变化的对象,比如静态变量和单例。

 

2.Hook使用

比如使用hook来实现Activity插件化。这里主要注意点放在hook上,具体Activity插件化过程可以描述成A Activity要跳转到一个在Manifest.xml里没有注册过的B Activity,这个过程需要在AMS校验之前把跳转Activity目标从B Activity改成一个在Manifest.xml注册过的C Activity,然后在AMS校验之后再把C改成B,然后实现跳转逻辑。

①hook第一步,需要阅读源码,寻找hook点。

为了保证hook的稳定性,一般拦截的点都会选择比较容易找到并且不易发生变化的对象,比如静态变量和单例。这里需要熟悉Activity启动流程。

首先看startActivity()方法,不断的跟踪进去会发现:

aa81abb60dea4f7ba11c0914b0831193.png

由mInstrumentation调用execStartActivity方法启动Activity,注意这是在AMS校验之前,也就是这里AMS还没有校验要跳转的Activity是否在Manifest.xml里注册,因此可以在这里实现把B Activity替换成C的过程。

然后会在ActivityThread中的performLaunchActivity方法里调用mInstrumentation的newActivity方法用类加载器创建Activity的实例,因此可以在这里把它替换成要跳转的B Activity。

ada02f6129a34697b30dc3b00e42ed2b.png

到这里就找到了hook点,即mInstrumentation,我们只要自定义一个instrumentation替换掉即可。

②实现代码

工具类:FieldUtil.java

578e62c6c0f54e07a30cb474976ab8aa.png

自定义instruction:ProxyInstrumentation.java

6f6915ff84d64f6cab748b3881bd3f84.png

 controll操作类:HookUtil.java

5d208880020447019b457425d8cd2c9b.png

 然后Application调用下操作即可:

990307ff4a584aba91a1ca89889f9c61.png

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值