• Android 系统API HOOK


    https://blog.csdn.net/lazyer_dog/article/details/77719365

    API层面的hook是android hook技术中比较入门的一种,根据hook点选择的不同,能实现很多强大的功能,比如hook掉框架层的某些系统类达到不可思议的效果。

    hook主要技术点:

    1.寻找合适的hook点。

    这一点其实是最难的,我们要根据需求,分析系统源码寻找到合适的hook点。一般hook点都是找单例,静态变量,这样hook起来简单,方便一些。

    2.代理。

    代理的作用是改变原始方法。

    3.反射。

    用发射技术截取到原始类,替换为我们修改后的代理类。


    简单来说,hook就是通过反射,将原始方法(类)替换为我们增强后的代理方法(类),这样就达到了我们“不可告人”的操作。


    下面举个例子,hook框架层比较复杂,比如hook剪切板改变复制的内容啊,拦截startActivity改变跳转页面这种,我们来弄个简单的,hook 控件的点击事件。


    第一步,寻找hook点:

    android 中所有的控件都继承自View类,点击事件的监听器也都在View的ListenerInfo中的mOnClickListener,那么我们的hook点就找到了,View中ListenerInfo的mOnClickListener。


    第二步,实现我们的代理类:

    public class ClickListenerProxy implements View.OnClickListener{
    
    View.OnClickListener onClickListener;
    
    public ClickListenerProxy(View.OnClickListener onClickListener) {
    this.onClickListener = onClickListener;
    }
    
    @Override
    public void onClick(View v) {
    LogUtil.i("hi,before onClick "+v.getId());
    onClickListener.onClick(v);
    LogUtil.i("hi,after onClick "+v.getId());
    }
    }

    这个代理类实现的功能是在点击事件执行前后各输出了一条日志。

    第三步,使用反射替换成我们的代理点击类:

    public static void hookClickListener(View view){
    try {
    Class<?> aClass = Class.forName("android.view.View");
    Method getListenerInfo = aClass.getDeclaredMethod("getListenerInfo");
    getListenerInfo.setAccessible(true);
    Object listenerInfo = getListenerInfo.invoke(view);
    
    Class bClass = Class.forName("android.view.View$ListenerInfo");
    Field fieldOnClickListener = bClass.getDeclaredField("mOnClickListener");
    fieldOnClickListener.setAccessible(true);
    View.OnClickListener onClickListener = (View.OnClickListener) fieldOnClickListener.get(listenerInfo);
    fieldOnClickListener.set(listenerInfo,new ClickListenerProxy(onClickListener));
    } catch (Exception e) {
    LogUtil.i(e);
    }
    }

    第六行拿到了ListenerInfo对象,第十一行拿到原始的OnClickListener,第十二行完成原始类与代理的替换。

  • 相关阅读:
    【BOM】浏览器对象模型
    【版本管理】自定义git
    【版本管理】多人协作及标签管理
    【版本管理】git分支管理
    【版本管理】git远程管理
    待补的坑
    pip下载如何加速
    2017ICPC南宁M The Maximum Unreachable Node Set (偏序集最长反链)
    Petrozavodsk Winter-2018. AtCoder Contest. Problem I. ADD, DIV, MAX 吉司机线段树
    Codeforces 1221F Game With String 思维题
  • 原文地址:https://www.cnblogs.com/sunupo/p/16438575.html
Copyright © 2020-2023  润新知