iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何进行Android Hook技术的实践
  • 178
分享到

如何进行Android Hook技术的实践

2023-06-04 23:06:29 178人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关如何进行Android Hook技术的实践,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概述在学习Android插件化的过程中有用到Hook相关技术,下文对Hoo

这篇文章将为大家详细讲解有关如何进行Android Hook技术的实践,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

概述

学习Android插件化的过程中有用到Hook相关技术,下文对Hook相关技术做也给简单的介绍,并写两个小Demo,当你了解了Hook之后可能会对你以后的碰到问题时多了一个解题思路

定义

如何进行Android Hook技术的实践

image.png

Hook单词的意思就是钩子,那我们在什么时候用到这个钩子呢,如上图所示,在一个事件或者动作执行的过程中,截获相关事件或者动作,加入自己的代码或者替换装自己的代理对象,这就叫Hook

Hook的原理

本文主要是采用java反射机制拿到要执行的对象或者方法就行修改或者替换

关注点:在hook的时候我们首先需要找到要Hook的对象,什么样的对象比较好Hook呢,那就是单例和静态变量,单例和静态变量在进程中不容易发生变化,相对容易被定位到,二普通象则比价容易发生变化(随时有可能被销毁),。我们根据这个原则找到所谓的Hook点

以上就是我对Hook的理解,且是还挺简单的,但实践是检验真理的唯一标准,下面我会写两个小Demo

Demo1

本例子Hook的是一个工具

public class PrintUtil {    private static IPrint colorPrint = new ColorPrint(); //彩色打印机    private static IPrint blackWhitePrint = new BlackWhitePrint(); //黑白打印机    public static void colorPrint(String content){        colorPrint.print(content);    }    public static void blackWhitePrint(String content){        blackWhitePrint.print(content);    }}

工具类如上

