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模块编写相关推荐

  1. Nginx自定义模块编写:根据post参数路由到不同服务器

    Nginx可以轻松实现根据不同的url 或者 get参数来转发到不同的服务器,然而当我们需要根据http包体来进行请求路由时,Nginx默认的配置规则就捉襟见肘了,但是没关系,Nginx提供了强大的自 ...

  2. nginx自定义模块编写-实时统计模块--转载

    原文:http://www.vimer.cn/2012/05/nginx%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A8%A1%E5%9D%97%E7%BC%96%E5%86%99- ...

  3. 思源黑体ttf_模块模板 | 简单方法替换将TTF格式字体转换为Magisk模块

    注  意 本模块还处于测试阶段,不保证完全稳定,欢迎大家下载测试.如介意请不要使用. 由topjohnwu开发的Magisk(又称「面具」)工具由于其「systemless」的便捷特性已经受到越来越多 ...

  4. boost::pfr模块编写自己的 io-manipulator 进行打印的测试程序

    boost::pfr模块编写自己的 io-manipulator 进行打印的测试程序 实现功能 C++实现代码 实现功能 boost::pfr模块编写自己的 io-manipulator 进行打印的测 ...

  5. nginx 加路由时报错_Nginx自定义模块编写:根据post参数路由到不同服务器

    Nginx可以轻松实现根据不同的url 或者 get参数来转发到不同的服务器,然而当我们需要根据http包体来进行请求路由时,Nginx默认的配置规则就捉襟见肘了,但是没关系,Nginx提供了强大的自 ...

  6. 刷magisk模块后不能开机_刷Magisk模块开机卡Logo了怎么办?两种方法教你轻松解决...

    虽然,Magisk由于工作原理的不同,其模块对系统的兼容性相比较于此前的Xposed框架模块要好得多,但是依旧有可能出现刷了模块之后,卡Logo,无法开机的情况.今天,小编就提供两种方式解决刷Magi ...

  7. python写前端图形界面_如何Tkinter模块编写Python图形界面

    一.为何使用Tkinter而非PyQt 众所周知,在Python中创建图形界面程序有很多种的选择,其中PyQt和wxPython都是很热门的模块包,这些第三方的图形界面模块功能强大.配置丰富,界面美观 ...

  8. 小米2s自带rec刷root_刷Magisk模块开机卡Logo了怎么办?两种方法教你轻松解决

    虽然,Magisk由于工作原理的不同,其模块对系统的兼容性相比较于此前的Xposed框架模块要好得多,但是依旧有可能出现刷了模块之后,卡Logo,无法开机的情况.今天,小编就提供两种方式解决刷Magi ...

  9. android xml黑体字_为 Android 换上任意喜欢的字体,你可以试试这个 Magisk 模块

    本文综合微信公众号「霞鹜」(lxgwshare),点击 此处 阅读原文.第一次在少数派上写文章,疏漏之处在所难免,还望各位读者多多包涵和批评指正. 由 @topjohnwu 开发的 Magisk 以其 ...

  10. python编写代码实现文件的拷贝功能_python利用os模块编写文件复制功能——copy()函数用法...

    我就废话不多说了,大家还是直接看代码吧~ #文件复制 import os src_path=r'E:\Pycharm\python100题\代码' target_path=r'E:\Pycharm\p ...

最新文章

  1. Struts2 学习系列 (3) 跳转类型与通配符映射
  2. c++ vector向量直接赋值_vector-Jacobian product 解释 ---- pytorch autograd
  3. 微课丨华为的18条军规
  4. 设计模式原则--单一职责原则
  5. 交换机软件IOS升级更简化了
  6. 试玩UML(User Mode Linux)
  7. 面试问Kafka,这一篇全搞定
  8. IT项目管理中如何应对预算削减的难题?
  9. configuration 命名空间_kubernetes30:monitoring命名空间处于Terminating状态的处理方法...
  10. 猎豹浏览器小号窗口怎么打开 小号窗口打开方法简述
  11. MTK 驱动(80)---MTK平台User版本开机异常/无法开机,如何抓取log
  12. iPhone SE 3 5G版发布在即 旧款将降价到千元出头
  13. CGAL中Point的引用
  14. android查看应用权限管理,通过adb列出Android应用程序的权限
  15. JDBC:数据库操作:处理大对象CLOB数据
  16. soapui调用java类_soapui接口测试-验签值处理-调用java的加密jar包
  17. 计算机体系结构.是系统结构还是体系结构
  18. 浅谈数字音频处理的新技术
  19. 一个老工程师给年轻人的十大忠告【转帖】
  20. QT练习samp2_2_test——用按钮编辑文本框特性

热门文章

  1. 启动Apache时提示缺少vcruntime140.dll怎么解
  2. html中css鼠标手势样式,CSS鼠标手势
  3. Struts中拦截器和过滤器的区别
  4. 前端开发对JSESSIONID的初步了解:JSESSIONID的产生以及简单说明
  5. 基于java的教师信息管理系统
  6. 又一个微信聊天机器人横空出世了,人人可用
  7. 傻妞sillyGirl教程
  8. 用vba加载宏求地图分幅
  9. ROS主从机通信经验总结
  10. 计算机辅助设计 Photoshop 教案,计算机辅助设计①Photoshop学习领域课程标准.doc