Magisk模块编写

0x00 magisk介绍

Magisk 本质上是一种文件挂载系统。我们大多数时候所接触到的那个图标为面具的应用,其实只是我们与之发生各种交互行为的「媒介」。

首先简单介绍一下magisk的原理。magisk做的事情是通过boot中创建钩子,进而bind mount构建出一个在system基础上能够自定义替换,增加以及删除的文件系统,实际上并没有对 system 分区进行修改(即 systemless 接口,以不触动 system 的方式修改 system)。所有操作都在启动的时候完成,启动过程中magisk所做的事情:
1.准备阶段,将会把/data/magisk.img 挂到/magisk。同时它会遍历magisk目录中的模块是否为启用状态,并且记录。
2.创建骨架system文件系统(由于bind mount 必须要有一个目标文件才能进行bind mount),全部由mkdir 和touch构建
3.将每个标记为启用的/magisk/$MODID/system中文件bind mount到骨架系统
4.执行自定义模块中的脚本
5.遍历骨架中剩余没有被mount的文件,通过真正的system文件进行bind mount。

因为它不会以任何方式改变您的system分区。这意味着您仍然可以安装官方OTA更新,而不会丢失root。

然后Magisk能实现哪些功能?
1.集成了类似SuperSU的root管理功能(MagiskSU)
2.类似于Xposed,可以安装使用Magisk相关模块
3.Magisk Hide(对单个应用隐藏 Magisk 的 root 权限)
4.日志功能
5.Systemless hosts(为广告屏蔽应用提供Systemless hosts支持)
6.SafetyNet 检查功能

0x01 magisk

模块的本质,是将原本需要玩家繁复操作的玩机过程与 Magisk「不改动系统」(Systemless-ly) 的特性结合在一起,并进行打包和分发。

知道模块可以从哪里得到后,我们要讨论的就是管理问题。管理主要是刷入和卸载两方面。广义地说,任何能给手机刷入 .zip 包的工具都可以进行模块的刷入,比如 TWRP、Magisk Manager 和 Franco Kernel Manager 等,操作也都简单得类似,刷入、重启生效。

在这里插入图片描述

谷歌服务中的 SafetyNet 安全性测试。想要通过 SafetyNet 测试,最好使用原厂系统,或者是值得信赖的第三方 ROM 正式版(也就是 Official Builds),以减少不必要的麻烦。

如果是 basic integrity 这一项没有通过认证,那说明你遇到了大麻烦:试着开启「Magisk 核心功能模式」或者卸载所有模块,如果还是没有通过,那么你可能需要换一个系统或者第三方 ROM 了。

如果是 ctsProfile 这一项没有通过,那说明你的 ROM 没有通过其兼容性测试,一些 beta 版本或者国内厂商的 ROM 可能出现这种问题。这时我们下载使用 MagiskHide Props Config 这个模块往往能够解决问题。

0x02 magisk模块编写

MagiskTrustUserCerts为例来分析magisk模块如何编写

在这里插入图片描述

1).在init执行时,执行自定义的命令。
2).以overlay的形式覆盖系统文件
3).修改Android Property属性。

以7.0以上的抓包需求为例:

从Android Nougat开始,默认情况下,应用不再信任用户证书。开发人员仍然可以通过在应用程序的AndroidManifest.xml文件中配置networkSecurityConfig属性来选择接受用户证书,但默认情况下,它们不再受信任。

一个完整的magisk模块整体如下:
➜  tree MagiskTrustUserCerts
MagiskTrustUserCerts
├── META-INF
│   └── com
│       └── google
│           └── android
│               ├── update-binary
│               └── updater-script
├── common
│   ├── post-fs-data.sh
│   ├── service.sh
│   └── system.prop
├── config.sh
└── module.prop

安装流程就是将上面的内容打包成MagiskTrustUserCerts.zip然后push到sdcard。
最后在magisk的APP上点击增加模块,找到该zip刷入即可。

分析模块的基本内容:

一: 其中module.prop里面存放着magisk模块的基本信息

id=trustusercerts
name=Always Trust User Certificates
version=v0.3
versionCode=1
author=Jeroen Beckers (NVISO.be)
description=This module adds all installed user certificates to the system trust store.
minMagisk=1500

二: config.sh文件里设置要执行的脚本。可以看到开启了Mount和执行post-fs-data 脚本

# Set to true if you need to enable Magic Mount
# Most mods would like it to be enabled
AUTOMOUNT=true

# Set to true if you need post-fs-data script
POSTFSDATA=true

三: post-fs-data.sh里面就是执行的内容。可以看到脚本每次启动就把用户证书移动到移动目录下:

