Hook技术看这篇就够了
相信很多搞机的朋友都玩过Xposed, 它实现了很多不可思议的功能。它是怎么实现的呢?这里就得提到我们的Hook技术了。
关于 Android 中的 Hook 机制,大致有两个方式:
- 要 root 权限,直接 Hook 系统,可以干掉所有的 App。
- 免 root 权限,但是只能 Hook 自身,对系统其它 App 无能为力。
时间所限,这里不展开了。
知识点:
- 反射
- 动态代理
今天主要讲的是利用hook技术,将点击事件劫持,做点啥呢?你可以随意,我这里是将双击给屏蔽了。免得点击过快打开多个界面。
1、寻找Hook点
这一步比较关键,也是个难点。Android中主要是依靠分析系统源码类来做到的,首先我们得找到被Hook的对象,我称之为Hook点;什么样的对象比较好Hook呢?自然是容易找到的对象。什么样的对象容易找到?静态变量和单例;在一个进程之内,静态变量和单例变量是相对不容易发生变化的,因此非常容易定位,而普通的对象则要么无法标志,要么容易改变。我们根据这个原则找到所谓的Hook。
去看setOnClickListener里面做了什么?
public void setOnClickListener(@Nullable OnClickListener l) {if (!isClickable()) {setClickable(true);}getListenerInfo().mOnClickListener = l;}
ListenerInfo getListenerInfo() {if (mListenerInfo != null) {return mListenerInfo;}mListenerInfo = new ListenerInfo();return mListenerInfo;}
看完了上面,就能猜到我们设置的Listener最终是被赋值给ListenerInfo的mOnClickListener成员了,ListenerInfo的实例可以说是信息的载体,那么很简单,只要把mOnClickListener,在ListenerInfo中还有mOnLongClickListener,mOnFocusChangeListener两个成员,分别对应了长按事件与焦点变化事件,所以处理长按事件与焦点变化事件与此类似。
public class HookViewClickUtil {public static HookViewClickUtil getInstance() {return UtilHolder.mHookViewClickUtil;}private static class UtilHolder {private static HookViewClickUtil mHookViewClickUtil = new HookViewClickUtil();}public static void hookView(View view) {try {Class viewClazz = Class.forName("android.view.View");//事件监听器都是这个实例保存的Method listenerInfoMethod = viewClazz.getDeclaredMethod("getListenerInfo");if (!listenerInfoMethod.isAccessible()) {listenerInfoMethod.setAccessible(true);}Object listenerInfoObj = listenerInfoMethod.invoke(view);Class listenerInfoClazz = Class.forName("android.view.View$ListenerInfo");Field onClickListenerField = listenerInfoClazz.getDeclaredField("mOnClickListener");if (!onClickListenerField.isAccessible()) {onClickListenerField.setAccessible(true);}View.OnClickListener mOnClickListener = (View.OnClickListener) onClickListenerField.get(listenerInfoObj);//自定义代理事件监听器View.OnClickListener onClickListenerProxy = new OnClickListenerProxy(mOnClickListener);//更换onClickListenerField.set(listenerInfoObj, onClickListenerProxy);} catch (Exception e) {e.printStackTrace();}}//自定义的代理事件监听器private static class OnClickListenerProxy implements View.OnClickListener {private View.OnClickListener object;private int MIN_CLICK_DELAY_TIME = 1000;private long lastClickTime = 0;private OnClickListenerProxy(View.OnClickListener object) {this.object = object;}@Overridepublic void onClick(View v) {//点击时间控制long currentTime = Calendar.getInstance().getTimeInMillis();if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {lastClickTime = currentTime;Log.e("OnClickListenerProxy", "OnClickListenerProxy");if (object != null) object.onClick(v);}}}
}
使用起来也是非常简单,首先在MainActivity的View渲染完毕的时候进行注入,即在 getWindow().getDecorView().post()中。
public class MainActivity extends Activity {private Button btn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final View btn = findViewById(R.id.btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.e("MainActivity","Button 被点击了");}});getWindow().getDecorView().post(new Runnable() {@Overridepublic void run() {HookViewClickUtil.hookView(btn);}});}
}
原文出处:https://blog.csdn.net/u013263323/article/details/55094822
Hook技术看这篇就够了相关推荐
- React入门看这篇就够了
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所 ...
- [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了
园子里关于ASP.NET Core Web API的教程很多,但大多都是使用EF+Mysql或者EF+MSSQL的文章.甚至关于ASP.NET Core Web API中使用Dapper+Mysql组 ...
- 史上最全!用Pandas读取CSV,看这篇就够了
导读:pandas.read_csv接口用于读取CSV格式的数据文件,由于CSV文件使用非常频繁,功能强大,参数众多,因此在这里专门做详细介绍. 作者:李庆辉 来源:大数据DT(ID:hzdashuj ...
- Spring Cloud入门,看这篇就够了!
点击▲关注 "中生代技术" 给公众号标星置顶 更多精彩 第一时间直达 概述 首先我给大家看一张图,如果大家对这张图有些地方不太理解的话,我希望你们看完我这篇文章会恍然大悟. 什 ...
- Docker入门实战看这篇就够了(最新详细以及踩过的坑)
Docker入门实战看这篇就够了 前言 初识 是什么 容器与虚拟机 能干什么 去哪玩 安装 先决条件 查看自己的内核 安装所需的软件包(支持devicemapper存储类型) 设置镜像的仓库 设置yu ...
- Java String,看这篇就够了
String,是Java中最重要的类.这句肯定的推断不是Java之父詹姆斯·高斯林说的,而是沉默王二说的,因此你不必怀疑它的准确性. 关于字符串,有很多的面试题,但我总觉得理论知识绕来绕去没多大意思. ...
- Cookie、Session、Token、JWT 看一篇就够了
目录 Cookie.Session.Token.JWT 看一篇就够了 什么是认证(Authentication) 什么是授权(Authorization) 什么是凭证(Credentials) 怎么让 ...
- [个人向]超快速了解微信小程序:看这篇就够了!(注册、语言、框架、配额等简要说明)
[个人向]超快速了解微信小程序看这篇就够了+相关简要说明 本文精炼微信小程序开发文档相关内容,旨在对初次接触并准备开发小程序的童鞋(比如自己)提供一个快速了解攻略.其中包括注册相关.语言.框架模式.相 ...
- Java应用系统监控看这篇就够了
Java应用系统监控看这篇就够了 文章目录 业务背景 系统监控发展历程 技术方案 日志监控技术方案 Grafana+阿里云SLS日志服务 分布式链路追踪技术方案 阿里云jaeger方案 开源框架sky ...
- 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了【ZT帅地】2020-3-7
https://blog.csdn.net/m0_37907797/article/details/104029002 由于文章有点多,并且发的文章也不是一个系列一个系列发的,不过我的文章大部分都是围 ...
最新文章
- DFS:深入优先搜索 POJ-2386 Lake Counting
- 【企业管理】14 项管理原则
- POJ2195 Going Home 最小费用最大流
- 查询score中选学多门课程的同学中分数为非最高分成绩的记录。
- tensorflow中的log中数字的含义
- Centos7装NVIDIA显卡驱动(GPU)
- HDU5971【瞎搞】
- Windows 10重装系统时,提示Windows只能安装到GPT磁盘的解决方法(更新于2021.4.28)
- 计算机表演赛vr创意大赛,计算机表演赛新增VR创意大赛
- java开发app的缺点_App原生开发的优缺点有哪些
- Confluence 6 Windows 中以服务方式自动重启修改运行服务的用户
- linux 查看端口占用命令 亲测可用
- 2010全国导游大赛总决赛现场调试及比赛抓图
- 去除WINRAR的广告
- Java白皮书的关键术语
- 【vuejs】有关UI框架“ydui”中的倒计时组件的使用
- Vision MLP(MLP-Mixer,RepMLP,ResMLP,gMLP,aMLP)
- AT91SAM9260开发板
- matlab泰勒展开样例,MATLAB绘图样例
- Linux 服务器进行安全加固,防止黑客攻击