魔改lsp

魔改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.发布

以下是三个产物的打包方式:


  1. 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 等全部模块文件。


  1. 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,所以通常不需要单独构建。


  1. 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 目录执行构建即可。

相关推荐
茫茫人海一粒沙2 个月前
从插件割裂到协议标准化:LSP 的诞生背景、原理与实践
lsp
爱学习的大牛1232 个月前
Windows socket api 与 LSP 分层服务提供者
windows·lsp
叶庭云2 个月前
OpenCode:开源 AI Coding Agent 技术与行业分析
lsp·开源社区·多智能体协作·规范驱动开发·ai编程工具·opencode·plan/build双模式
王正南3 个月前
安卓逆向之LSposed开发(一)
android·xposed·lsposed
小小工匠3 个月前
LLM - Claude Code LSP(Language Server Protocol)语义级 IDE 助手
lsp·claude code
世界美景4 个月前
一种基于 ART 内存特征的 LSPosed/Xposed/分身环境 完美检测方案
android·安全·安卓·xposed
YF02115 个月前
Frida如何稳定连接PC端跟Android手机端
android·mac·xposed
Fanmeang8 个月前
MPLS 静态LSP
运维·网络·路由·mpls·lsp·vpn·静态lsp
科文小白狼10 个月前
Linux下VSCode开发环境配置(LSP)
linux·vscode·里氏替换原则·lsp