栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

一个轻量级的安卓JavaHook插件

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一个轻量级的安卓JavaHook插件

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 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 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 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交流群

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/877948.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号