Xposed的使用

一、前言

Xposed可以对其它应用进行进行逆向分析及修改测试,本文简单记录下使用过程中对要点

二、关键点

1. 系统环境

首先需要一个root的手机,可以自己刷机,也可以买一个,或者使用第三方模拟器,Android Studio自带的模拟器也行,如果使用Android Studio自带的模拟器的话,只要不使用Google Play的镜像的话,其余镜像都是已经root的环境。然后再上面装上xposed环境,和面具。(这一步有难度,看一篇文章再进行记录)。
在AVD上安装面具和Xposed可以参考下面链接
Android 模拟器AVD上面安装面具magisk和Lsposed
xposed各个版本兼容的Android版本不同,这里可以参考以下链接

安装 Xposed

目前最活跃的版本是Lsposed框架,经常搜到的有段时间没更新了,下面是最新更新的框架
JingMatrix/LSPosed

然后使用Magisk进行管理,参考链接如下

Magisk中文网

怎么安装magisk和lsposed框架可以参考下面链接
LSPosed 安装教程

三、xposed模块编写

可以参考下面链接
Xposed模块编写学习
Xposed快速上手(上)模块编写

Xposed模块开发入门保姆级教程

其实整体上文档都大同小异,实在不行,可以借助chatgpt进行学习。不过编写完后,如何启动大部分没有详细说。
编写完启动xposed模块后,会在lsposed框架中显示,这时候,需要勾选以下的应用,并进行启动
请添加图片描述
其中最上面的模块HookTest是自己编写的模块,MyApplication是要测试的模块,系统框架勾选上。然后重启手机,启动后,在重新运行要测试的应用。即可看到预期结果。

四、示例代码

1. hook核心代码

MainHook.kt

package com.hook.test

import android.util.Log
import de.robv.android.xposed.IXposedHookLoadPackage
import de.robv.android.xposed.XC_MethodHook
import de.robv.android.xposed.XposedBridge
import de.robv.android.xposed.XposedHelpers
import de.robv.android.xposed.callbacks.XC_LoadPackage

class MainHook : IXposedHookLoadPackage {
    override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam?) {
        // 过滤不必要的应用
        XposedBridge.log("XposedHook: 处理应用: ${lpparam?.packageName}")
        Log.d("XposedHook","应用包名:${lpparam?.packageName}")
        if (!lpparam?.packageName.equals("com.application.my")) return;
        // 执行Hook
        hook(lpparam!!)
    }

    private fun hook(lpparam: XC_LoadPackage.LoadPackageParam) {
        // 具体流程
        // Hook目标类的方法
//        val targetClass = XposedHelpers.findClass(
//            "com.application.my.App",
//            lpparam.classLoader
//        )

        // Hook方法并获取返回值
        XposedHelpers.findAndHookMethod(
            "com.application.my.App",
            lpparam.classLoader,
            "hookTest",  // 方法名
            object : XC_MethodHook() {
                override fun beforeHookedMethod(param: MethodHookParam) {
                    // 方法调用前的处理
//                    val arg1 = param.args[0] as String
//                    val arg2 = param.args[1] as Int
//                    Log.d("XposedHook", "方法被调用,参数: $arg1, $arg2")
                }

                override fun afterHookedMethod(param: MethodHookParam) {
                    // 获取方法返回值
                    val result = param.result
                    Log.d("XposedHook", "方法返回值: $result")

                    // 可以修改返回值
                    // param.result = "修改后的值"
                }
            }
        )
    }

}

AndroidManifest.xml

<!-- 是否为Xposed模块 -->
        <meta-data
            android:name="xposedmodule"
            android:value="true"/>
        <!-- 模块的简介(在框架中显示) -->
        <meta-data
            android:name="xposeddescription"
            android:value="我是Xposed模块简介" />
        <!-- 模块最低支持的Api版本 一般填54即可 -->
        <meta-data
            android:name="xposedminversion"
            android:value="54"/>
        <!-- 模块作用域 -->
        <meta-data
            android:name="xposedscope"
            android:resource="@array/xposedscope"/>

arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="xposedscope" >
        <!-- 这里填写模块的作用域应用的包名,可以填多个。 -->
        <item>com.application.my</item>
    </string-array>
</resources>

assets/xposed_init

com.hook.test.MainHook

app/build.gradle.kts

compileOnly("de.robv.android.xposed:api:82")

<rootPath>settings.gradle.kts

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven {
            setUrl("https://api.xposed.info/")
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值