Android Hook技术实战详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。
👉点击跳转到教程

前言:
什么是Android Hook技术?

Android Hook技术是指在Android平台上通过修改、拦截或替换系统或应用程序的API、方法或行为,实现对系统或应用程序的定制和扩展的技术手段。

在Android系统中,应用程序和系统之间通过API进行交互。应用程序可以调用系统提供的API来实现各种功能。而通过Hook技术,我们可以修改或拦截这些API的行为,以达到修改系统或应用程序行为的目的。

在这里插入图片描述
下面实现一个简单的例子

1.首先定义MainActivity,在该类里面通过hook()方法,进行了Hook,具体注释已经在代码中给出

public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button = findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(MainActivity.this, "" + ((Button) view).getText(), Toast.LENGTH_SHORT).show();}});try {hook(button);} catch (Exception e) {e.printStackTrace();Toast.makeText(this, "Hook失败" + e.toString(), Toast.LENGTH_SHORT).show();}}/*** 在不修改以上代码的情况下,通过Hook把 ((Button) view).getText()内给修改** @param view view对象*/private void hook(View view) throws Exception {//之前的还是用户写的实现代码//为了获取ListenerInfo对象,需要执行这个方法 ListenerInfo getListenerInfo() ,才能拿到Class<?> viewClass = Class.forName("android.view.View");Method getListenerInfoMethod = viewClass.getDeclaredMethod("getListenerInfo");getListenerInfoMethod.setAccessible(true);//授权//执行方法Object listenerInfo = getListenerInfoMethod.invoke(view);//替换 public OnClickListener mOnClickListener; 替换为我们自己的Class<?> listenerInfoClass = Class.forName("android.view.View$ListenerInfo");Field mOnClickListenerField = listenerInfoClass.getField("mOnClickListener");Object mOnClickListenerObj = mOnClickListenerField.get(listenerInfo);//需要对象//1.监听onClick,当用户点击按钮的时候-->onClick,我们自己要先拦截这个事件,动态代理//第一个参数:类加载器//第二个参数:要监听的接口,监听什么接口,就返回什么接口//第三个参数:监听接口方法里面的回调Object onClickListenerProxy = Proxy.newProxyInstance(MainActivity.class.getClassLoader(), new Class[]{View.OnClickListener.class}, new InvocationHandler() {/*** void onClick(View v);** @param proxy* @param method onClick-->method* @param args View v  -->Object[] args* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//加入自己的逻辑Log.i(TAG, "拦截到了OnClickListener方法了");Button button = new Button(MainActivity.this);button.setText("同学们大家好...");//让系统片段,正常的执行下去return method.invoke(mOnClickListenerObj, button);}});//把系统的mOnClickListener,换成我们自己写的动态代理mOnClickListenerField.set(listenerInfo, onClickListenerProxy);}
}

实现效果如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/3302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.6 运维分类与工作内容

文章目录 运维分类与工作内容1. 系统运维2. 网络运维3. 数据库运维4. 应用运维5. 安全运维结论 运维分类与工作内容 运维&#xff08;Operations and Maintenance&#xff0c;简称O&M&#xff09;是信息技术领域中负责管理和维护企业的信息技术基础设施的重要职能。随着技…

Python爬虫学习笔记(八)————Phantomjs与Chrome handless

目录 1.Phantomjs &#xff08;1&#xff09;什么是Phantomjs&#xff1f; &#xff08;2&#xff09;如何使用Phantomjs&#xff1f; 2 .Chrome handless &#xff08;1&#xff09;系统要求&#xff1a; &#xff08;2&#xff09;配置&#xff1a; &#xff08;3&…

API例子:用Python驱动采集网页数据

1 引言 本文讲解怎样用Python驱动浏览器写一个简易的网页数据采集器。开源Python即时网络爬虫项目将与Scrapy&#xff08;基于twisted的异步网络框架&#xff09;集成&#xff0c;所以本例将使用Scrapy采集淘宝这种含有大量ajax代码的网页数据&#xff0c;但是要注意本例一个严…

matlab重名函数调用踩坑记录

我新安装了matlab的robotics toolbox&#xff0c;然而调用的rotx不是我想要的函数。 我上网查了一下资料&#xff0c;知乎和csdn有相关的回答&#xff0c;但是我试了一下还是不行。它们的方法是移除路径再添加路径避免函数的冲突。相关方法放在文末的相关参考1 2。这里建议先用…

VScode跑gtest

可能得前置步骤 VScode安装cpp: 安装 C/C 扩展&#xff1a;打开 VSCode 扩展市场&#xff0c;搜索「C/C」并安装扩展。 安装编译gtest 安装 Google Test&#xff1a; 如果你使用的是 Windows&#xff0c;可以下载并安装 pre-built 版本&#xff1b;如果你使用的是 Linux 或…

ETHERNET/IP转TCP/IP网关tcp/ip协议包含哪几层

大家好&#xff0c;今天我们将带大家了解一款自主研发的通讯网关&#xff0c;远创智控YC-EIP-TCP/IP。这是一个强大的工具&#xff0c;能帮助我们将ETHERNET/IP网络和TCP/IP网络连接在一起&#xff0c;让我们更好地管理和监控网络。 1, 首先&#xff0c;让我们来看看这款网关…

orbslam3 生成标定板rosrun kalibr kalibr_create_target_pdf --type

