Android 进阶答疑:Hook

Android 进阶答疑:Hook,第1张

概述接下来深海会和大家逐步分享分析Android插件化相关的东西要了解插件化首先要具备三个前提条件:1.Android系统源码阅读于理解2.Java反射机制3.Hook技术今天咱们就一起分析Hook的相关知识一.Hook是什么?   在事件执行的过程中截获并监控事件的执行流,将自身的代码融入

接下来深海会和大家逐步分享分析AndroID插件化相关的东西

要了解插件化首先要具备三个前提条件:

1.AndroID 系统源码阅读于理解

2.Java 反射机制

3.Hook技术

今天咱们就一起分析Hook的相关知识

一.Hook是什么?

      在事件执行的过程中截获并监控事件的执行流,将自身的代码融入其执行流中

二.简单举例: Hook 修改 VIEw.OnClickListener 事件

首先阅读系统类VIEw的源码,找到Hook点击事件的关键代码

看点击事件的方法:这边传入的事件赋给了ListenerInfo对象的mOnClickListener接口实例

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

追溯该方法:该方法返回了ListenerInfo对象

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

然后整理结构:

得出Hook路线:

1.拿到VIEw对象中的mListenerInfo对象

2.然后拿到mOnClickListener接口实例

3.对该实例进行二次封装后替换该实例

具体实现代码:
/* *作者:赵星海 *时间:2020/6/23 9:51 *用途:Hook简单举例(VIEw点击事件) */public static voID hookOnClickListener(VIEw vIEw) throws Exception {        // 第一步:反射得到 ListenerInfo 对象        Method getListenerInfo = VIEw.class.getDeclaredMethod("getListenerInfo");        getListenerInfo.setAccessible(true);        Object ListenerInfo = getListenerInfo.invoke(vIEw);        // 第二步:得到原始的 OnClickListener事件方法        Class<?> ListenerInfoClz = Class.forname("androID.vIEw.VIEw$ListenerInfo");        FIEld mOnClickListener = ListenerInfoClz.getDeclaredFIEld("mOnClickListener");        mOnClickListener.setAccessible(true);        VIEw.OnClickListener originonClickListener = (VIEw.OnClickListener) mOnClickListener.get(ListenerInfo);        // 第三步:用 Hook代理类 替换原始的 OnClickListener        VIEw.OnClickListener hookedOnClickListener = new HookedClickListener(originonClickListener);        mOnClickListener.set(ListenerInfo, hookedOnClickListener);    }    public static class HookedClickListener implements VIEw.OnClickListener {        private VIEw.OnClickListener origin;        public HookedClickListener(VIEw.OnClickListener origin) {            this.origin = origin;        }        @OverrIDe        public voID onClick(VIEw v) {            // Toast.makeText(v.getContext(), "你的点击事件被赵星海劫持了!", Toast.LENGTH_SHORT).show();            if (origin != null) {                origin.onClick(v);            }        }    }

好了今天的分享就到这里哦,关于上诉内容,有任何的疑惑或者建议欢迎评论区沟通交流哦~

深海特别愿意和大家一起互相学习互相进步
 

 

 

总结

以上是内存溢出为你收集整理的Android 进阶答疑:Hook全部内容,希望文章能够帮你解决Android 进阶答疑:Hook所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1059324.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存