Android 中的hook技术是什么


前言

Android 的hook 是Android 在开发过程中会存在的两种模式,一种是native 模式,另一种是java 模式,所以我们也可以理解成,Android 平台上的hook 分为两种,一种是java 层级的hook,一种是native 层级的hook,两种模式下,通常都是通过使用JNI 机制来进行调用。对于大多数开发者而言,能够在java 曾经完成的事,基本上也不会在native 层去完成。


一、hook 技术到底是什么

hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序先捕捉该消息,钩子函数先得到控制权,这时钩子函数即可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是把系统的程序拉出来,变成我们自己执行的代码片段。

要实现hook 技术,有两个步骤:

  1. 利用系统内部提供的接口,通过实现接口,然后注入进系统(特定场景下使用)
  2. 动态代理(所有场景)

二、hook 技术的实现

hook 其实就是将自身代码”融入“被钩住(hook)的程序进程中,成为目标进程的一部分。在Android 系统中使用了沙盒机制,普通用户程序的进程空间都是独立的,程序的运行彼此间都不受干扰。根据hook 对象与hook 后处理的事件不同,hook也分为不同的种类,有需要的可以去了解一下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0HBTQbQq-1668675062675)(/Users/tiger/Library/Application Support/typora-user-images/image-20221117162807449.png)]

从上图我们也可以看出,hook 技术的实现,也分为两个步骤:

  1. 找到hook 点,该hook 必须满足以下条件:
    • 需要hook 的方法,所属的对象必须是静态的,因为我们是通过动态反射来获取对象的,我们获取的是系统的对象,所以不能够new 出一个对象,必须用系统的那个对象,所以只有静态的才能保证和系统的对象一致。
  2. 将hook 方法放到系统之外执行(就是图中我们自己的函数实现逻辑操作)

总结

hook 的原理其实就是劫持函数的调用,改变目标函数的指向,原理看起来并不复杂,但是实现起来却不是那么简单,我们需要思考两个问题

  • 如何注入代码(hook点的选择和切入)
  • 如何注入动态链接库 (让目标调用我们的动态链接库)

猜你喜欢

转载自blog.csdn.net/u010755471/article/details/127907168