代码编织梦想

ApoloPlugin

ApoloPlugin 是一个 Android轻量级的java hook 库,它支持 arm32 和 arm64两种架构。Apolo意为阿波罗,其为艺术之神,Art翻译过来也有艺术之意,故以此命名

特性

  • 支持Android8.1 - Android12
  • 支持armeabi-v7a以及arm64-v8a
  • 不支持声明为abstract、interface、native等特殊函数hook
  • 支持调用原方法
  • 无需将ArtMethod解释执行,性能损耗较小
  • 兼容JIT/AOT模式

了解接口函数并上手

接口函数可以在仓库ApoloPlugin module找到,目前只提供了Java版本
示例代码可以在app module中找到

1.加载核心so库,初始化hook引擎

public class DemoApplication extends Application {
    private static Application sApp;
    @Override
    public void onCreate() {
        super.onCreate();
        //init ArtHook
        ArtHook.preLoad();
    }
}

hook引擎中会绕过hiddenApi检测,该处参考了RePublic。所以调用preLoad之后,您无须担心hiddenApi问题。

2.获取原函数Method以及代理函数Method

比如hook ApplicationPackageManager.getInstalledPackages函数, 您首先需要通过反射拿到该函数的Method实例,然后声明一个static函数作为代理函数。

注意: 1)原函数声明为static,那么代理函数的参数类型均与原函数保持一致,对象类型也可简单使用Object表示。2)原函数非static,那么代理函数的第一个参数类型必须是对象类型,其余参数与原函数保持一致

    public static void startHookOnlyOnce() {
        try {
            //1. get origin-method -> ApplicationPackageManager.getInstalledPackages(int flags)
            Class<?> class_ApplicationPackageManager = Class.forName("android.app.ApplicationPackageManager");
            Method method_getInstalledPackages = class_ApplicationPackageManager
                    .getDeclaredMethod("getInstalledPackages", int.class);

            //2. get proxy-method -> MainActivity.getInstalledPackages
            Method proxyMethod_getInstalledPackages = MainActivity.class.getDeclaredMethod("proxy_getInstalledPackages",
                    PackageManager.class, int.class);

            //3. startHook
            HashMap<Method, Method> proxyMethods = new HashMap<>();
            proxyMethods.put(method_getInstalledPackages, proxyMethod_getInstalledPackages);
            ArtHook.startHook(proxyMethods);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3.一切就绪,开始hook

上述2中的代码示例已提及,非常简单。只需要将origin-method与proxy-method配对,并放入HashMap中,然后调用ArtHook.startHook即可

4.调用原函数

下面的示例函数分为三个步骤,第二步为调用原函数。第一步以及第三步均调用了ArtHook.hookTransition,切记不能省略,否则会导致死循环。

注意: 如果您在第二步中,有大量逻辑代码,如果该处逻辑中有直接或者间接调用某一个被hook的函数,那么它将不会被代理,直到您调用hookTransition(false)为止。

所以,您可以简单的将hookTransition理解为hook状态切换:

  1. true:状态切换为origin,该线程取消hook.
  2. false: 状态切换为hook,该线程将进行相关函数代理.
    public static List<PackageInfo> proxy_getInstalledPackages(PackageManager pm, int flags) {
        ...
        ...
        try {
            //1.disable proxy method so that you can call origin-method
            ArtHook.hookTransition(true);

            //2.call origin method
            List<PackageInfo> pkgInfos = pm.getInstalledPackages(flags);

            ...
            ...

            return Collections.emptyList();

        } finally {
            //3.enable proxy method
            ArtHook.hookTransition(false);
        }
    }

声明

由于各种原因,ApoloPlugin只开放出来了armeabi-v7a版本,后续会将该仓库持续优化,稳定后开放核心源码

愿景

1.广大需求爱好者可以尽情提出想法,热烈欢迎

2.愿大家多提issue

3.欢迎提交代码

个人简介

@WaxMoon android framework/hook爱好者,2015年入坑

个人QQ3403281183

ArtHook交流群

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_70819702/article/details/124707941

android插件化:从入门到放弃-爱代码爱编程

引言 先简单介绍一下Android插件化。很早之前已经有公司在研究这项技术,淘宝做得比较早,但淘宝的这项技术一直是保密的。直到2015年才陆续出现很多框架,Android插件化分成很多技术流派,实现的方式都不太一样。我今天的主题就是,Android插件化的不同流派、不同思想,以及做插件化需要掌握哪些知识。 今天分享的题目是“从入门到放弃”

2017 android插件化框架总结_麦晓宇的博客-爱代码爱编程

文章目录 引言发展历史基础类库主流框架 0 引言 先简单介绍一下Android插件化。很早之前已经有公司在研究这项技术,淘宝做得比较早,但淘宝的这项技术一直是保密的。直到2015年才陆续出现很多框架,Androi

java字节码插桩修改hibeaver(结合asm,实现hook需求、轻量级aop、无埋点统计上报等),javassist_邓文(desaco)的博客-爱代码爱编程

Java汇编指令- https://segmentfault.com/a/1190000008606277 一次Android字节码插桩实战- https://segmentfault.com/a/1190000008658815 Android字节码修改神器HiBeaver:黑掉你的SDK- https://segmentfault.com/a/1190

android面试之百题经典android答案——cookie,session,jni,aidl,binder,classloader,ams,wms,pws,热更新,插件化,hook,dex-爱代码爱编程

一、Activity生命周期 实际面试中可能会以实例形式出现,比如:启动A,再从A启动B,请描述各生命周期 二、Activity的启动模式 Activity的启动模式有4种,分别是Standard、SingleTop、SingleTask、SingleInstance Standard模式:这种模式下,Activity可以有多个实例,每次启动A

【AOP】一个轻量级Android AOP框架Lancet介绍-爱代码爱编程

注:本文来自github的lancet框架的官方文档,仅做学习转载 来源:饿了么github 原文地址:https://github.com/eleme/lancet/edit/master/README_zh.md Lancet 是一个轻量级Android AOP框架。 编译速度快, 并且支持增量编译.简洁的 API, 几行 Java 代码完成注入需

java 轻量级插件化框架_轻量级插件化框架——Small-爱代码爱编程

photo-1441716844725-09cedc13a4e7.jpg 前言 世界那么大,组件那么小。Small,做最轻巧的跨平台插件化框架。 ——Galenlin 这是Small作者,林光亮老师,给Small一句概括。 今年6月份,我和同事Simon奔赴北京参加 GMTC全球移动技术大会2016。当时Galenlin给大家介绍了Smal

Android字节码替换方法,滴滴开源 DroidAssist : 轻量级 Android 字节码编辑插件-爱代码爱编程

出品 | 滴滴技术 作者 | 江义旺 前言:近日,滴滴发布的开源项目 DroidAssist ,提供了一种简单易用、无侵入、配置化、轻量级的 Java 字节码操作方式,只需要在 XML 配置中添加简单的 Java 代码即可实现编译期对 Class 文件的动态修改。 DroidAssist 和其他 AOP 方案不同,它提供了一种简单易用、无侵入

Android字节码编辑器,滴滴开源 DroidAssist : 轻量级 Android 字节码编辑插件-爱代码爱编程

出品 | 滴滴技术 作者 | 江义旺 ▍前言 近日,滴滴发布的开源项目 DroidAssist ,提供了一种简单易用、无侵入、配置化、轻量级的 Java 字节码操作方式,只需要在 XML 配置中添加简单的 Java 代码即可实现编译期对 Class 文件的动态修改。 DroidAssist 和其他 AOP 方案不同,它提供了一种简单易用、无侵

android mvp mvvm ppt,还在用 MVP?快来试试 MVVM! Relight:轻量级 MVVM 框架-爱代码爱编程

优势 稳定 减少内存泄漏:新手很容易在线程切换的地方写出导致内存泄漏的代码,但如果把线程切换交给框架来做,出错的概率就大大降低。 减少 crash:根据我的开发经历,大部分 crash 都是空指针导致的。一般线程回调里最容易出现问题,当UI销毁后,子线程依旧去操作UI,容易导致 crash。 本框架有完善的生命周期,UI销毁后,框架对子线程做

android 开源框架mvvm,relight: A light MVVM framework for Android. 一个轻量级的安卓MVVM框架...-爱代码爱编程

优势 稳定 减少内存泄漏:新手很容易在线程切换的地方写出导致内存泄漏的代码,但如果把线程切换交给框架来做,出错的概率就大大降低。 减少 crash:根据我的开发经历,大部分 crash 都是空指针导致的。一般线程回调里最容易出现问题,当UI销毁后,子线程依旧去操作UI,容易导致 crash。 本框架有完善的生命周期,UI销毁后,框架对子线程做

安装使用Frida在Android上进行hook-爱代码爱编程

前言 我们对Android应用进行hook最常用的就是Xposed,它相对来说更加完善,而且有强大的社区和丰富的插件。而Frida则于Xposed不同,它是一款轻量级的Hook框架,可用于多平台,相同的是它依然需要root环境。本文就以Android为例来详细说说如何安装并使用它。 PC端 首选要在电脑上安装Frida,官方的安装步骤是 pip i

android 自定义控件之 RecyclerView 打造万能 ViewPager TabLayout-爱代码爱编程

TabLayoutNiubility 项目地址:AnJiaoDe/TabLayoutNiubility  简介: Android 自定义控件之 RecyclerView 打造万能 ViewPager TabLayout(仿今日头条 Tab 滑动、Tab 多布局、indicator 蠕动、自定义 indicator、文字颜色渐变、自定义 Fragme

Android AOP 编程实践 javapoet + autoService-爱代码爱编程

什么是AOP? AOP面向切面编程,就是在代码预编译阶段,在不修改源代码的情况下,给程序添加某一功能。 像成熟的框架,ARouter,ButterKnife等也都使用了这个技术。任何技术的出现都有其实际应用场景,为了解决某一方面的痛点。AOP的出现让某些功能组件的封装更加解耦,使用者能够更加的方便的使用组件里的功能。 拿ButterKnife举例,我

自定义view、viewgroup浅析_自定义view 方法跟自定义viewgrouponmeasure区别-爱代码爱编程

自定义View过程 自定义View关键点:onMeasure()、onDraw() onMeasure 该函数目的是测量View宽高属性,虽然在xml中制定了View宽高,但当设置为wrap_content或match