一、简介
前面我们已经刷入了Magisk面具去获取Root权限,这次我们要刷入Xposed框架
简单介绍下Xposed框架
Xposed 是国外大牛开发的一个工具,Xposed通过拦截安卓程序运行过程来达到修改程序行为的目的。
不需要修改安卓源文件,而是通过分析程序运行来拦截并影响运行情况。
注意:
第一次刷入LSPosed框架,建议大家删除面具里已经刷好的全部模块,特别是XP框架或者太极模块,多个模块一起运行,很可能直接翻车无限重启。
二、步骤
2.1 下载
Xposed框架现在由国内开发者开发了,名字是LSPosed,地址Releases · LSPosed/LSPosed (github.com)
点击该地址,我们可以看到有两个压缩包
官方提供了2个运行环境供我们选择,分别为riru版本和zygisk版本。
两者环境的LSPosed使用起来没什么区别,只有是对运行环境存在要求。
我们推荐大家使用zygisk版本的LSPosed框架,兼容和日用更广泛。
这里我们选择下载zygisk版本的zip
下载完后,将zip包放入到设备的Download目录
2.2 打开zygisk
当我们打开Magisk可以看到,Zygisk显示的是"否",想要安装zygisk版本的Xposed,就需要我们把这个打开
点击右上角设置——>Zygisk选项打开——>重启
2.3 安装Xposed
- 打开Magisk面具
- 点击底部栏的模块
- 点击从本地安装
- 选择zygisk版本的Xposed压缩包
- 安装完成后点击重启
重启之后,如果在下拉状态栏有如下通知则表明安装成功了
三、简单使用教程
有了LSP,就可以对任意应用包括系统进行hook了,我们写一个LSP模块,劫持Activity启动逻辑,打印个日志。
我们了解下LSP模块的概念:
LSP模块是一个APK,就和我们平时开发的APK一样,区别是相对普通APK,它可以让LSP加载到指定的进程中,并对该进程的Java进行Hook。
相对普通APK开发,我们额外要做的两件事:
- 定义要入侵的进程,LSP官方叫做Scope,一个scope其实就是指定一个包名,例如此处我们要hook android系统,那么包名就是android。
- 指定如何Hook,就是要写hook的代码了,通过代码hook java method,将其替换成我们自己的逻辑。
3.1 新建工程(被Hook)
代码很简单
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.textview);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
textView.setText(TextClazz.getText());
}
});
}
}
public class TextClazz {
public static String getText(){
return "未被劫持";
}
}
3.2 新建工程(Hook)
打开AndroidStudio新建个项目,名字随便起
3.3 添加Scope定义
在AndroidManifest.xml里,定义以下meta data,主要是告知LSP我们是一个模块,以及我们的scope在哪个xml里,让它去解析
```
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.XposedTest"
tools:targetApi="31">
<meta-data
android:name="xposedmodule"
android:value="true"/>
<meta-data
android:name="xposeddescription"
android:value="This is a demo for Xposed" />
<meta-data
android:name="xposedminversion"
android:value="54" />
........
</application>
```
3.4 前期准备
LSP加载我们的Hook逻辑时,要知道我们的Hook代码入口,因此,我们需要创建一个xposed_init文件,放在app/main/src/assets目录下,供LSP解析。
文件内容如下:
com.example.xposedtest.HookEntry
其中,com.example.xposedtest是我应用的包名,每个人根据自己的包名填写
下面就要开始实现HookEntry这个类了,到此我们需要引用一个lib依赖,这个依赖提供了Hook相关的一些工具以及接口,我们要实现接口,利用工具去修改method。
在app依赖中添加,注意是compileOnly的,因为在安装LSP时,这个lib已经集成到系统运行时了:
compileOnly("de.robv.android.xposed:api:82")
由于这个库出来很久了,所以要在根目录settings.gradle,加上jcenter仓库,否则拉不下来。
3.5 指定Hook逻辑
public class HookEntry implements IXposedHookLoadPackage {
//加载一个应用的进程的时候,会调用这个方法
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
hookWheel(lpparam);
}
private void hookWheel(XC_LoadPackage.LoadPackageParam lpparam) {
Class c = XposedHelpers.findClass("com.example.needbyhook.TextClazz", lpparam.classLoader);
if (c != null) {
XposedHelpers.findAndHookMethod(c, "getText", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
param.setResult("你被劫持啦哈哈哈哈!");
}
});
}
}
}
3.6 Xposed开启这个插件
运行项目,并在Xposed中开启
重启即可,现在再点击按钮,文字就被劫持了
感谢
在Android模拟器上玩转Xposed - 掘金 (juejin.cn)
LSPosed框架1.8.6 zygisk+riu下载刷入激活使用图文教程-ROM乐园官网 (romleyuan.com)