The Magic Mask for Android
Go to file
topjohnwu 0f74e89b44 Introduce component agnostic communication
Usually, the communication between native and the app is done via
sending intents to either broadcast or activity. These communication
channels are for launching root requests dialogs, sending root request
notifications (the toast you see when an app gained root access), and
root request logging.

Sending intents by am (activity manager) usually requires specifying
the component name in the format of <pkg>/<class name>. This means parts
of Magisk Manager cannot be randomized or else the native daemon is
unable to know where to send data to the app.

On modern Android (not sure which API is it introduced), it is possible
to send broadcasts to a package, not a specific component. Which
component will receive the intent depends on the intent filter declared
in AndroidManifest.xml. Since we already have a mechanism in native code
to keep track of the package name of Magisk Manager, this makes it
perfect to pass intents to Magisk Manager that have components being
randomly obfuscated (stub APKs).

There are a few caveats though. Although this broadcasting method works
perfectly fine on AOSP and most systems, there are OEMs out there
shipping ROMs blocking broadcasts unexpectedly. In order to make sure
Magisk works in all kinds of scenarios, we run actual tests every boot
to determine which communication method should be used.

We have 3 methods in total, ordered in preference:
1. Broadcasting to a package
2. Broadcasting to a specific component
3. Starting a specific activity component

Method 3 will always work on any device, but the downside is anytime
a communication happens, Magisk Manager will steal foreground focus
regardless of whether UI is drawn. Method 1 is the only way to support
obfuscated stub APKs. The communication test will test method 1 and 2,
and if Magisk Manager is able to receive the messages, it will then
update the daemon configuration to use whichever is preferable. If none
of the broadcasts can be delivered, then the fallback method 3 will be
used.
2019-10-21 13:59:04 -04:00
app Introduce component agnostic communication 2019-10-21 13:59:04 -04:00
docs Fix Typos 2019-10-07 23:03:09 -04:00
gradle/wrapper Update Gradle wrapper to 5.6.2 2019-09-09 17:38:54 -04:00
native Introduce component agnostic communication 2019-10-21 13:59:04 -04:00
scripts Allow upgrade Magisk daemon in emulator 2019-10-21 13:58:57 -04:00
shared Pass in stub version just in case 2019-10-20 17:47:55 -04:00
signing Generate keys for signing hidden Magisk Manager 2019-10-20 06:56:33 -04:00
snet Update snet extension 2019-08-08 04:18:32 -07:00
stub Make SuRequest default to Translucent.NoTitleBar 2019-10-20 17:35:38 -04:00
tools Clean elf after building shared binaries 2019-08-22 02:51:17 +08:00
.gitattributes Clean elf after building shared binaries 2019-08-22 02:51:17 +08:00
.gitignore Make main app fully independent from the stub 2019-10-17 02:55:42 -04:00
.gitmodules Clean elf after building shared binaries 2019-08-22 02:51:17 +08:00
build.gradle Revert "Drop API 17 (Android 4.2) support" 2019-10-20 07:13:03 -04:00
build.py Post process release APKs 2019-10-17 18:02:31 -04:00
config.prop.sample Assign signing keystore location in config 2019-10-17 16:20:01 -04:00
gradle.properties Updated build tools & enabled incremental kapt 2019-05-09 15:27:37 +02:00
gradlew Update Gradle wrapper to 5.6.1 2019-09-01 01:17:22 +08:00
gradlew.bat Update Gradle wrapper to 5.6.1 2019-09-01 01:17:22 +08:00
LICENSE Use GPL v3 license and update copyright messages 2017-04-22 17:12:54 +08:00
README.MD Reorganize string resources 2019-10-15 03:33:22 -04:00
settings.gradle Remove net module 2019-08-04 18:33:20 -07:00

Magisk

Downloads | Documentation | XDA Thread

Introduction

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

Furthermore, Magisk provides a Systemless Interface to alter the system (or vendor) arbitrarily while the actual partitions stay completely intact. With its systemless nature along with several other hacks, Magisk can hide modifications from nearly any system integrity verifications used in banking apps, corporation monitoring apps, game cheat detections, and most importantly Google's SafetyNet API.

Bug Reports

Make sure to install the latest Canary Build before reporting any bugs! DO NOT report bugs that are already fixed upstream. Follow the instructions in the Canary Channel XDA Thread, and report a bug either by opening an issue on GitHub or directly in the thread.

Building Environment Requirements

  • Python 3: run build.py script
  • Java Development Kit (JDK) 8: Compile Magisk Manager and sign zips
  • Latest Android SDK: set ANDROID_HOME environment variable to the path to Android SDK
  • Android NDK: Install NDK along with SDK ($ANDROID_HOME/ndk-bundle), or optionally specify a custom path ANDROID_NDK_HOME
  • (Windows Only) Python package Colorama: Install with pip install colorama, used for ANSI color codes

Building Notes and Instructions

  • Clone sources with submodules: git clone --recurse-submodules https://github.com/topjohnwu/Magisk.git
  • Building is supported on macOS, Linux, and Windows. Official releases are built and tested with FrankeNDK; point ANDROID_NDK_HOME to FrankeNDK if you want to use it for compiling.
  • Set configurations in config.prop. A sample file config.prop.sample is provided as an example.
  • Run build.py with argument -h to see the built-in help message. The -h option also works for each supported actions, e.g. ./build.py binary -h
  • By default, build.py build binaries and Magisk Manager in debug mode. If you want to build Magisk Manager in release mode (via the -r, --release flag), you need a Java Keystore file release-key.jks (only JKS format is supported) to sign APKs and zips. For more information, check out Google's Official Documentation.

Translations

Default string resources for Magisk Manager and its stub APK are located here:

  • app/src/main/res/values/strings.xml
  • stub/src/main/res/values/strings.xml

Translate each and place them in the respective locations ([module]/src/main/res/values-[lang]/strings.xml).

Signature Verification

Official release zips and APKs are signed with my personal private key. You can verify the key certificate to make sure the binaries you downloaded are not manipulated in anyway.

# Use the keytool command from JDK to print certificates
keytool -printcert -jarfile <APK or Magisk zip>

# The output should contain the following signature
Owner: CN=John Wu, L=Taipei, C=TW
Issuer: CN=John Wu, L=Taipei, C=TW
Serial number: 50514879
Valid from: Sun Aug 14 13:23:44 EDT 2016 until: Tue Jul 21 13:23:44 EDT 2116
Certificate fingerprints:
	 MD5:  CE:DA:68:C1:E1:74:71:0A:EF:58:89:7D:AE:6E:AB:4F
	 SHA1: DC:0F:2B:61:CB:D7:E9:D3:DB:BE:06:0B:2B:87:0D:46:BB:06:02:11
	 SHA256: B4:CB:83:B4:DA:D9:9F:99:7D:BE:87:2F:01:3A:A1:6C:14:EE:C4:1D:16:70:21:F3:71:F7:E1:33:0F:27:3E:E6
	 Signature algorithm name: SHA256withRSA
	 Version: 3

License

Magisk, including all git submodules are free software:
you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation,
either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.