魔改LSP
-
-
- [1. 环境准备](#1. 环境准备)
- [2. 核心魔改点:特征去标识化](#2. 核心魔改点:特征去标识化)
- [3. 核心注入引擎修改 (LSPlant)](#3. 核心注入引擎修改 (LSPlant))
- [4. 编译与部署流程](#4. 编译与部署流程)
- [5. 进阶:针对 TEE 和企业级风险控制](#5. 进阶:针对 TEE 和企业级风险控制)
- 6.发布
-
- [构建所有变体(Riru + Zygisk, Debug + Release)](#构建所有变体(Riru + Zygisk, Debug + Release))
- 或单独构建某个变体
- [1. 克隆外部 libxposed API 仓库](#1. 克隆外部 libxposed API 仓库)
- [2. 进入目录并发布到本地 Maven 仓库](#2. 进入目录并发布到本地 Maven 仓库)
- [在 LSPosed 项目外](#在 LSPosed 项目外)
1. 环境准备
确保你已经解决了之前遇到的 JDK 17 和子模块拉取问题。
源码拉取: git clone https://github.com/LSPosed/LSPosed.git
构建环境: Android Studio Jellyfish+ (JDK 17), CMake 3.22.1+, NDK (建议使用项目指定的版本)。
然后初始化
cd LSPosed
git submodule update --init --recursive
2. 核心魔改点:特征去标识化
魔改的主要目的是消除 LSPosed 的运行时特征,防止被应用(如银行、游戏、企业级 SDK)检测。
A. 修改包名与路径 (Rebranding)
LSPosed 的默认包名 org.lsposed.manager 是最容易被检测的特征。
修改全局包名: 在整个项目中将 org.lsposed 替换为你自定义的域名(如 com.qijin.tools)。
修改文件路径: 手动重命名相关的目录结构,确保与新包名对应。
Manager 应用更名: 在 manager 模块的 strings.xml 中修改应用名称。
B. 隐藏运行时本地库 (JNI Library)
LSPosed 的核心逻辑在 liblsposed.so 中。
修改 SO 文件名: 在 CMakeLists.txt 中,将 lsposed 目标更名为随机字符。
操作: 修改 daemon/src/main/jni/CMakeLists.txt 中的 project(lsposed)。
符号表打码 (Symbol Stripping): 使用 strip 进一步清理符号表,或在 lsplant 中修改特定的函数导出名称。
C. 修改内存映射特征 (Maps/Mounts)
检测脚本常通过读取 /proc/self/maps 或 /proc/self/mountinfo 寻找 lsposed 关键字。
修改存储路径: 改变 LSPosed 在 /data/adb/ 下的默认存储目录名称。
内存节点伪装: 在 daemon 逻辑中,针对挂载点的命名进行随机化处理。
3. 核心注入引擎修改 (LSPlant)
LSPosed 使用 LSPlant 作为 Hook 引擎。如果你需要实现更底层的绕过,可以修改 external/lsplant:
桩函数 (Stub) 修改: 改变 Hook 后的汇编跳转特征,避免被扫描代码段(Code Integrity Check)发现。
Inline Hook 优化: 调整 Trampoline 的分配策略,减少在内存中留下连续的异常执行段。
4. 编译与部署流程
清理缓存: ./gradlew clean
全量编译: ./gradlew :manager:assembleRelease
生成模块: 编译后的 Zip 包位于 out/ 目录下。
刷入测试: 建议在自定义 ROM 环境下测试(你之前研究过 AOSP 编译和指纹修改,这有助于排查因魔改导致的系统不稳定)。
5. 进阶:针对 TEE 和企业级风险控制
既然你在研究 SecSDK 和 TEE 绕过:
系统属性伪装: 修改 LSPosed 注入系统服务的逻辑,确保 ro.lsposed.version 等属性不被读取。
隐藏 Manager 界面: 魔改后的 Manager 可以不注册主 Activity 图标,通过特定的拨号盘代码或隐藏指令启动,防止应用列表扫描。
⚠️ 注意事项
签名一致性: 魔改后必须使用自己的 Key 进行签名,否则无法通过 Manager 的自检。
子模块同步: 每次修改涉及 external/ 下的项目时,记得进入对应目录提交变更或在主项目中更新索引。
6.发布
以下是三个产物的打包方式:
- LSPosed ZIP 安装包(Magisk/KernelSU 模块)
模块: magisk-loader
构建命令:
构建所有变体(Riru + Zygisk, Debug + Release)
./gradlew :magisk-loader:zipAll
或单独构建某个变体
./gradlew :magisk-loader:zipZygiskRelease # Zygisk Release(推荐)
./gradlew :magisk-loader:zipZygiskDebug # Zygisk Debug
./gradlew :magisk-loader:zipRiruRelease # Riru Release
./gradlew :magisk-loader:zipRiruDebug # Riru Debug
输出位置: magisk-loader/release/LSPosed-v{版本}-{版本号}-{zygisk|riru}-{release|debug}.zip
ZIP 内包含 module.prop、customize.sh、manager.apk、daemon.apk、native so 库、dex2oat、framework dex 等全部模块文件。
- LSPosed Manager APK(管理工具)
模块: app
构建命令:
./gradlew :app:assembleDebug # Debug 版
./gradlew :app:assembleRelease # Release 版(需要签名配置)
输出位置:
- app/build/outputs/apk/debug/app-debug.apk
- app/build/outputs/apk/release/app-release.apk
Release 版需要在 gradle.properties 中配置签名信息:androidStoreFile、androidStorePassword、androidKeyAlias、androidKeyPassword。
注意:构建 ZIP 安装包时会自动包含 Manager APK,所以通常不需要单独构建。
- api-82.jar
在当前项目中不存在 api-82 这个产物。 项目中使用的 Xposed API 来自外部仓库 libxposed/api,当前版本是 100(不是 82)。
如果你需要构建这个 API jar,步骤如下:
1. 克隆外部 libxposed API 仓库
git clone https://github.com/libxposed/api.git libxposed/api
2. 进入目录并发布到本地 Maven 仓库
cd libxposed/api
./gradlew publishToMavenLocal
这会将 io.github.libxposed:api:100 发布到 ~/.m2/repository/,LSPosed 的 core 模块通过 api(libs.libxposed.api) 依赖来引用它。
关于 "api-82":82 可能是历史版本号或来自早期 Xposed/EdXposed 项目。当前 LSPosed 已升级到 libxposed api 版本 100。如果你确实需要 api-82,可能需要切换到对应的历史 tag/分支。
前置环境要求
┌─────────────┬───────────────────────┐
│ 依赖 │ 版本 │
├─────────────┼───────────────────────┤
│ JDK │ 17+ │
├─────────────┼───────────────────────┤
│ Android SDK │ API 34 │
├─────────────┼───────────────────────┤
│ NDK │ 26.1.10909125 │
├─────────────┼───────────────────────┤
│ CMake │ 3.22.1+ │
├─────────────┼───────────────────────┤
│ Gradle │ 8.5(已内置 gradlew) │
└─────────────┴───────────────────────┘
构建前还需先将 libxposed 的 api 和 service 发布到本地 Maven(CI 工作流 .github/workflows/core.yml 中有完整步骤):
在 LSPosed 项目外
git clone https://github.com/libxposed/api.git && cd api && ./gradlew publishToMavenLocal && cd ...
git clone https://github.com/libxposed/service.git && cd service && ./gradlew publishToMavenLocal && cd ...
然后再回到 LSPosed 目录执行构建即可。