您现在的位置是:主页 > Web前端技术 > Web前端技术

如何进行Android Hook技术的实践移动开发

IDCBT2022-01-12服务器技术人已围观

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

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

概述

在学习Android插件化的过程中有用到Hook相关技术,下文对Hook相关技术做也给简单的介绍,并写两个小Demo,当你了解了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("彩色内容");
    }


image.png

正常结果如上 ,下面我们对PrintUtil进行hook ,首先我们先找Hook点,在PrintUtil中有两个静态变量,这就是我们要找的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();
        }
    }

标签:

很赞哦! ()

本栏推荐