文章目录

  • 1 Hook概述
  • 2 Hook技术分类
  • 3 Hook技术原理
  • 3.1 Hook技术实现途径
  • 3.2 Hook技术之免注册式跳转
  • 3.3 Java层hook如何寻找hook点


1 Hook概述

说到 Hook 技术得先提到逆向工程,逆向工程源于商业及军事领域中的硬件分析,其
主要目的是在不能轻易获得必要的生产信息的情况下,直接从成品分析,推导出产品的设计原理。逆向分析分为静态分析和动态分析,其中静态分析指的是一种在不执行程序的情况下对程序行为进行分析的技术;动态分析是指在程序运行时对程序进行调试的技术。Hook 技术就属于动态分析,它不仅在 Android 平台中被应用,早在 Windows 平台中就已经被应用了。

android hook 内核版本 android hook原理_android hook 内核版本


图:Hook 的调用和回调


Hook 可以是一个方也或者一个对象,它像一个钩子一样挂在对象 A 和对象 B 之间,当对象 A 调用对象 B 之前做一些处理(比如修改方陆的参数和返回值),起到了“欺上瞒下”的作用,与其说 Hook 是钩子,不如说是劫持来的更贴切些。我们知道应用程序进程之间是彼此独立的,应用程序进程和系统进程之间也是如此 ,想要在应用程序进程更改系统进程的某些行为很难直接实现,有了 Hook 技术,我们就可以在进程间进行行为更改,如下图所示。

android hook 内核版本 android hook原理_hook_02


可以看到 Hook 可以将自己融入到它所要劫持的对象(对象 B)所在的进程中,成为系

统进程的一部分,这样我们就可以通过 Hook 来更改对象 B 的行为。被劫持的对象(对象B ),称作 Hook 点,为了保证 Hook 的稳定性, Hook 点一般选择容易找到并且不易变化的对象,静态、变量和单例就符合这一条件。

2 Hook技术分类

Hook 技术知识点比较多 ,因此 Hook 技术根据不同的角度会有很多种分类,这里介绍
其中的三种分类。


根据 Hook 的 API 语言划分,分为 Hook Java 和 Hook Native 。

  • Hook Java 主要通过反射和代理来实现,应用于在 SDK 开发环境中修改 Java 代码 。
  • Hook Native 则应用于在 NDK 开发环境和系统开发中修改 Native 代码。

根据 Hook 的进程划分,分为应用程序进程 Hook 和全局 Hook。

  • 应用程序进程 Hook 只能 Hook 当前所在的应用程序进程。
  • 应用程序进程是 Zygote 进程 fock 出来的,如果对 Zygote 进行 Hook,就可以实现
    Hook 系统所有的应用程序进程,这就是全局 Hook 。

根据 Hook 的实现方式划分,分为如下两种。

  • 通过反射和代理实现,只能 Hook 当前的应用程序进程。
  • 通过 Hook 框架来实现,比如 Xposed,可以实现全局 Hook ,但是需要 root 。

3 Hook技术原理

3.1 Hook技术实现途径

  • 第一 :找到hook点
  • 第二 :找到hook方法
  • 第三 :将hook方法放到系统之外执行 ?

3.2 Hook技术之免注册式跳转

何实现钩子函数呢(钩子函数也称为hook函数)

1 利用系统内部提供的接口,通过实现该接口,然后注入进系统(特定场景) 不适用

2 动态代理 (所有场景)

3.3 Java层hook如何寻找hook点

使用反射hook java层。

两点:

  • 1 hook点
    hook的方法所在的对象一定是静态,这样才能还原系统的对象。
  • 2 如何插入hook的自己的逻辑