一、什么是Hook 技术

Android 程序有一套特有的事件分发机制,都是按既定程序从前往后执行的。Hook 技术就是利用反射和代理,在既定程序中插入我们自己写的程序。比如,我们想在某个View的点击事件中添加播放音乐的效果。控件的点击事件,分发流程都是系统已经写好了,这时我们怎么做到在其中插入我们的播放音乐的效果呢?

二、如何寻找Hook点

1.尽量选择静态变量和单例对象,因为一旦创建对象,他们不容易变化,非常容易定位。
2.尽量Hook public的对象和方法

三、Hook过程

选中到了合适的Hook点后,选择合适的代理方式,如果是接口就可以用动态代理,然后偷梁换柱,用代理对象替换原始对象。

四、Hook View的点击事件

先看看View 点击事件的源码

  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;
}

由代码可以看出,我们正常设置进去的OnClickListener是保存在ListenerInfo里面的。
如果我们可以通过反射将这个ListenerInfo里面的mOnClickListener 替换成我们自定义的OnClickListener是不是就可以实现我们目的了。接下来我们试试!
先看看通过反射修改对象属性的API

field.set(Object obj, Object value)
  • field是我们要修改的变量的属性,也就是mOnClickListener
  • obj就是要修改的对象,就是ListenerInfo
  • value就是要替换mOnClickListener 的新值

接下来围绕准备这几个变量,我们来写代码

 private void hookOnClickListener(View view) {try {// 得到待hook view 的 ListenerInfo 对象Method getListenerInfo = View.class.getDeclaredMethod("getListenerInfo");getListenerInfo.setAccessible(true);Object listenerInfo = getListenerInfo.invoke(view);// 得到 原始的 mOnClickListener 对象Class<?> listenerInfoClz = Class.forName("android.view.View$ListenerInfo");Field mOnClickListener = listenerInfoClz.getDeclaredField("mOnClickListener");mOnClickListener.setAccessible(true);View.OnClickListener originOnClickListener = (View.OnClickListener) mOnClickListener.get(listenerInfo);// 用自定义的 hookedOnClickListener 替换原始的 mOnClickListenerView.OnClickListener hookedOnClickListener = new HookOnClickListener(originOnClickListener);mOnClickListener.set(listenerInfo, hookedOnClickListener);} catch (Exception e) {Log.d(TAG, "hook clickListener failed!: ");}}

自定义的HookOnClickListener

 class HookOnClickListener implements View.OnClickListener {private View.OnClickListener origin;HookOnClickListener(View.OnClickListener origin) {this.origin = origin;}@Overridepublic void onClick(View v) {Log.d(TAG,"执行点击事件之前");if (origin != null) {origin.onClick(v);}Log.d(TAG,"执行点击事件之后");}}

在MainActivity中的使用

 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tvHook = findViewById(R.id.tv_hook);tvHook.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.d(TAG,"tvHook 的点击事件");}});hookOnClickListener(tvHook);}

点击tvHook 看看输出结果

/com.example.hook D/MainActivity: 执行点击事件之前
/com.example.hook D/MainActivity: tvHook 的点击事件
/com.example.hook D/MainActivity: 执行点击事件之后

看到这里我们已经成功Hook到了View的点击事件

五、Hook注意点

Android 的API版本比较多,各个厂家也对系统有不同程度的定制,所以类和方法有可能不太一样,这就要求我们做好兼容。

