AnHookd Hook

1.Hook

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

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

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

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

AnHookd Hook_第1张图片

可以看出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()方法,不断的跟踪进去会发现:

AnHookd Hook_第2张图片

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

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

AnHookd Hook_第3张图片

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

②实现代码

工具类:FieldUtil.java

AnHookd Hook_第4张图片

自定义instruction:ProxyInstrumentation.java

AnHookd Hook_第5张图片

 controll操作类:HookUtil.java

AnHookd Hook_第6张图片

 然后Application调用下操作即可:

AnHookd Hook_第7张图片

 

你可能感兴趣的:(android)