当前位置:首页 > 开发教程 > 手机开发 >

Android Hook 机制之简单实战

时间:2019-09-12 13:53 来源: 作者:迷你奇 收藏

什么是 Hook Hook 又叫钩子,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行融入。这样当这些方法被调用时,也就可以执行我们自己的代码,这也是面向切面编程的思想(AOP)。 Hook 分类 1.根据Android开发模式,Native模式(C/C

什么是 Hook

Hook 又叫“钩子”,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行融入。这样当这些方法被调用时,也就可以执行我们自己的代码,这也是面向切面编程的思想(AOP)。

Hook 分类

1.根据Android开发模式,Native模式(C/C++)和Java模式(Java)区分,在Android平台上

Java层级的Hook;

Native层级的Hook;

2.根 Hook 对象与 Hook 后处理事件方式不同,Hook还分为:

消息Hook;

API Hook;

3.针对Hook的不同进程上来说,还可以分为:

全局Hook;

单个进程Hook;

常见 Hook 框架

在Android开发中,有以下常见的一些Hook框架:

1.Xposed

通过替换 /system/bin/app_process 程序控制 Zygote 进程,使得 app_process 在启动过程中会加载 XposedBridge.jar 这个 Jar 包,从而完成对 Zygote 进程及其创建的 Dalvik 虚拟机的劫持。

Xposed 在开机的时候完成对所有的 Hook Function 的劫持,在原 Function 执行的前后加上自定义代码。

2.Cydia Substrate

Cydia Substrate 框架为苹果用户提供了越狱相关的服务框架,当然也推出了 Android 版 。Cydia Substrate 是一个代码修改平台,它可以修改任何进程的代码。不管是用 Java 还是 C/C++(native代码)编写的,而 Xposed 只支持 Hook app_process 中的 Java 函数。

3.Legend

Legend 是 Android 免 Root 环境下的一个 Apk Hook 框架,该框架代码设计简洁,通用性高,适合逆向工程时一些 Hook 场景。大部分的功能都放到了 Java 层,这样的兼容性就非常好。

原理是这样的,直接构造出新旧方法对应的虚拟机数据结构,然后替换信息写到内存中即可。

 

Hook 必须掌握的知识

反射

如果你对反射还不是很熟悉的话,建议你先复习一下 java 反射的相关知识。有兴趣的,可以看一下我的这一篇博客 Java 反射机制详解

java 的动态代理

动态代理是指在运行时动态生成代理类,不需要我们像静态代理那个去手动写一个个的代理类。在 java 中,我们可以使用 InvocationHandler 实现动态代理.

Hook 使用实例

Hook 选择的关键点

  • Hook 的选择点:尽量静态变量和单例,因为一旦创建对象,它们不容易变化,非常容易定位。
  • Hook 过程:
  • 寻找 Hook 点,原则是尽量静态变量或者单例对象,尽量 Hook public 的对象和方法。
  • 选择合适的代理方式,如果是接口可以用动态代理。
  • 偷梁换柱——用代理对象替换原始对象。
  • Android 的 API 版本比较多,方法和类可能不一样,所以要做好 API 的兼容工作。

简单案例一: 使用 Hook 修改 View.OnClickListener 事件

首先,我们先分析 View.setOnClickListener 源码,找出合适的 Hook 点。可以看到 OnClickListener 对象被保存在了一个叫做 ListenerInfo 的内部类里,其中 mListenerInfo 是 View 的成员变量。ListeneInfo 里面保存了 View 的各种监听事件。因此,我们可以想办法 hook ListenerInfo 的 mOnClickListener 。

Android Hook 机制之简单实战

 

接下来,让我们一起来看一下怎样 Hook View.OnClickListener 事件?

大概分为三步:

第一步:获取 ListenerInfo 对象

从 View 的源代码,我们可以知道我们可以通过 getListenerInfo 方法获取,于是,我们利用反射得到 ListenerInfo 对象

第二步:获取原始的 OnClickListener事件方法

从上面的分析,我们知道 OnClickListener 事件被保存在 ListenerInfo 里面,同理我们利用反射获取

第三步:偷梁换柱,用 Hook代理类 替换原始的 OnClickListener

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

执行以下代码,将会看到当我们点击该按钮的时候,会弹出 toast “Hook Click Listener”

Android Hook 机制之简单实战

 

简单案例二: HooK Notification

发送消息到通知栏的核心代码如下:

Android Hook 机制之简单实战

 

跟踪 notify 方法发现最终会调用到 notifyAsUser 方法

Android Hook 机制之简单实战

 

而在 notifyAsUser 方法中,我们惊喜地发现 service 是一个单例,因此,我们可以想方法 hook 住这个 service,而 notifyAsUser 最终会调用到 service 的 enqueueNotificationWithTag 方法。因此 hook 住 service 的 enqueueNotificationWithTag 方法即可

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

综上,要 Hook Notification,大概需要三步:

第一步:得到 NotificationManager 的 sService

第二步:因为 sService 是接口,所以我们可以使用动态代理,获取动态代理对象

第三步:偷梁换柱,使用动态代理对象 proxyNotiMng 替换系统的 sService

 

于是,我们可以写出如下的代码

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

Hook 使用进阶

Hook ClipboardManager

第一种方法

从上面的 hook NotificationManager 例子中,我们可以得知 NotificationManager 中有一个静态变量 sService,这个变量是远端的 service。因此,我们尝试查找 ClipboardManager 中是不是也存在相同的类似静态变量。

查看它的源码发现它存在 mService 变量,该变量是在 ClipboardManager 构造函数中初始化的,而 ClipboardManager 的构造方法用 @hide 标记,表明该方法对调用者不可见。

而我们知道 ClipboardManager,NotificationManager 其实这些都是单例的,即系统只会创建一次。因此我们也可以认为

ClipboardManager 的 mService 是单例的。因此 mService 应该是可以考虑 hook 的一个点。

Android Hook 机制之简单实战

 

接下来,我们再来一个看一下 ClipboardManager 的相关方法 setPrimaryClip , getPrimaryClip

Android Hook 机制之简单实战

 

可以发现这些方法最终都会调用到 mService 的相关方法。因此,ClipboardManager 的 mService 确实是一个可以 hook 的一个点。

hook ClipboardManager.mService 的实现

大概需要三个步骤

第一步:得到 ClipboardManager 的 mService

第二步:初始化动态代理对象

第三步:偷梁换柱,使用 proxyNotiMng 替换系统的 mService

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

第二种方法

对 Android 源码有基本了解的人都知道,Android 中的各种 Manager 都是通过 ServiceManager 获取的。因此,我们可以通过 ServiceManager hook 所有系统 Manager,ClipboardManager 当然也不例外。

Android Hook 机制之简单实战

 

老套路

第一步:通过反射获取剪切板服务的远程Binder对象,这里我们可以通过 ServiceManager getService 方法获得

第二步:创建我们的动态代理对象,动态代理原来的Binder对象

第三步:偷梁换柱,把我们的动态代理对象设置进去

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

手机开发阅读排行

最新文章