美文网首页
Hook详解

Hook详解

作者: 至上小王子 | 来源:发表于2018-03-28 17:50 被阅读0次

写在前面

hook(钩子),通常是指对一些方法进行拦截。这样当这些方法被调用时,也能够执行我们自己的代码,从而达到监控或更改代码逻辑的目的。

实现方式

方式一、Java 反射实现Hook:

这种方式是最常见的,也是各种框架常采用的一种方式,直接上例子:

   /**
     * 利用Hook的方式修复Toast在7.1系统上BadTokenException
     * Created by conghongjie on 2018/3/28.
     */
   public class ToastCompat extends Toast{

        private static final String TAG = "ToastCompat";

        public ToastCompat(Context context) {
            super(context);
        }

        @Override
        public void show() {
            if(Build.VERSION.SDK_INT==Build.VERSION_CODES.N_MR1){
                tryToHack();
            }
            super.show();
        }

        private void tryToHack(){
            try {
                Object mTN=getFieldValue(this,"mTN");
                if(mTN!=null){
                    Object rawHandler=getFieldValue(mTN,"mHandler");
                    if(rawHandler!=null){
                        //替换为封装后的mHandler
                        setFieldValue(rawHandler,"mCallback",new InternalHandlerCallback((Handler)rawHandler));
                    }
                }
            }catch (Throwable e){
                e.printStackTrace();
            }
        }

        private class InternalHandlerCallback implements Handler.Callback{
            private final Handler mHandler;
            public InternalHandlerCallback(Handler mHandler) {
                this.mHandler = mHandler;
            }
            @Override
            public boolean handleMessage(Message msg) {
                try {
                    // 捕获BadTokenException
                    mHandler.handleMessage(msg);
                }catch (BadTokenException e) {
                   e.printStackTrace();
                }
                return true;
            }
        }
    }

总结一下,此方法的实现思路:

  • 找到需要Hook方法的系统类(最好是单例的情况)

  • 利用java的动态代理这个系统类

  • 使用反射的方法把这个系统类替换成你的动态代理类

方式二、更改方法体的内存指向:

相关文章

  • Hook详解

    写在前面 hook(钩子),通常是指对一些方法进行拦截。这样当这些方法被调用时,也能够执行我们自己的代码,从而达到...

  • Win7 x64鼠标键盘锁(SDK)

    曾经,学习孙鑫老师的《VC++深入详解》时,接触到了钩子HOOK原理,一度对HOOK技术特别感兴趣,便自然而然产生...

  • iOS 如何实现Aspect Oriented Programm

    (接上篇) 五. Aspects hook过程详解 先看看函数调用栈的情况 从调用栈可以看出,Aspects ho...

  • Android Inline Hook 详解

    前言 网上有几篇关于Android inline hook的文章,这篇尤其不错,还有对应的示例代码。为了方便调试看...

  • Android Inline Hook详解

    Hook Hook在Android系统的应用根据框架层次可以分为两类,Java层和Native层,常见的实现方式如...

  • React Hook用法详解(6个常见hook)

    1、useState:让函数式组件拥有状态 用法示例: PS:class组件中this.setState更新是st...

  • React Effect Hook用法详解

    useEffect简介 useEffect,字面意思可以理解为"执行副作用操作",对比于以前react class...

  • 堆利用的手法:

    malloc_hook realloc_hook+free_hook free_hook unsorted_bin...

  • hook原理小结

    常用的hook方式主要有导入表hook、导出表hook和inline hook三种。 一,导入表hook 首先需要...

  • 常用油猴Hook插件

    hook cookie hook 过debugger

网友评论

      本文标题:Hook详解

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