📚
handbook
  • Introduction
  • 1.前言
    • 前言
    • 鸣谢
  • 2.环境篇
    • 工具部署和使用
      • 团队协作工具
        • Confluence
      • 开发工具
        • Docker
          • 镜像导入导出
          • 安装
        • Docker Compose
      • 持续集成工具
        • Gerrit
        • Sonarqube
          • 分析参数设定
          • Prerequisite
          • 服务端设置
        • Ubuntu Ci Deploy
          • ubuntu使用docker部署jenkins+sonarqube
        • 持续集成部署
      • 文本编辑工具
        • Gitbook相关注意事项
        • Markdown快速入门
      • 版本控制
        • Git
          • 1.基础
            • Git基础(一)
            • Git基础(二)
            • Git基础(三)
            • Git基础(四)
            • Git基础(五)
          • 2.命令详解
            • 命令速查
          • 3.进阶技巧
            • git技巧
      • 自动化测试工具
        • Appium
          • capability参数配置
          • 安装
          • 简介
      • 项目管理工具
        • Jira
    • 开发环境配置
      • 通用
        • Homebrew安装与使用
        • Git服务器添加SSH Key
        • koroFileHeader使用
        • nodejs与npm的安装
        • npm更换国内源
        • pip使用相关
        • PostgreSQL安装与使用
        • proxychain安装与使用
        • shell配置环境变量
        • snapd安装与使用
        • terminal走代理
    • 快捷键速查
      • shell常用快捷键
  • 3.语言篇
    • C
      • 代码规范
      • 语言技巧
    • Cpp
      • 代码规范
      • 基础知识
        • 理解C++中的左值和右值
      • 语言技巧
        • 并发编程
          • 简单的线程池实现
    • Golang
      • 代码规范
        • 避免使用转义字符串
        • 避免参数语义不明确
        • 嵌套式结构体
        • 函数的分组与顺序
        • 函数命名
        • 声明一致性
        • 导入别名
        • 使用字段名初始化结构体
        • 本地变量声明
        • map初始化
        • nil用法
        • 包命名
        • 命名Printf样式的函数
        • 减少嵌套
        • 缩小变量作用域
        • struct引用初始化
        • 测试表声明
        • 顶层变量声明
        • 不必要的else
      • 环境配置
        • 代码检查格式化工具
          • Go Fmt
          • Goimports
          • Golint
          • Go Vet
        • go mod详解
        • golang安装
        • Golang开发环境
        • Troubleshooting
      • 语言技巧
        • 如何分包
    • Java
      • 代码规范
      • 语言技巧
        • 注解编程
        • 动态代理
    • Js
      • 语言技巧
        • Rollup
    • Kotlin
      • 基础知识
        • 写给开发者Kotlin指引(一)
        • 写给开发者Kotlin指引(二)
    • Python
      • 语言技巧
        • Best Practice Of Python S Project Structure
  • 4.规范篇
    • Git message规范
  • 5.技术篇
    • Android技术
      • Hook
        • EdXposed例子
        • Android 10 上安装Magisk和EdXposed
      • Tinker
        • 1.Tinker及其使用
      • 准备
        • ADB连接设备步骤及注意事项
        • adb连接设备
        • aosp编译
      • 基础
        • Binder接口调用的鉴权方法
        • Make 及 Android 编译系统介绍
        • 使用Content Provider为其他应用提供数据
      • 源码阅读
        • Framework源码分析 Looper Handler
        • Framework源码分析 启动流程 ServiceManager的初始化
        • Framework源码分析 启动流程 Zygote启动SystemServer
    • JS Bridge
      • JSBridge初探
    • Kernel技术
      • kallsyms子系统
    • Test技术
      • 软件测试
        • jnekin+sonar 部署 问题总结
        • 性能测试基础
        • 软件测试的背景
        • 测试基础
        • 测试人员的核心竞争力
    • 操作系统原理
      • 处理器如何实现原子操作
Powered by GitBook
On this page
  • 背景
  • 什么是Magisk
  • 什么是systemless方式root
  • 什么是EdXposed
  • 环境准备
  • Magisk安装
  • EdXposed安装
  • 安装Riru
  • 安装Edxposed
  • 安装EdXposed Manager

Was this helpful?

  1. 5.技术篇
  2. Android技术
  3. Hook

Android 10 上安装Magisk和EdXposed

PreviousEdXposed例子NextTinker

Last updated 4 years ago

Was this helpful?

背景

因为项目中需要实现一个动态检测沙箱,需要Hook应用去获取信息和状态,所以调研当前的hook框架,本文是对Magisk和EdXposed的调研描述

什么是Magisk

我们先看下上的官方描述

Magisk is a suite of open source tools for customizing Android, supporting devices higher than Android 4.2. It covers fundamental parts of Android customization: root, boot scripts, SELinux patches, AVB2.0 / dm-verity / forceencrypt removals etc.

Here are some feature highlights:

MagiskSU: Provide root access to your device Magisk Modules: Modify read-only partitions by installing modules MagiskHide: Hide Magisk from root detections / system integrity checks

Magsik是一个套件,用于定制化Android,能够实现root,定制启动脚本,SElinux patch等等功能。套件中包含MagiskSU, Magisk Modules和MagiskHide

