codekingpro/portable-devtools
114k
1import hashlib2import os3from zipfile import ZipFile4 5from cryptography import x5096from cryptography.hazmat.primitives import serialization7 8from mitmproxy import certs9from mitmproxy import ctx10from mitmproxy.options import CONF_BASENAME11 12# The following 3 variables are for including in the magisk module as text file13MODULE_PROP_TEXT = """id=mitmproxycert14name=MITMProxy cert15version=v116versionCode=117author=mitmproxy18description=Adds the mitmproxy certificate to the system store19template=3"""20 21CONFIG_SH_TEXT = """22MODID=mitmproxycert23AUTOMOUNT=true24PROPFILE=false25POSTFSDATA=false26LATESTARTSERVICE=false27 28print_modname() {29 ui_print "*******************************"30 ui_print " MITMProxy cert installer "31 ui_print "*******************************"32}33 34REPLACE="35"36 37set_permissions() {38 set_perm_recursive $MODPATH 0 0 0755 064439}40"""41 42UPDATE_BINARY_TEXT = """43#!/sbin/sh44 45#################46# Initialization47#################48 49umask 02250 51# echo before loading util_functions52ui_print() { echo "$1"; }53 54require_new_magisk() {55 ui_print "*******************************"56 ui_print " Please install Magisk v20.4+! "57 ui_print "*******************************"58 exit 159}60 61OUTFD=$262ZIPFILE=$363 64mount /data 2>/dev/null65[ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk66. /data/adb/magisk/util_functions.sh67[ $MAGISK_VER_CODE -lt 20400 ] && require_new_magisk68 69install_module70exit 071"""72 73 74def get_ca_from_files() -> x509.Certificate:75 # Borrowed from tlsconfig76 certstore_path = os.path.expanduser(ctx.options.confdir)77 certstore = certs.CertStore.from_store(78 path=certstore_path,79 basename=CONF_BASENAME,80 key_size=ctx.options.key_size,81 passphrase=ctx.options.cert_passphrase.encode("utf8")82 if ctx.options.cert_passphrase83 else None,84 )85 return certstore.default_ca._cert86 87 88def subject_hash_old(ca: x509.Certificate) -> str:89 # Mimics the -subject_hash_old option of openssl used for android certificate names90 full_hash = hashlib.md5(ca.subject.public_bytes()).digest()91 sho = full_hash[0] | (full_hash[1] << 8) | (full_hash[2] << 16) | full_hash[3] << 2492 return hex(sho)[2:]93 94 95def write_magisk_module(path: str):96 # Makes a zip file that can be loaded by Magisk97 # Android certs are stored as DER files98 ca = get_ca_from_files()99 der_cert = ca.public_bytes(serialization.Encoding.DER)100 with ZipFile(path, "w") as zipp:101 # Main cert file, name is always the old subject hash with a '.0' added102 zipp.writestr(f"system/etc/security/cacerts/{subject_hash_old(ca)}.0", der_cert)103 zipp.writestr("module.prop", MODULE_PROP_TEXT)104 zipp.writestr("config.sh", CONFIG_SH_TEXT)105 zipp.writestr("META-INF/com/google/android/updater-script", "#MAGISK")106 zipp.writestr("META-INF/com/google/android/update-binary", UPDATE_BINARY_TEXT)107 zipp.writestr(108 "common/file_contexts_image", "/magisk(/.*)? u:object_r:system_file:s0"109 )110 zipp.writestr("common/post-fs-data.sh", "MODDIR=${0%/*}")111 zipp.writestr("common/service.sh", "MODDIR=${0%/*}")112 zipp.writestr("common/system.prop", "")113 