rosrun kalibr kalibr_create_target_pdf --type apriltag --nx 6 --ny 6 --tsize 0.08 --tspace 0.3小师妹要做相机视觉标定&#xff0c;需要制作棋盘格&#xff0c;无奈其电脑有些卡&#xff0c;对此毫无经验的博主从头开始安装&#xff08;此前博主已经安装了ROS环境&#x…

leetcode 965.单值二叉树

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;单值二叉树 思路&#xff1a; 让当前的根节点与左孩子节点与右孩子节点判断&#xff0c;若相等则继续向下分治&#xff0c;让左孩子与右孩子当作新的根节点继续判断&#xff0c;直到某个节点不相等。 1️⃣ 代码&#x…

用thinkphp6写一个博客系统,输出完整项目代码

很抱歉&#xff0c;我无法提供完整项目代码。但是&#xff0c;我可以为您提供一个简单的示例&#xff0c;以帮助您开始使用 ThinkPHP 6 构建博客系统。 环境准备&#xff1a;安装 PHP 和 Composer安装并配置一个适当的 Web 服务器&#xff08;如 Apache 或 Nginx&#xff09;创…

Gateway网关组件(在Spring Cloud整合Gateway(idea19版本))

Spring Cloud Gateway官网:Spring Cloud Gateway 局域网中就有网关这个概念&#xff0c;局域网接收数据或发送数据都要通过网关&#xff0c;比如使用VMware虚拟机软件搭建虚拟机集群的时候&#xff0c;往往我们需要选择IP段中的⼀个IP作为网关地址,网关可以对请求进行控制,提升…

【Linux系统】结合有趣的小故事让你学懂生产者消费者模型

目录 由故事引入模型故事背景供货商们的矛盾市民们和供货商之间的矛盾一市民们和供货商之间的矛盾二市民们的矛盾模型总结 生产者消费者模型为什么要使用生产者消费者模型&#xff1f;生产者消费者模型的特点生产者消费者模型优点 基于BlockingQueue的生产者消费者模型C queue模…

力扣 452. 用最少数量的箭引爆气球

题目来源&#xff1a;https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/ C题解1&#xff1a; 根据x_end排序&#xff0c;x_start小的在前&#xff0c;这样可以保证如果第 i 个球的x_end大于等于第 j 个球的x_start时&#xff0c;第 j 个球…

ElasticSearch文档(document)在index上的增删改查

文章目录 一、document定义&#xff1a;二、单条增删改查1、创建索引&#xff1a;2、添加文档&#xff1a;3、获取文档&#xff1a;4、更新文档&#xff1a;5、删除文档&#xff1a; 三、批量增删改查&#xff1a;1、批量添加文档&#xff1a;2、批量更新文档&#xff1a;3、批…

自建DNSlog服务器

DNSlog简介 在某些情况下&#xff0c;无法利用漏洞获得回显。但是&#xff0c;如果目标可以发送DNS请求&#xff0c;则可以通过DNS log方式将想获得的数据外带出来。 DNS log常用于以下情况&#xff1a; SQL盲注无回显的命令执行无回显的SSRF 网上公开提供dnslog服务有很多…

FactoryBean源码解析

文章目录 一、简介二、FactoryBean 接口的方法三、FactoryBean 与 BeanFactory 的区别四、源码解析五、实际应用 一、简介 FactoryBean 是 Spring 框架中的一个接口&#xff0c;用来创建特定类型的 Bean 对象。实现FactoryBean 接口就可以自定义 Bean 对象的创建过程。Factory…

利用ArcGIS Pro制作三维效果图

1、新建工程 打开Arcgispro,新建工程,这里我们要用到的模板为全局场景。 2、添加数据 这里添加的数据需要有一个字段内容是数值的,这个字段也是接下来要进行拉伸的字段。 3、高度拉伸 数据添加进来后,如下图所示,这时图层处于2D图层里。 这时我们点中该图层,回到菜单栏…

开放式蓝牙耳机推荐哪款?开放式蓝牙耳机排行榜推荐

​说到开放式耳机&#xff0c;想必很多人听着还是陌生&#xff0c;普通耳机久戴&#xff0c;会出现耳朵疼痛问题&#xff0c;而开放式蓝牙耳机没有&#xff0c;不入耳的设计更加的干净&#xff0c;不会对耳道造成的伤害&#xff0c;下面我给大家推荐几款很不错的开放式耳机&…

Jenkins的安装部署以及基本使用

前言&#xff1a; 今天有空大概记录的一个作为一个测试人员日常中Jenkins的使用。 一、环境准备 在安装使用Jenkins前我们要先安装jdk&#xff0c;这里博主选择的是jdk11。我们先删除旧的jdk然后安装全新的jdk。 1、先看下当前我们的jdk版本。 2、查看jdk安装路径&#xff1…

【Rust 基础篇】Rust 解引用多态

导言 在 Rust 中&#xff0c;解引用多态&#xff08;Deref Coercion&#xff09;是一种特性&#xff0c;它允许自动进行类型转换&#xff0c;将实现了 Deref trait 的类型转换为目标类型的引用。通过解引用多态&#xff0c;我们可以更方便地使用不同类型的智能指针和引用。 本…

rabbitmq延时队列自动解锁库存

一、库存服务自动解锁库存 使用了最终一致性来解决分布式事务 当order服务出现异常回滚&#xff0c;此时ware服务无法回滚&#xff0c;怎么办&#xff1f; 使用seata全局事务虽然能在order服务出现异常导致回滚时使其他服务的也能同时回滚&#xff0c;但在流量大的情况下是使用…