从Android 6.0以后由于多种安全机制的引入或者增强(KASAN, KASLR, SElinux),导致通过内核漏洞提权逐渐减少,从Android 7.0开始Android提权越来越困难,Magisk通过修改boot image的方法从启动的更前端实现了一套root机制,并提供了相关的功能。

什么是systemless方式root

很多网上评论Magisk的文章都有提到,Magisk是一种systemless的root方式,本质上并不修改system分区,从而不破坏system分区的完整性。而Magisk将所有的改动都放在boot.img中。但是我们在实际使用中发现安装了Magisk手机的system分区中确实添加了很多东西,那又是如何在不该动system的情况下实现的? 所有的秘密都隐藏在一个很小的细节中,我们看下Magisk的moudle.cpp部分源码

[Magisk/native/jni/core/module.cpp]

static int bind_mount(const char *from, const char *to) {
    int ret = xmount(from, to, nullptr, MS_BIND, nullptr);
    if (ret == 0)
        VLOGD("bind_mnt", from, to);
    return ret;
}

上面代码中的bind_mount就是Magisk systemless root的核心原理。xmount是对mount命令的一个封装,添加错误处理和打印, 不展开讲。重点关注其中的一个参数MS_BIND。

MS_BIND (Linux 2.4 onward) Perform a bind mount, making a file or a directory subtree visible at another point within a file system. Bind mounts may cross file system boundaries and span chroot(2) jails. The filesystemtype and data arguments are ignored. Up until Linux 2.6.26, mountflags was also ignored (the bind mount has the same mount options as the underlying mount point).

翻译一下就是可以将一个文件系统路径a挂载到另一个文件系统路径b下,以后对b的所有访问和改动都是改动a下的路径,而对被挂载的文件系统路径和文件不会有任何修改

所以Magisk通过bind_mount将boot分区中的文件挂载到了/system分区路径下,所以我们看上去/system分区多了很多东西,但是实际上对这些文件都在boot分区下,system分区没有做任何改动

什么是EdXposed

首先Xposed是一套Hook框架,提供运行时Hook APP API去动态改变运行行为。Xposed是通过替换app_process,也就是Zygote来把所有Hook能力注入进去,所有Framework的类加载都有Xposed影子,所以导致Xposed Hook能力很全面。但是同时也导致Xposed Hook框架很容易检测到。Xposed在Android 8.0以后适配性不好,经常会导致启动问题。 而EdXposed是基于Magisk的思想实现的一套Hook机制。当前已经兼容8.0-10.0,并且使用方式和Xposed基本一致,所以是后Xposed时代比较好的一个Hook框架选择。

环境准备

  1. 准备好已解BL锁的设备,我选择的是Pixel 3XL,谷歌亲儿子折腾什么都是最方便的

  2. 刷入官方镜像

  3. 提取出官方镜像中的boot.img

Magisk安装

  1. 安装Magisk Manager

  2. 安装完打开,选择Magisk 安装

$adb install MagiskManager-v5.8.1.apk
  1. 先选择仅下载安装包,这时会将Magisk包下载到本地,这个包用于对boot.img的修改

  1. 将boot.img 推送到手机中,路径选择/sdcard/Download/

$adb push boot.img /sdcard/Download
  1. 这时在通过Magisk->安装->选择并修补一个文件,选择boot.img,然后点击打开,这时候会开始修改boot.img

  1. 完成后会生成magisk_patched.img, 将这个image刷入到boot分区中

    $fastboot flash boot magisk_patched.img

安装完成后截图会显示Magisk的状态,和下发的浮动菜单栏

EdXposed安装

  1. 在Magisk中安装EdXposed相关的模块(Riru和Edxposed)

  2. 安装EdXposed Manager app

安装Riru

Riru模块是Edxposed和核心支撑模块,之前叫Riru-core, 在本篇文章写作时已经换了名字

安装Edxposed

这里会有小问题,就是Edxposed有两个版本,一个sandhook,一个是yahfa,这两个的区别在于底层hook art虚拟机的机制不一样。目前细节还不是特别了解,普遍说yahfa方案比较稳定,所以当前选择是yahfa方案

安装EdXposed Manager

看下MS_BIND的

准备好镜像,由于是Pixel,所以使用Google官方镜像就可以。

首先下载,这是一个app,由于完成Magisk和相关模块的管理,在写这篇文章的时候,最新版本是v5.8.1

更详细的可以参考GitHub上的

Edxposed在Magisk的模块管理中也是能搜索到的,不过在当前的这个版本下,无法直接安装,v0.4.6.4版本的Edxposed模块依然会在安装时检测Riru-core模块,由于上面安装的是Riru模块,所以安装失败,通过查询Github上的issue了解到,如果安装的Riru,则需要安装Canary版本的Edxposed,也就是依赖于Riru的正式版Edxposed还没有发布。所以找到下载离线包,通过安装离线模块的方式进行安装

EdXposed Manager主要用于对Xposed模块的管理,这个和Xposed一致 直接在EdXposedManager的GitHub 上下载最新版本安装即可,如果上述都安装成功,则进入EdXposed Manager就会显示框架已激活

Magisk github
官方描述
Android FactoryImage
Magisk Manager
官方说明
Canary版本的发布页
release
Magisk Manager
下载Magisk
patch bootimage
Riru
Edxposed
Edxposed Manager