#!/system/bin/sh
# Please don't hardcode /magisk/modname/... ; instead, please use $MODDIR/...
# This will make your scripts compatible even if Magisk change its mount point in the future
MODDIR=${0%/*}

mkdir -p $MODDIR/system/etc/security/cacerts
rm $MODDIR/system/etc/security/cacerts/*
cp -f /data/misc/user/0/cacerts-added/* $MODDIR/system/etc/security/cacerts/

# This script will be executed in post-fs-data mode
# More info in the main Magisk thread
总结模块的编写流程:
# 1. Place your files into system folder (delete the placeholder file)
# 2. Fill in your module's info into module.prop
# 3. Configure the settings in this file (common/config.sh)
# 4. For advanced features, add shell commands into the script files under common:
#    post-fs-data.sh, service.sh
# 5. For changing props, add your additional/modified props into common/system.prop

隐藏自身

Magisk隐藏自身的实现
1.切入目标APP进程的mount space, 将Magisk相关的所有文件和目录进行unmount操作。

2.对Magisk需要用到的unix domain socket name, Android system service name进行随机化,也支持对自身管理器的包名随机化。

0x03 其他

tips1:
安装MM 管理器,不过大部分模块都没什么问题,不怕一万,就怕万一,如果刷错了开不了机,就用MM管理器卸载模块就行了。具体操作 就是进入第三方rec 进入高级 终端命令 输入data/media/mm 确定然后按步骤卸载或停用模块就行了。
参考:https://www.52pojie.cn/thread-881414-1-1.html

tips2:

magisk常用的模块
链接:https://pan.baidu.com/s/1m4-cCckX9EFK5ES8sNJN-g
提取码:zx41

frida开机自启动的magisk模块:省去每次命令行交换
https://github.com/AeonLucid/MagiskFrida

伪造设备的magisk模块
https://github.com/AndroPlus-org/magisk-module-device-faker/blob/master/config.sh

0x04 如何检测magisk

Pokemon Go 会检查/sdcard/ 下是否有MagiskManager 这个目录

Check the installed magisk version

MIN_VER=`grep_prop minMagisk $INSTALLER/module.prop`
[ ! -z $MAGISK_VER_CODE -a $MAGISK_VER_CODE -ge $MIN_VER ] || require_new_magisk
MODID=`grep_prop id $INSTALLER/module.prop`
MODPATH=$MOUNTPATH/$MODID

参考:
https://topjohnwu.github.io/Magisk/

Magisk 是一款强大的 Android 系统增强工具,其模块可以对系统进行各种定制和修改。以下是关于 Magisk 模块开发的一些信息: ### 开发前的准备 - **环境搭建**:需要具备基本的 Android 开发环境,包括安装好的 Android SDK、Java 开发环境等。同时,要熟悉 Linux 命令行操作,因为在开发过程中会用到很多命令。 - **了解 Magisk 原理**:Magisk 通过在系统启动时挂载一个虚拟文件系统(overlayfs)来实现对系统文件的修改,而不真正修改原始的系统分区。开发者需要理解这个原理,才能更好地开发模块。 ### 开发步骤 1. **创建模块目录结构**: - 通常一个 Magisk 模块包含以下几个必要的文件和目录: - `module.prop`:模块的属性文件,包含模块的名称、版本、描述等信息。示例如下: ```plaintext id=my_module name=My Magisk Module version=1.0 versionCode=1 author=Your Name description=A simple Magisk module ``` - `post-fs-data.sh`:这个脚本会在文件系统挂载完成后执行,可以在这里进行一些文件的替换、修改等操作。例如: ```bash #!/system/bin/sh # 替换系统中的某个文件 cp /data/adb/modules/my_module/system/bin/my_custom_binary /system/bin/ ``` - `service.sh`:在系统服务启动后执行的脚本,可用于启动一些后台服务等。 - `system` 目录:用于存放要替换或添加到系统中的文件。例如,如果要替换系统的 `framework-res.apk` 文件,可以将修改后的文件放在 `system/framework` 目录下。 2. **编写脚本逻辑**: - 在 `post-fs-data.sh` 和 `service.sh` 中编写具体的脚本逻辑。例如,在 `post-fs-data.sh` 中可以进行文件权限的修改: ```bash #!/system/bin/sh chmod 755 /system/bin/my_custom_binary ``` 3. **测试模块**: - 将创建好的模块目录压缩成 ZIP 文件,然后在 Magisk Manager 中安装该 ZIP 文件。安装完成后,重启设备,检查模块是否正常工作。如果出现问题,可以查看 Magisk 的日志文件 `/data/adb/magisk.log` 来排查错误。 ### 开发教程和指南资源 - **XDA 论坛**:XDA 论坛有很多关于 Magisk 模块开发的讨论和教程,开发者可以在上面找到很多有用的信息和示例代码。 - **Magisk 官方文档**:Magisk 的官方 GitHub 仓库中有详细的文档说明,包括模块开发的规范和一些示例代码。 以下是一个简单的 Magisk 模块开发示例,假设要开发一个修改系统字体的模块: 1. 准备好要替换的字体文件,例如 `Roboto.ttf`。 2. 创建模块目录结构: ```plaintext my_font_module/ ├── module.prop ├── post-fs-data.sh └── system └── fonts └── Roboto.ttf ``` 3. `module.prop` 文件内容: ```plaintext id=my_font_module name=Custom Font Module version=1.0 versionCode=1 author=Your Name description=Replace system font with custom font ``` 4. `post-fs-data.sh` 文件内容: ```bash #!/system/bin/sh # 复制字体文件到系统字体目录 cp /data/adb/modules/my_font_module/system/fonts/Roboto.ttf /system/fonts/ ``` 5. 将 `my_font_module` 目录压缩成 ZIP 文件,在 Magisk Manager 中安装该 ZIP 文件,重启设备即可看到字体被替换。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值