首页 > 其他分享 >Xpose框架使用

Xpose框架使用

时间:2024-08-17 18:08:07浏览次数:8  
标签:框架 lpparam XC void param hook Xpose 使用 方法

前置知识

  • ROOT手机并安装了xpose框架
  • 安卓开发基础知识

环境依赖配置

settings.gradle

设置Xposed仓库的网址

dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() maven { url 'https://api.xposed.info/' } // 添加这一行即可 } }

build.gradle.kts

设置相关依赖

dependencies { compileOnly 'de.robv.android.xposed:api:82' // compileOnly 'de.robv.android.xposed:api:82:sources' // 不要导入源码,这会导致idea无法索引文件,从而让语法提示失效 }

新版本使用
compileOnly("de.robv.android.xposed:api:82")

添加文件assets/xposed_init

设置模块推荐的应用

内容如下

<resources> <string-array name="xposedscope" >
<!-- 这里填写模块的作用域应用的包名,可以填多个。 --> <item>me.kyuubiran.xposedapp</item> 
</string-array> </resources>

程序编写

IXposedHookLoadPackage接口

在 Xposed 中,要创建一个可以加载和运行的模块,需要实现一个特定的接口 IXposedHookLoadPackage。这个接口定义了一个方法 handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam),当一个应用程序被加载时,这个方法就会被调用。

handleLoadPackage()方法

public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam)

当 Xposed 模块被加载并且应用程序被加载时,该方法就会被调用。其中lpparam 参数是 Xposed 框架中非常重要的一个参数,它包含了应用程序被加载时的相关信息。

在 handleLoadPackage() 方法中,我们需要传入这个 lpparam 参数,它是 XC_LoadPackage.LoadPackageParam 类型的对象。这个对象包含了以下重要的信息:

  1. packageName: 当前应用程序的包名。
  2. processName: 当前应用程序的进程名。
  3. classLoader: 当前应用程序的 ClassLoader 对象,用于加载类和方法。
  4. appInfo: 当前应用程序的 ApplicationInfo 对象,包含了应用程序的各种属性信息。
  5. isFirstApplication: 标识是否为当前进程的第一个应用程序。
public class MainHook implements IXposedHookLoadPackage {  
  
    @Override  
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {  
        // 过滤不必要的应用  
        if (!lpparam.packageName.equals("me.kyuubiran.xposedapp")) return;  
        // 执行Hook  
  
        hook(lpparam);  
    }

我们一般会在handleLoadPackage方法中检验是否是我们想要的程序。

XposedHelpers.findAndHookMethod()方法

XposedHelpers.findAndHookMethod(
    String className,
    ClassLoader classLoader,
    String methodName,
    Object... parameterTypesAndCallback
)
  1. String className: 要 hook 的类的全限定名。
  2. ClassLoader classLoader: 用于加载目标类的 ClassLoader 对象。通常使用 lpparam.classLoader
  3. String methodName: 要 hook 的方法名。
  4. Object... parameterTypesAndCallback: 这是一个可变参数列表,包含以下内容:
    • 目标方法的参数类型。可以是 Class<?> 对象或基本数据类型的 Class 对象,如 int.classString.class 等。
    • 最后一个参数必须是 XC_MethodHook 类型的回调对象。

但同时你可以直接实例化后,再进行一个对应的传递。

XposedHelpers.findAndHookMethod()一般是用来定位我们想要劫持的方法。

private void hook(XC_LoadPackage.LoadPackageParam lpparam) {  
    // 它有两个重载,区别是一个是填Class,一个是填ClassName以及ClassLoader  
    // 第一种 填ClassName  
    XC_MethodHook.Unhook unhook = XposedHelpers.findAndHookMethod("me.kyuubiran.xposedapp.MainActivity",    // className  
            lpparam.classLoader,    // classLoader 使用lpparam.classLoader  
            "onCreate",             // 要hook的方法  
            Bundle.class,           // 要hook的方法的参数表,如果有多个就用逗号隔开   
new XC_MethodHook() {   // 最后一个填hook的回调  
                @Override  
                protected void beforeHookedMethod(MethodHookParam param) {} // Hook方法执行前    
@Override  
                protected void afterHookedMethod(MethodHookParam param) {} // Hook方法执行后  
            });  
    // 它返回一个unhook 在你不需要继续hook的时候可以调用它来取消Hook  
    unhook.unhook();    // 取消空的Hook   
    // 第二种方式 填Classxz
    // 首先你得加载它的类 我们使用XposedHelpers.findClass即可 参数有两个 一个是类名 一个是类加载器  
    Class<?> clazz = XposedHelpers.findClass("me.kyuubiran.xposedapp.MainActivity", lpparam.classLoader);  
    XposedHelpers.findAndHookMethod(clazz, "onCreate", Bundle.class, new XC_MethodHook() {  
        @Override  
        protected void afterHookedMethod(MethodHookParam param){  
            // 由于我们需要在Activity创建之后再弹出Toast,所以我们Hook方法执行之后  
            Toast.makeText((Activity) param.thisObject, "模块加载成功!", Toast.LENGTH_SHORT).show();  
        }  
    });  
}

如果你学过java反射,以上代码对你来说应该是很简单的。

XC_MethodHook()使用

XC_MethodHook 是 Xposed 框架中用于 hook 方法的一个重要类。它提供了两个关键的回调方法:beforeHookedMethod() 和 afterHookedMethod()

  • protected void beforeHookedMethod(MethodHookParam param) {}