Android Hook技术的简单实现相关推荐

  1. android hook技术教学视频,[科普向]hook技术简单介绍

    首先 1.  这只是科普向,会介绍相关Hook技术及原理,但是不会给源码.源码请自行百度 2.请至少有一点Windows编程经验,知道系统API是什么...以免看科普内容给您带来不适 3.这里结合了一 ...

  2. opengl源码 实现无缝切换图片过场_手把手讲解 Android hook技术实现一键换肤

    前言 产品大佬又提需求啦,要求app里面的图表要实现白天黑夜模式的切换,以满足不同光线下都能保证足够的图表清晰度. 怎么办?可能解决的办法很多,你可以给图表view增加一个toggle方法,参数Str ...

  3. 浅谈android hook技术

    前言 在测试android过程中,能对函数进行hook能帮助更加深入的进行测试,本文简单介绍了hook框架xposed和frida,从简单的小例子做了简单的演示,算是自己的学习的过程,是个入门的过程. ...

  4. android hook 第三方app_【MiSRC】技术分享-浅谈android hook技术

    注:本文为"小米安全中心"原创,转载请联系"小米安全中心" 前言 xposed框架 xposed,主页:http://repo.xposed.info/modu ...

  5. Android hook技术实现一键换肤,移动应用开发项目案例

    3. 利用HOOK技术实现优雅的"一键换肤" 什么是hook **如题,我是用hook实现一键换肤.那么什么是hook? hook,钩子. 安卓中的hook技术,其实是一个抽象概念 ...

  6. Android Hook技术

    1. 什么是 Hook Hook 英文翻译过来就是「钩子」的意思,那我们在什么时候使用这个「钩子」呢?在 Android 操作系统中系统维护着自己的一套事件分发机制.应用程序,包括应用触发事件和后台逻 ...

  7. wegame一键蹲替换文件_手把手讲解 Android hook技术实现一键换肤

    前言 产品大佬又提需求啦,要求app里面的图表要实现白天黑夜模式的切换,以满足不同光线下都能保证足够的图表清晰度. 怎么办?可能解决的办法很多,你可以给图表view增加一个toggle方法,参数Str ...

  8. Android Hook技术防范漫谈

    背景 当下,数据就像水.电.空气一样无处不在,说它是"21世纪的生产资料"一点都不夸张,由此带来的是,各行业对于数据的争夺热火朝天.随着互联网和数据的思维深入人心,一些灰色产业悄然 ...

  9. android hook技术-Xposed框架 帮你轻松应对支付宝2016晒账单

    一.支付宝2016年账单. 最近几天微信朋友圈充斥着各式的支付宝2016账单,对于程序员屌丝来说打开发现年度消费9W+,和他们动辄十几万的消费没得比,细看更有80%的消费还都是还信用卡,顿时万念俱灰啊 ...

  10. android hook截取其他程序的按钮事件_Hook技术

    概述 Hook,英文直译是"钩子"的意思.在程序中将其理解为"劫持"可能会更好理解,我们可以通过hook技术来劫持某个对象,从而控制它与其他对象的交互. Hoo ...

最新文章

  1. 挑战“IT我最大 Win7由你秀”
  2. DIY敷脸亲身示范做法 - 生活至上,美容至尚!
  3. C语言之归并排序算法
  4. Apache状态监测集重启
  5. 你会在C#的类库中添加web service引用吗?
  6. leetcode306. 累加数(回溯)
  7. exfat为什么不适合机械硬盘_为什么有人说小排量车不适合跑高速,多少排量的车适合?...
  8. java weblogic多数据源,039 在weblogic下部署jndi的多数据源
  9. zookeeper、hadoop、hbase单机伪分布式环境搭建(虚拟机vmware)
  10. fmin在Matlab中,MATLAB-fminsearch函数的使用
  11. selenium webdriver——鼠标事件
  12. Java开发团队管理细则
  13. 【带权并查集详解】以HDU 3038为例【How Many Answers Are Wrong】
  14. SQL Server2008安装详细教程
  15. (python)GA(遗传算法)优化LSTM神经网络(亲测成功,速度慢)
  16. jmeter接口压力测试详解
  17. 【摩尔吧今日推荐】我们一定要给自己提出这样的任务:第一,学习,第二是学习,第三还是学习。
  18. 74HC595使用方法
  19. java助理工程师主要做什么工作,Java助理工程师面试的惨痛教训
  20. 如何让溢出的文字省略号显示

热门文章

  1. fences卸载_【设置方法】win10系统卸载fences的学习
  2. 卸载WPS后office文档图标不能正常显示和WPS网盘图标无法删除
  3. 冲刺倒计时,复习核心是什么?
  4. stearm计算机验证码,steam账户名称怎么取,值得收藏
  5. PyTorch安装及试用 基于Anaconda3
  6. 清华大学迎来中国首个原创虚拟学生华智冰:智商、情商双高,颜值出众
  7. OKR组织敏捷目标和绩效管理第二课 O、KR和案例讲解
  8. 3.5mm 音频接口类型说明
  9. secureCRT查看日志命令
  10. Ifconfig网络配置工具详解(from fixdown.com)