diff --git a/README.MD b/README.MD index 8b351456d..d96a02f3e 100644 --- a/README.MD +++ b/README.MD @@ -1,4 +1,3 @@ # Magisk Static binaries included: * Busybox: http://forum.xda-developers.com/android/software-hacking/tool-busybox-flashable-archs-t3348543 -* Open source su binary: https://github.com/seSuperuser/Superuser diff --git a/jni/magiskhide.c b/jni/magiskhide.c index 1833cd322..55aae8f17 100644 --- a/jni/magiskhide.c +++ b/jni/magiskhide.c @@ -17,9 +17,13 @@ typedef unsigned short int sa_family_t; #include #include #include -#include -#define HIDE_LIST "/magisk/.core/hidelist" +#define HIDE_LIST "/magisk/.core/magiskhide/hidelist" +#define MOUNT_LIST "/dev/mountlist" + +int hide_size = 0, mount_size = 0; +char **hide_list, **mount_list; +time_t last_update = 0; //WARNING: Calling this will change our current namespace //We don't care because we don't want to run from here anyway @@ -33,74 +37,97 @@ int hideMagisk(int pid) { int res = syscall(SYS_setns, fd, 0); if(res == -1) return 3; - res = mount("/magisk/.core/mirror/system", "/system", "bind", MS_BIND, ""); - if(res == -1) return 4; + int i; + for(i = mount_size - 1; i >= 0; --i) { + res = umount2(mount_list[i], MNT_DETACH); + if (res != -1) printf("Unmounted: %s\n", mount_list[i]); + else printf("Failed: %s\n", mount_list[i]); + } res = umount2("/magisk", MNT_DETACH); - if(res == -1) return 4; + if (res != -1) printf("Unmounted: %s\n", "/magisk"); + else printf("Failed: %s\n", "/magisk"); + return 0; } -int loadList(int fd, char ***list, int *line, time_t *last_update) { - int allocated = 16, i; - char *buffer, *tok; - struct stat file_stat; - - fstat(fd, &file_stat); - if (file_stat.st_mtime == *last_update) { - return 0; - } +char** file_to_str_arr(const int fd, int *size) { + int allocated = 16; + char *buffer, *tok, **array; + off_t filesize = lseek(fd, 0, SEEK_END); - lseek(fd, 0, SEEK_SET); buffer = malloc(sizeof(char) * filesize); + lseek(fd, 0, SEEK_SET); read(fd, buffer, filesize); - fstat(fd, &file_stat); - *last_update = file_stat.st_mtime; - // Free memory - for (; *line >= 0; --(*line)) - free((*list)[*line]); - *line = 0; - - *list = (char **) malloc(sizeof(char*) * allocated); + array = (char **) malloc(sizeof(char*) * allocated); + *size = 0; tok = strtok(buffer, "\r\n"); while (tok != NULL) { - if (*line >= allocated) { + if (*size >= allocated) { // Double our allocation and re-allocate allocated = allocated * 2; - *list = (char **) realloc((*list), sizeof(char*) * allocated); + array = (char **) realloc(array, sizeof(char*) * allocated); } if (strlen(tok)) { - (*list)[*line] = malloc(strlen(tok)); - strcpy((*list)[*line], tok); - ++(*line); + array[*size] = malloc(strlen(tok)); + strcpy(array[*size], tok); + ++(*size); } tok = strtok(NULL, "\r\n"); } + free(buffer); + return array; +} + +int load_hide_list(const int fd) { + int i; + struct stat file_stat; + + fstat(fd, &file_stat); + if (file_stat.st_mtime == last_update) { + return 0; + } + + // Free memory + for(i = 0; i < hide_size; ++i) + free(hide_list[i]); + free(hide_list); + + hide_list = file_to_str_arr(fd, &hide_size); + + fstat(fd, &file_stat); + last_update = file_stat.st_mtime; printf("Get package name from config:\n"); - for(i = 0; i < *line; i++) - printf("%s\n", (*list)[i]); + for(i = 0; i < hide_size; i++) + printf("%s\n", hide_list[i]); printf("\n"); - free(buffer); } int main(int argc, char **argv, char **envp) { - int line = -1, i; - char **list; - time_t last_update = 0; + int i; - int fd = open(HIDE_LIST, O_RDONLY); - if (fd == -1){ - printf("Error opening file\n"); + int hide_fd = open(HIDE_LIST, O_RDONLY); + if (hide_fd == -1){ + printf("Error opening hide list\n"); exit(1); } + int mount_fd = open(MOUNT_LIST, O_RDONLY); + if (mount_fd == -1){ + printf("Error opening mount list\n"); + exit(1); + } + + mount_list = file_to_str_arr(mount_fd, &mount_size); + close(mount_fd); + char buffer[512]; FILE *p = popen("while true;do logcat -b events -v raw -s am_proc_start;sleep 1;done", "r"); while(!feof(p)) { - loadList(fd, &list, &line, &last_update); + load_hide_list(hide_fd); //Format of am_proc_start is (as of Android 5.1 and 6.0) //UserID, pid, unix uid, processName, hostingType, hostingName @@ -126,19 +153,26 @@ int main(int argc, char **argv, char **envp) { if(ret != 6) { continue; } - for (i = 0; i < line; ++i) { - if(strstr(processName, list[i]) != NULL) { + for (i = 0; i < hide_size; ++i) { + if(strstr(processName, hide_list[i]) != NULL) { printf("Disabling for process = %s, PID = %d, UID = %d\n", processName, pid, uid); hideMagisk(pid); + break; } } } - close(fd); pclose(p); - for (; line >= 0; line--) - free(list[line]); - free(list); + close(hide_fd); + + // Free memory + for(i = 0; i < hide_size; ++i) + free(hide_list[i]); + free(hide_list); + + for(i = 0; i < mount_size; ++i) + free(mount_list[i]); + free(mount_list); return 0; } diff --git a/zip_static/arm/magiskhide b/zip_static/arm/magiskhide index 86de8aca6..a51f9b27a 100644 Binary files a/zip_static/arm/magiskhide and b/zip_static/arm/magiskhide differ diff --git a/zip_static/common/magic_mask.sh b/zip_static/common/magic_mask.sh index 77281f74c..cd00ff19b 100644 --- a/zip_static/common/magic_mask.sh +++ b/zip_static/common/magic_mask.sh @@ -2,8 +2,11 @@ LOGFILE=/cache/magisk.log IMG=/data/magisk.img +MOUNTLIST=/dev/mountlist -COREDIR=/magisk/.core +MOUNTPOINT=/magisk + +COREDIR=$MOUNTPOINT/.core DUMMDIR=$COREDIR/dummy MIRRDIR=$COREDIR/mirror @@ -38,7 +41,7 @@ unblock() { } run_scripts() { - BASE=/magisk + BASE=$MOUNTPOINT if [ "$1" = "post-fs" ]; then BASE=/cache/magisk fi @@ -137,8 +140,12 @@ travel() { bind_mount() { if [ -e "$1" -a -e "$2" ]; then mount -o bind $1 $2 - if [ "$?" -eq "0" ]; then log_print "Mount: $1"; - else log_print "Mount Fail: $1"; fi + if [ "$?" -eq "0" ]; then + log_print "Mount: $1" + echo $2 >> $MOUNTLIST + else + log_print "Mount Fail: $1" + fi fi } @@ -260,6 +267,8 @@ case $1 in # Live patch sepolicy /data/magisk/sepolicy-inject --live -s su + [ ! -d "$MOUNTPOINT" ] && mkdir -p $MOUNTPOINT + # Cache support if [ -d "/cache/data_bin" ]; then rm -rf /data/busybox /data/magisk @@ -280,14 +289,14 @@ case $1 in merge_image /data/magisk_merge.img # Mount magisk.img - if [ `cat /proc/mounts | grep /magisk >/dev/null 2>&1; echo $?` -ne 0 ]; then + if [ `cat /proc/mounts | grep $MOUNTPOINT >/dev/null 2>&1; echo $?` -ne 0 ]; then loopsetup $IMG if [ ! -z "$LOOPDEVICE" ]; then - mount -t ext4 -o rw,noatime $LOOPDEVICE /magisk + mount -t ext4 -o rw,noatime $LOOPDEVICE $MOUNTPOINT fi fi - if [ `cat /proc/mounts | grep /magisk >/dev/null 2>&1; echo $?` -ne 0 ]; then + if [ `cat /proc/mounts | grep $MOUNTPOINT >/dev/null 2>&1; echo $?` -ne 0 ]; then log_print "magisk.img mount failed, nothing to do :(" unblock fi @@ -295,14 +304,14 @@ case $1 in log_print "Preparing modules" # First do cleanups rm -rf $DUMMDIR - rmdir $(find /magisk -type d -depth ! -path "*core*" ) 2>/dev/null + rmdir $(find $MOUNTPOINT -type d -depth ! -path "*core*" ) 2>/dev/null rm -rf $COREDIR/bin mkdir -p $DUMMDIR mkdir -p $MIRRDIR/system # Travel through all mods - for MOD in /magisk/* ; do + for MOD in $MOUNTPOINT/* ; do if [ -f "$MOD/remove" ]; then log_print "Remove module: $MOD" rm -rf $MOD @@ -325,7 +334,7 @@ case $1 in fi # Unmount, shrink, remount - if [ `umount /magisk >/dev/null 2>&1; echo $?` -eq 0 ]; then + if [ `umount $MOUNTPOINT >/dev/null 2>&1; echo $?` -eq 0 ]; then losetup -d $LOOPDEVICE target_size_check $IMG NEWDATASIZE=$(((curUsedM / 32 + 2) * 32)) @@ -335,17 +344,17 @@ case $1 in fi loopsetup $IMG if [ ! -z "$LOOPDEVICE" ]; then - mount -t ext4 -o rw,noatime $LOOPDEVICE /magisk + mount -t ext4 -o rw,noatime $LOOPDEVICE $MOUNTPOINT fi fi - if [ `cat /proc/mounts | grep /magisk >/dev/null 2>&1; echo $?` -ne 0 ]; then + if [ `cat /proc/mounts | grep $MOUNTPOINT >/dev/null 2>&1; echo $?` -ne 0 ]; then log_print "magisk.img mount failed, nothing to do :(" unblock fi # Remove crap folder - rm -rf /magisk/lost+found + rm -rf $MOUNTPOINT/lost+found # Start doing tasks @@ -400,8 +409,16 @@ case $1 in run_scripts service # Enable magiskhide + [ ! -f "$COREDIR/magiskhide/hidelist" ] && mktouch $COREDIR/magiskhide/hidelist + # Add preset for Safety Net + if [ $(grep -c "com.google.android.gms.unstable" $COREDIR/magiskhide/hidelist) -eq "0" ]; then + mv $COREDIR/magiskhide/hidelist $COREDIR/magiskhide/hidelist.tmp + echo "com.google.android.gms.unstable" > $COREDIR/magiskhide/hidelist + cat $COREDIR/magiskhide/hidelist.tmp >> $COREDIR/magiskhide/hidelist + fi log_print "Starting Magisk Hide" - /data/magisk/magiskhide & + (/data/magisk/magiskhide &) + ;; esac diff --git a/zip_static/x86/magiskhide b/zip_static/x86/magiskhide index a3a1adf07..c2d149cda 100644 Binary files a/zip_static/x86/magiskhide and b/zip_static/x86/magiskhide differ