一、前言
Xposed可以对其它应用进行进行逆向分析及修改测试,本文简单记录下使用过程中对要点
二、关键点
1. 系统环境
首先需要一个root的手机,可以自己刷机,也可以买一个,或者使用第三方模拟器,Android Studio自带的模拟器也行,如果使用Android Studio自带的模拟器的话,只要不使用Google Play的镜像的话,其余镜像都是已经root的环境。然后再上面装上xposed环境,和面具。(这一步有难度,看一篇文章再进行记录)。
在AVD上安装面具和Xposed可以参考下面链接
Android 模拟器AVD上面安装面具magisk和Lsposed
xposed各个版本兼容的Android版本不同,这里可以参考以下链接
目前最活跃的版本是Lsposed框架,经常搜到的有段时间没更新了,下面是最新更新的框架
JingMatrix/LSPosed
然后使用Magisk进行管理,参考链接如下
怎么安装magisk和lsposed框架可以参考下面链接
LSPosed 安装教程
三、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/")
}
}
}