文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android Hook技术实战详解

2023-09-03 22:03

关注

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

前言:
什么是Android Hook技术?

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

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

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

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

public class MainActivity extends AppCompatActivity {    private static final String TAG = "MainActivity";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button button = findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public 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();        }    }        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() {                                        @Override                    public 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);    }}

实现效果如下:

在这里插入图片描述

来源地址:https://blog.csdn.net/lu202032/article/details/131754789

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