Xposed框架入门:一次编写永久生效的Android修改方案
逆向系列再往前走一步,这次讲 Xposed 框架。跟 Frida 比,Xposed 的特点是持久化——改一次,重启后永久生效,不用每次都开 Frida 挂着。一、Xposed 是什么
Xposed 是一个 Android 框架,通过修改 Zygote 进程(所有 App 的父进程),在你不需要修改 APK 的情况下改变 App 的行为。写成模块后,每次开机自动加载,一劳永逸。
二、环境要求
[*]Root 权限(必须有)
[*]安装 Xposed Installer(原版或 LSPosed 替代版)
[*]Android 8.0 以下用原版 Xposed,8.1+ 推荐 LSPosed(基于 Magisk+Riru)
[*]Android 10+ 只能用 LSPosed + Magisk + Zygisk
现在原版 Xposed 已经不更新了,主力是 LSPosed,兼容性更好。
三、写一个简单模块
新建一个 Android 项目,添加 Xposed API 依赖:
// build.gradle
compileOnly 'de.robv.android.xposed:api:82'
创建入口类:
public class MyHook implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) {
// 只 hook 目标 App
if (!lpparam.packageName.equals("com.target.app")) return;
// hook 指定方法
XposedHelpers.findAndHookMethod(
"com.target.Util", // 类名
lpparam.classLoader,
"isVip", // 方法名
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
// 把返回值改成 true
param.setResult(true);
}
}
);
}
}
在 AndroidManifest.xml 声明模块:
<meta-data android:name="xposedmodule" android:value="true" />
<meta-data android:name="xposeddescription" android:value="VIP解锁" />
<meta-data android:name="xposedminversion" android:value="82" />
四、Xposed vs Frida 对比
[*]持久化:Xposed 模块装一次永久生效;Frida 每次要手动挂载
[*]性能:Xposed 常驻内存有全局开销;Frida 只 hook 时有开销
[*]隐蔽性:Frida 更隐蔽(运行完不留痕);Xposed 装了就一直在
[*]开发难度:Xposed 要写 Android 项目编译 APK;Frida 写 JS 脚本即可
[*]适用场景:长期改某个 App 用 Xposed;临时分析调试用 Frida
五、注意事项
[*]银行类 App 检测到 Xposed/LSPosed 会拒绝运行
[*]LSPosed 的"隐藏"列表可以把模块对指定 App 隐藏
[*]模块写错了会导致系统循环崩溃,建议先在模拟器测试
[*]Android 12+ 用 LSPosed + Zygisk + Magisk 最新版
https://www.metk.cn/img/posts/reverse_xposed.jpg
Xposed 的核心价值:一次编写,永久生效。适合你需要长期修改某个 App 行为的场景。临时分析还是 Frida 更方便。 有个细节,日志记得清掉,不然很容易被发现。 讲得挺细的,不过我建议加一句免责,这东西容易被拿去做坏事。 这篇质量很高,建议加精。 照着试了一下,第一遍没成功,发现是权限问题,建议楼主补充个提示。 我这边环境是Mac,有些步骤要调整,回头补个差异说明。 这篇干货,比那些只有命令没有解释的强太多了。 这个思路让我想到另一个场景,回头试试能不能套用。 感谢分享,之前一直卡在这个点,看完豁然开朗。 有个坑提醒,不同厂商ROM差异很大,通用性没有想象中那么强。