    • 这个方法会在目标方法执行之前被调用。
    • MethodHookParam param 对象包含了目标方法的相关信息,比如:
      • param.args: 目标方法的参数列表,可以在这里修改参数。
      • param.method: 被 hook 的目标方法对象。
      • param.thisObject: 目标方法所属类的实例对象。
      • param.getResult(): 如果是构造函数,可以获取新创建的对象。
    • 在这里我们可以执行一些预处理逻辑,比如修改参数、记录日志、阻止方法执行等。
  • protected void afterHookedMethod(MethodHookParam param) {}

    • 这个方法会在目标方法执行之后被调用。
    • MethodHookParam param 对象包含了目标方法的相关信息,比如:
      • param.getResult(): 获取目标方法的返回值。
      • param.hasThrowable(): 判断目标方法是否抛出了异常。
      • param.getThrowable(): 获取目标方法抛出的异常对象。
    • 在这里我们可以执行一些后处理逻辑,比如修改返回值、记录日志、处理异常等。

我们一般会在XC_MethodHook()中去书写我们具体的逻辑

XposedHelpers.findAndHookMethod(
    "com.example.targetapp.TargetClass",
    lpparam.classLoader,
    "targetMethod",
    String.class, int.class,
    new XC_MethodHook() {
        @Override
        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
            // 在目标方法执行之前执行的逻辑
            String originalArg = (String) param.args[0];
            XposedBridge.log("Before calling targetMethod() with arg: " + originalArg);

            // 修改参数
            param.args[0] = "modified argument";
        }

        @Override
        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
            // 在目标方法执行之后执行的逻辑
            boolean result = (boolean) param.getResult();
            XposedBridge.log("After calling targetMethod(), result: " + result);

            // 修改返回值
            param.setResult(true);
        }
    }
);

标签:框架,lpparam,XC,void,param,hook,Xpose,使用,方法
From: https://www.cnblogs.com/Ho1dF0rward/p/18364742

相关文章

  • 使用 Python和 SQLite 打造一个简单的数据库浏览器
    在日常开发中,我们常常需要快速查看和操作SQLite数据库中的数据。虽然有许多现成的工具可以完成这一任务,但有时你可能想要一个更为简单、可定制的解决方案。在这篇博客中,我将带你一步步构建一个简单的SQLite数据库浏览器,它可以用来列出数据库中的表名、查看表的字段名、编写S......
  • 【Azure Logic App】使用Event Hub 连接器配置 Active Directory OAuth 认证无法成功
    问题描述使用LogicApp服务,创建EventHub触发的Workflow。根据以下信息配置EventHub连接器的ActiveDirectoryOAuth认证方式:AuthenticationType选择“ActiveDirectoryOAuth”FullyQualifiedNamespace输入目标EventHubNamespace的HostName,如myehnamespace.serv......
  • Java数据库框架设计
    什么是ORM?ORM(Object-RelationalMapping)表示对象关系映射。在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中。只要有一套程序能够做到建立对象与数据库的关联,操作对象就可以直接操作数据库数据,就可以说这套程序实现了ORM对象关系映射简单的说:ORM就是建立实体......
  • vue使用高德获取当前地区天气
    1、收件箱|高德控制台(amap.com) 首先打开高德开放平台注册一下2、创建一个应用获取到key后面获取天气的时候 请求接口的时候会用到key 2.1.1创建应用的时候注意类型选成天气   2.1.2创建完成之后就点添加key然后选择web服务就行3、可以调取天气接口天......
  • 使用RAG-Chroma和LangChain构建强大的问答系统
    标题:使用RAG-Chroma和LangChain构建强大的问答系统内容:使用RAG-Chroma和LangChain构建强大的问答系统引言在人工智能和自然语言处理领域,检索增强生成(Retrieval-AugmentedGeneration,RAG)技术正在迅速崛起。本文将介绍如何使用RAG-Chroma模板和LangChain框架构建......
  • 基于flask+vue框架的基于mybatis的医用器械管理系统[开题+论文+程序]-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着医疗技术的飞速发展,医用器械在医疗机构中的重要性日益凸显。然而,传统的手工或简单信息系统管理方式已难以满足现代医院对器械管理的高......
  • 基于flask+vue框架的基于B_S架构的兰州市旅游网站的设计与实现[开题+论文+程序]-计算
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网的飞速发展和普及,旅游业作为全球经济的重要支柱之一,正经历着前所未有的变革。兰州市,作为甘肃省的省会城市,不仅拥有丰富的历史文......
  • 基于flask+vue框架的车辆理赔系统[开题+论文+程序]-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着汽车保有量的持续增长,车辆事故频发,车辆保险理赔成为保险公司和车主共同关注的焦点。传统的车辆理赔流程繁琐、效率低下,涉及多方沟通、......
  • 基于flask+vue框架的基于uniapp的酒店订房系统的设计与实现[开题+论文+程序]-计算机毕
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展和普及,智能手机已成为人们日常生活中不可或缺的一部分,移动应用(App)以其便捷性、实时性等特点,深刻改变着人们......
  • Java中使用lambda表达式自定义排序
    对于一维数组,通常使用Arrays.sort()(默认升序)int[]nums={3,1,4,2};Arrays.sort(nums);对于二维数组,可以lambda表达式实现特定的排序要求。在Arrays.sort()的第二个参数中,写lambda表达式lambda表达式形如(a,b)->{returna-b;},其中a,b表示数组中的元素升序/......