    private void operate4(){//        HookHelper.hookPrint();        PrintUtil.blackWhitePrint("黑白内容");        PrintUtil.colorPrint("彩色内容");    }

如何进行Android Hook技术的实践

image.png

正常结果如上 ,下面我们对PrintUtil进行hook ,首先我们先找Hook点,在PrintUtil中有两个静态变量,这就是我们要找的Hook点 具体代码如下

    public static void hookPrint(){        try {            Class<?> printClass = Class.forName("com.example.shiyagang.myapplication.util.PrintUtil");            Field colorPrintField= printClass.getDeclaredField("colorPrint");            Field blackWhitePrintField = printClass.getDeclaredField("blackWhitePrint");            colorPrintField.setAccessible(true);            blackWhitePrintField.setAccessible(true);            colorPrintField.set(null,new BlackWhitePrint());            blackWhitePrintField.set(null,new ColorPrint());        }catch (Exception e){            e.printStackTrace();        }    }

我们通过反射对PrintUtil的两个静态变量进行替换

替换完执行结果如下

如何进行Android Hook技术的实践

image.png

彩色打印机打出了黑白内容,我们成功了,嘿嘿

Demo2

这个例子我们在context.startActivity的调用链,找到相关的hook点进行替换。我们首先分下context.startActivity的流程,Context.startActivity其实走到了ContextImpl的startActivity

[图片上传中...(image-318cbb-1573653549464-1)]

<fiGCaption></figcaption>

如上图所示最终调用了ActivityThread类的mInstrumentation成员的execStartActivity方法;注意到,ActivityThread 实际上是主线程,而主线程一个进程只有一个,因此这里是一个良好的Hook点

  • 我们要拿到ActivityThread的mInstrumentation ,首先得拿到ActivityThread的实例

  • ActivityThread类里面有一个静态方法currentActivityThread可以帮助我们拿到ActivityThread的实例

通过以上步骤我们就能进行相关hook了

     public static void attachContext() throws Exception{        // 先获取到当前的ActivityThread对象        Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");        Method currentActivityThreadMethod = activityThreadClass.getDeclaredMethod("currentActivityThread");        currentActivityThreadMethod.setAccessible(true);        Object currentActivityThread = currentActivityThreadMethod.invoke(null);        // 拿到mInstrumentation  字段        Field mInstrumentationField = activityThreadClass.getDeclaredField("mInstrumentation");        mInstrumentationField.setAccessible(true);        Instrumentation mInstrumentation = (Instrumentation) mInstrumentationField.get(currentActivityThread);        // 创建代理对象        Instrumentation evilInstrumentation = new EvilInstrumentation(mInstrumentation);        // 偷梁换柱        mInstrumentationField.set(currentActivityThread, evilInstrumentation);    }

EvilInstrumentation的代理对象如下:

public class EvilInstrumentation extends Instrumentation {    private static final String TAG = EvilInstrumentation.class.getSimpleName();    // ActivityThread中原始的对象, 保存起来    Instrumentation mBase;    public EvilInstrumentation(Instrumentation base) {        mBase = base;    }    public ActivityResult execStartActivity(            Context who, IBinder contextThread, IBinder token, Activity target,            Intent intent, int requestCode, Bundle options) {        Log.e(TAG, "我们Hook了 Activity的启动流程");        try {            Method execStartActivity = Instrumentation.class.getDeclaredMethod(                    "execStartActivity",                    Context.class, IBinder.class, IBinder.class, Activity.class,                    Intent.class, int.class, Bundle.class);            execStartActivity.setAccessible(true);            return (ActivityResult) execStartActivity.invoke(mBase, who,                    contextThread, token, target, intent, requestCode, options);        } catch (Exception e) {            throw new RuntimeException("出问题了,去适配吧");        }    }}

下面我们看下Activity的代码 ,我们在attacHBaseContext中进行Hook

private void operate3(){        Intent intent = new Intent(getApplicationContext(),SecondActivity.class);        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        getApplicationContext().startActivity(intent);    }    @Override    protected void attachBaseContext(Context newBase) {        super.attachBaseContext(newBase);        try {            // 在这里进行Hook            HookHelper.attachContext();        } catch (Exception e) {            e.printStackTrace();![整合资料.jpg](https://upload-images.jianshu.io/upload_images/3117364-779ed9dc78882285.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)        }    }

如何进行Android Hook技术的实践

image.png

入上图所示我们已经成功了,我们在这只是打印了一个日志,当然你可以干任何事情

关于如何进行Android Hook技术的实践就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何进行Android Hook技术的实践

本文链接: https://www.lsjlt.com/news/240384.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何进行Android Hook技术的实践
    这篇文章将为大家详细讲解有关如何进行Android Hook技术的实践,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概述在学习Android插件化的过程中有用到Hook相关技术,下文对Hoo...
    99+
    2023-06-04
  • Android Hook技术实战详解
    前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 前言: 什么是Android Hook...
    99+
    2023-09-03
    android Hook 反射 动态代理 view
  • Android中的HOOK技术是什么
    目录1. 什么是 Hook2. Hook的应用场景3. Hook的技术方式或框架4. Hook的一般步骤和技巧实战1. 什么是 Hook Hook 英文翻译过来就是「钩子」的意思,那...
    99+
    2023-02-17
    Android HOOK技术 Android HOOK框架
  • 如何进行ADO.NET检索技术压缩技术
    这篇文章主要介绍如何进行ADO.NET检索技术压缩技术,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!下面进行对ADO.NET检索技术解压缩文件时,通常将代码解压缩到每一章所在的文件夹中。在解压缩的过程中,应确保解压缩...
    99+
    2023-06-17
  • 如何进行SequoiaDB + JanusGraph的实践
    如何进行SequoiaDB + JanusGraph的实践,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JanusGraph 实...
    99+
    2024-04-02
  • PHP中如何进行Docker技术的应用?
    随着云计算和容器化技术的发展,Docker已经成为了现代应用程序开发和交付的重要工具。Docker是一种轻量级的容器技术,它可以将应用程序打包成一个独立的容器,可以在任何支持Docker的环境中运行,而不受底层操作系统的影响。在PHP应用程...
    99+
    2023-05-14
    Docker 应用 PHP
  • 如何进行Elasticsearch调优实践
    今天给大家介绍一下如何进行Elasticsearch调优实践。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。背景Elasticsearch(ES)作为NOSQL...
    99+
    2023-06-05
  • 如何进行红帽OpenShift技术解析
    今天就跟大家聊聊有关如何进行红帽OpenShift技术解析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。红帽软件公司资深解决方案架构师蔡书是开源软件和解决方案的爱好者,技术上崇尚简单...
    99+
    2023-06-16
  • 如何进行Zabbix 宏变量的实践
    本篇文章为大家展示了如何进行Zabbix 宏变量的实践,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、.宏介绍        宏是一种抽...
    99+
    2023-06-06
  • 如何进行SAP S4CRM和C4C的技术比较
    如何进行SAP S4CRM和C4C的技术比较,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。部署方式这一差异显而易见,本地部署和云端部署的区别导致了表格里其他比较项目的差异。...
    99+
    2023-06-04
  • 如何进行SAP SD定价技术分析
    小编今天带大家了解如何进行SAP SD定价技术分析,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“如何进行SAP SD定价技术分析”的...
    99+
    2023-06-04
  • 如何在Python中进行图形界面设计和开发的最佳实践和技术选择
    如何在Python中进行图形界面设计和开发的最佳实践和技术选择引言:随着计算机技术的高速发展,图形界面成为了人机交互的主要方式之一。作为一种编程语言,Python也提供了丰富的工具和库用于图形界面设计和开发。本文将介绍在Python中进行图...
    99+
    2023-10-22
    开发 Python 图形界面设计
  • 如何进行Rails和Django的深度技术对比
    这篇文章将为大家详细讲解有关如何进行Rails和Django的深度技术对比 ,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。我想以一个免责声明来开始下面的内容。我使用Django开发网站已经有...
    99+
    2023-06-17
  • 如何快速进行MySQL到DB2的技术转型?
    如何快速进行MySQL到DB2的技术转型?在现代企业中,数据库是关键的数据存储和管理工具。随着企业数据规模的不断增加和业务的发展,有时需要将数据库从一种类型转换到另一种类型。本文将探讨如何快速进行MySQL到DB2的技术转型,并提供一些代码...
    99+
    2023-10-22
    技术转型 MySQL DB
  • SpringBoot如何进行对象复制的实践
    目录为什么需要对象复制对象复制工具类推荐Orika基本使用引入依赖Orika工具类使用文档TC1,基础实体映射TC2,实体映射-字段转换TC3,基础集合映射TC4,集合映射-字段映射...
    99+
    2024-04-02
  • 如何在Python中进行数据可靠性传输和备份的最佳实践和技术选型
    如何在Python中进行数据可靠性传输和备份的最佳实践和技术选型引言:在现代信息时代,数据的可靠性传输和备份非常重要。无论您是管理一个大型数据库系统,还是处理用户上传的文件,您都需要确保数据在传输过程中不会丢失或损坏,并且在发生意外情况时有...
    99+
    2023-10-22
    数据备份 容错 冗余 数据可靠性传输 可恢复
  • 如何进行etcd集群运维实践
    本篇文章为大家展示了如何进行etcd集群运维实践,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。etcd 是 Kubernetes 集群的数据核心,最严重的情况是,当...
    99+
    2024-04-02
  • 如何进行MySQL高可用各个技术的比较
    这篇文章将为大家详细讲解有关如何进行MySQL高可用各个技术的比较,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。数据库的可靠指的是数据可靠;数据库可用指的是...
    99+
    2024-04-02
  • 如何进行JavaScript设计模型Iterator的实践
    今天就跟大家聊聊有关如何进行JavaScript设计模型Iterator的实践,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所...
    99+
    2024-04-02
  • 如何进行VPS中三种虚拟技术的比较
    如何进行VPS中三种虚拟技术的比较,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。很多人看到同样配置的VPS价格相差很大,甚是不理解,其实VPS使用的虚拟技术种类有很多,如Ope...
    99+
    2023-06-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作