什么是Hook

作者: 奔跑吧李博 | 来源:发表于2021-06-27 13:06 被阅读0次
Hook是什么?

Hook 又叫“钩子”,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行融入。

这样当这些方法被调用时,也就可以执行我们自己的代码,这也是面向切面编程的思想(AOP)。

示例:Hook 修改 View.OnClickListener 事件

点击事件的方法:

将OnClickListener对象赋予给了ListenerInfo对象的mOnClickListener。

    public void setOnClickListener(@Nullable OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        getListenerInfo().mOnClickListener = l;
    }

    @UnsupportedAppUsage
    ListenerInfo getListenerInfo() {
        if (mListenerInfo != null) {
            return mListenerInfo;
        }
        mListenerInfo = new ListenerInfo();
        return mListenerInfo;
    }

ListenerInfo类是View的抽象内部类,声明了View的各种事件listener,而我们要找的mOnClickListener就在其中。

    static class ListenerInfo {

        @UnsupportedAppUsage
        ListenerInfo() {
        }
        protected OnFocusChangeListener mOnFocusChangeListener;

        private ArrayList<OnLayoutChangeListener> mOnLayoutChangeListeners;

        protected OnScrollChangeListener mOnScrollChangeListener;

        public OnClickListener mOnClickListener;

        protected OnLongClickListener mOnLongClickListener;

        private OnKeyListener mOnKeyListener;

        private OnTouchListener mOnTouchListener;

        private OnHoverListener mOnHoverListener;

        private OnDragListener mOnDragListener;
实现思路:

1.利用反射获取 ListenerInfo 对象
2.获取原始的 OnClickListener事件方法
3.用 Hook代理类 替换原始的 OnClickListener

代码实现:

首先去创建自己需要hook的类:

class MyClickListener implements View.OnClickListener {
    private View.OnClickListener onClickListener;

    public MyClickListener(View.OnClickListener onClickListener) {
        this.onClickListener = onClickListener;
    }

    @Override
    public void onClick(View v) {
        Toast.makeText(v.getContext(), "系统OnClickListener已经被我替换啦", Toast.LENGTH_SHORT).show();

        onClickListener.onClick(v);
    }
}

去实现偷梁换柱功能:

public class HookHelper {

    public static void hookOnClickListener(View view) throws Exception {
        Method getListenerInfo = View.class.getDeclaredMethod("getListenerInfo");  //获取getListenerInfo方法
        getListenerInfo.setAccessible(true);

        Object mListenerInfo = getListenerInfo.invoke(view);  //执行完getListenerInfo方法即可返回ListenerInfo对象

        //去得到原始OnClickListener
        Class<?> aClass = Class.forName("android.view.View$ListenerInfo");
        Field mOnClickListener = aClass.getDeclaredField("mOnClickListener");
        mOnClickListener.setAccessible(true);
        View.OnClickListener originOnClickListener = (View.OnClickListener) mOnClickListener.get(mListenerInfo);//从ListenerInfo中获取原始OnClickListener类对象

        View.OnClickListener hookClickListener = new MyClickListener(originOnClickListener);

        mOnClickListener.set(mListenerInfo, hookClickListener); //将原始的onClickListener替换成自己的
    }
}

最后用一个textView测试结果:

        findViewById<TextView>(R.id.textView).apply {
            setOnClickListener {  }

            HookHelper.hookOnClickListener(this) 
        }
参考:

Android Hook 机制之简单实战

相关文章

  • Windows Hook

    Hook 关于Hook 1.1什么是Hook 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可...

  • 什么是Hook

    Hook是什么? Hook 又叫“钩子”,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行...

  • React hook 10种 Hook

    React hook 10种 Hook (详细介绍及使用) React Hook是什么?React官网是这么介绍的...

  • Hook

    Hook 是什么?Hook 是一个特殊的函数,它可以让你“钩入” React 的特性。 什么时候用 Hook?使用...

  • git hook

    git hook https://git-scm.com/docs/githooks 什么是git hook g...

  • Section8.2. Environment Options

    hook是个什么东西?干什么用的? exercise/pre-hook = {code} (initially e...

  • 什么是HOOK技术

    HOOK技术:在windows系统下编程,应该会接触到api函数的使用,常用的api函数大概有2000个左右。今天...

  • iOS逆向0011--HOOK(一)-原理

    一、HOOK概述 HOOK(钩子) 其实就是改变程序执行流程的一种技术的统称! 一、什么是钩子hook 二、钩子的...

  • 我们为什么要拥抱React Hook

    首先,让我们谈谈什么是react hook。先剖出官方解释: Hook 是 React 16.8 的新增特性。它可...

  • 插件化—Hook-代理

    1.什么是Hook? hook英文翻译为钩子。简单来说,hook技术就是劫持应用程序本要执行的对象或者方法,将其替...

网友评论

    本文标题:什么是Hook

    本文链接:https://www.haomeiwen.com/subject/cxpiyltx.html