Lsposed 是一个基于 Riru 框架的 Xposed 兼容实现,它允许在 Android 设备上动态修改应用程序的行为,而无需直接修改 APK 文件或系统文件。Lsposed 通过 Hook 目标应用的 Java 层方法,使开发者能够在不影响系统稳定性的情况下对应用程序进行修改。
目录
Lsposed 的工作原理
1. 依赖于 Riru 实现进程内 Hook
Lsposed 依赖于 Riru,它是一个 Magisk 模块,允许修改 Android 进程的 Zygote
进程。
- Zygote 是 Android 进程的父进程,所有应用进程都是从 Zygote fork 出来的。
- Riru 允许 Lsposed 在 Zygote 进程中执行 Hook 代码,进而影响所有应用进程。
2. Xposed 兼容性
Lsposed 兼容 Xposed API,并提供了更好的模块管理机制,使得开发者可以使用 Xposed 模块而不影响系统稳定性。
- 传统 Xposed 框架是通过修改
app_process
直接 Hook Zygote 进程,但这种方法会影响系统稳定性,并且容易触发 SafetyNet 检测。 - Lsposed 通过 Riru 以更安全的方式插入 Hook 代码,不修改
app_process
,从而规避了一些安全检测。
Lsposed 的核心组件
1. Riru 框架
Riru 负责在 Zygote 进程启动时加载 Lsposed 代码,并提供 Hook 机制。
2. Lsposed Manager
Lsposed Manager 是一个管理应用,用户可以在其中:
- 启用或禁用 Hook 模块
- 选择哪些应用程序被 Hook
- 查看 Hook 记录和日志
3. Xposed API
Lsposed 复用了 Xposed API,允许模块开发者使用:
findAndHookMethod()
:Hook 目标方法beforeHookedMethod()
:修改方法执行前的参数afterHookedMethod()
:修改方法返回值
Lsposed Hook 过程
- Zygote 进程启动:
- Riru 在 Zygote 启动时加载 Lsposed 代码,并在
app_process
运行时插入 Hook。
- Riru 在 Zygote 启动时加载 Lsposed 代码,并在
- 应用进程 Fork:
- Zygote 进程 Fork 出应用进程,并加载 Lsposed 插件。
- Hook 目标方法:
- Lsposed 通过
findAndHookMethod
Hook 目标应用的方法,并在执行前后修改参数或返回值。
- Lsposed 通过
Lsposed 的优势
- 模块化管理:可以对指定的应用进行 Hook,而不会影响系统其他进程。
- 高兼容性:兼容 Xposed API,支持大多数 Xposed 模块。
- 更安全:不修改
app_process
,规避 SafetyNet 检测,提高系统稳定性。 - 支持 Android 8+:Lsposed 支持 Android 8 及以上版本,并能适配更高版本的 Android 系统。
Lsposed 与传统 Xposed 的区别
特性 | 传统 Xposed | Lsposed |
---|---|---|
Hook 方式 | 修改 app_process | 使用 Riru 进程内 Hook |
影响范围 | 影响整个系统 | 仅影响指定应用 |
兼容性 | 兼容性较差 | 兼容性更高 |
检测规避 | 容易被检测 (SafetyNet) | 难以检测 |
适用系统 | Android 4.4 - 7.1 | Android 8+ |
Lsposed 示例代码
假设我们要 Hook android.telephony.TelephonyManager#getDeviceId
以返回一个固定的 IMEI,我们可以使用 Lsposed 进行 Hook:
package com.example.hookmodule;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
public class HookMain implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (!lpparam.packageName.equals("com.target.app")) {
return; // 只 Hook 目标应用
}
XposedHelpers.findAndHookMethod(
"android.telephony.TelephonyManager",
lpparam.classLoader,
"getDeviceId",
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
param.setResult("123456789012345"); // 伪造 IMEI
}
}
);
}
}
如何使用
- 在 Android Studio 中编写 Xposed 模块,并使用 XposedBridge API 进行 Hook。
- 将模块打包为 APK,并使用 Lsposed Manager 启用该模块。
- 启动目标应用,Hook 生效。
结论
Lsposed 是当前 Android 设备上最稳定、兼容性最高的 Xposed Hook 方案。它基于 Riru,在不修改 app_process
的情况下,实现了 Xposed 模块的管理和应用进程 Hook,可以用于修改应用行为、添加新功能或进行安全测试。