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 等,操作也都简单得类似,刷入、重启生效。

Magisk模块编写_第1张图片

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

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

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

0x02 magisk模块编写

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

Magisk模块编写_第2张图片

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/

你可能感兴趣的:(android安全)