From 045769565a73c1c6e475d560e709bfe2c2bcb668 Mon Sep 17 00:00:00 2001 From: unkn0wName Date: Wed, 29 Mar 2023 08:33:09 +0800 Subject: [PATCH 01/38] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PermissionManager/.gitignore | 15 + PermissionManager/.idea/.gitignore | 3 + PermissionManager/.idea/compiler.xml | 6 + PermissionManager/.idea/gradle.xml | 20 + PermissionManager/.idea/misc.xml | 22 + PermissionManager/app/.gitignore | 1 + PermissionManager/app/build.gradle | 53 + PermissionManager/app/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.java | 26 + .../app/src/main/AndroidManifest.xml | 28 + PermissionManager/app/src/main/assets/su | Bin 0 -> 193872 bytes .../app/src/main/cpp/CMakeLists.txt | 52 + PermissionManager/app/src/main/cpp/root.cpp | 265 ++++ .../Adapter/SelectAppRecyclerAdapter.java | 110 ++ .../linux/permissionmanager/MainActivity.java | 457 ++++++ .../Model/PopupWindowOnTouchClose.java | 48 + .../Model/SelectAppRecyclerItem.java | 40 + .../Utils/ScreenInfoUtils.java | 187 +++ .../drawable-v24/ic_launcher_foreground.xml | 30 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../app/src/main/res/drawable/line.xml | 12 + .../src/main/res/drawable/line_drawable.xml | 9 + .../app/src/main/res/drawable/ripple_grey.xml | 6 + .../res/drawable/shape_wnd_grey_corner.xml | 9 + .../app/src/main/res/drawable/thumb.xml | 11 + .../src/main/res/drawable/thumb_drawable.xml | 9 + .../app/src/main/res/layout/activity_main.xml | 176 +++ .../res/layout/select_app_recycler_item.xml | 54 + .../src/main/res/layout/select_app_wnd.xml | 56 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes .../app/src/main/res/values-night/themes.xml | 16 + .../app/src/main/res/values/colors.xml | 13 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/themes.xml | 26 + .../permissionmanager/ExampleUnitTest.java | 17 + PermissionManager/appKey.jks | Bin 0 -> 2192 bytes PermissionManager/build.gradle | 5 + PermissionManager/gradle.properties | 23 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + PermissionManager/gradlew | 185 +++ PermissionManager/gradlew.bat | 89 ++ PermissionManager/settings.gradle | 20 + README.md | 15 + ScreenCap/1.png | Bin 0 -> 456580 bytes ScreenCap/2.png | Bin 0 -> 310933 bytes ScreenCap/3.png | Bin 0 -> 636423 bytes ScreenCap/4.png | Bin 0 -> 30185 bytes find_kernel_func/find_cred_has_capability.exe | Bin 0 -> 23552 bytes find_kernel_func/find_do_execve.exe | Bin 0 -> 15360 bytes find_kernel_func/find_setresuid.exe | Bin 0 -> 119296 bytes patch_kernel_root/ArmAsmHelper.h | 93 ++ patch_kernel_root/patch_kernel_root.cpp | 273 ++++ su/base64.cpp | 96 ++ su/base64.h | 6 + su/jni/Android.mk | 14 + su/jni/Application.mk | 2 + su/log.h | 16 + su/su.cpp | 168 +++ su/su.h | 62 + su/su.vcxproj | 98 ++ su/su.vcxproj.filters | 27 + su/su.vcxproj.user | 4 + su/su_hide_path_utils.h | 200 +++ suTest/.gitignore | 15 + suTest/.idea/.gitignore | 3 + suTest/.idea/compiler.xml | 6 + suTest/.idea/encodings.xml | 4 + suTest/.idea/gradle.xml | 22 + suTest/.idea/jarRepositories.xml | 25 + suTest/.idea/misc.xml | 9 + suTest/app/.gitignore | 1 + suTest/app/build.gradle | 41 + suTest/app/proguard-rules.pro | 21 + .../linux/sutest/ExampleInstrumentedTest.java | 26 + suTest/app/src/main/AndroidManifest.xml | 24 + .../java/com/linux/sutest/MainActivity.java | 117 ++ .../drawable-v24/ic_launcher_foreground.xml | 30 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../app/src/main/res/layout/activity_main.xml | 43 + suTest/app/src/main/res/menu/menu_main.xml | 10 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3593 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5339 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2636 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3388 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4926 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7472 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7909 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11873 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10652 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16570 bytes .../app/src/main/res/navigation/nav_graph.xml | 28 + .../app/src/main/res/values-night/themes.xml | 16 + suTest/app/src/main/res/values/colors.xml | 10 + suTest/app/src/main/res/values/dimens.xml | 3 + suTest/app/src/main/res/values/strings.xml | 12 + suTest/app/src/main/res/values/themes.xml | 25 + .../com/linux/sutest/ExampleUnitTest.java | 17 + suTest/build.gradle | 24 + suTest/gradle.properties | 19 + suTest/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + suTest/gradlew | 172 +++ suTest/gradlew.bat | 84 ++ suTest/settings.gradle | 2 + testRoot/README.md | 13 - testRoot/base64.cpp | 96 ++ testRoot/base64.h | 6 + testRoot/init64_process_helper.h | 72 + testRoot/jni/Android.mk | 2 +- testRoot/kernel_root_helper.h | 108 ++ testRoot/kernel_root_key.h | 4 + testRoot/maps_helper.h | 87 ++ testRoot/myself_path_utils.h | 23 + testRoot/process64_inject.cpp | 1333 +++++++++++++++++ testRoot/process64_inject.h | 52 + testRoot/process_cmdline_utils.h | 203 +++ testRoot/ptrace_arm64_utils.cpp | 59 +- testRoot/ptrace_arm64_utils.h | 15 +- testRoot/random_utils.h | 20 + testRoot/safe_fork_helper.h | 246 +++ testRoot/so_symbol_parser.h | 87 ++ testRoot/su_install_helper.cpp | 191 +++ testRoot/su_install_helper.h | 12 + testRoot/testRoot.cpp | 209 +++ testRoot/testRoot.h | 27 + testRoot/testRoot.vcxproj | 26 +- testRoot/testRoot.vcxproj.filters | 26 +- 141 files changed, 7236 insertions(+), 59 deletions(-) create mode 100644 PermissionManager/.gitignore create mode 100644 PermissionManager/.idea/.gitignore create mode 100644 PermissionManager/.idea/compiler.xml create mode 100644 PermissionManager/.idea/gradle.xml create mode 100644 PermissionManager/.idea/misc.xml create mode 100644 PermissionManager/app/.gitignore create mode 100644 PermissionManager/app/build.gradle create mode 100644 PermissionManager/app/proguard-rules.pro create mode 100644 PermissionManager/app/src/androidTest/java/com/linux/permissionmanager/ExampleInstrumentedTest.java create mode 100644 PermissionManager/app/src/main/AndroidManifest.xml create mode 100644 PermissionManager/app/src/main/assets/su create mode 100644 PermissionManager/app/src/main/cpp/CMakeLists.txt create mode 100644 PermissionManager/app/src/main/cpp/root.cpp create mode 100644 PermissionManager/app/src/main/java/com/linux/permissionmanager/Adapter/SelectAppRecyclerAdapter.java create mode 100644 PermissionManager/app/src/main/java/com/linux/permissionmanager/MainActivity.java create mode 100644 PermissionManager/app/src/main/java/com/linux/permissionmanager/Model/PopupWindowOnTouchClose.java create mode 100644 PermissionManager/app/src/main/java/com/linux/permissionmanager/Model/SelectAppRecyclerItem.java create mode 100644 PermissionManager/app/src/main/java/com/linux/permissionmanager/Utils/ScreenInfoUtils.java create mode 100644 PermissionManager/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 PermissionManager/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 PermissionManager/app/src/main/res/drawable/line.xml create mode 100644 PermissionManager/app/src/main/res/drawable/line_drawable.xml create mode 100644 PermissionManager/app/src/main/res/drawable/ripple_grey.xml create mode 100644 PermissionManager/app/src/main/res/drawable/shape_wnd_grey_corner.xml create mode 100644 PermissionManager/app/src/main/res/drawable/thumb.xml create mode 100644 PermissionManager/app/src/main/res/drawable/thumb_drawable.xml create mode 100644 PermissionManager/app/src/main/res/layout/activity_main.xml create mode 100644 PermissionManager/app/src/main/res/layout/select_app_recycler_item.xml create mode 100644 PermissionManager/app/src/main/res/layout/select_app_wnd.xml create mode 100644 PermissionManager/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 PermissionManager/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 PermissionManager/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 PermissionManager/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 PermissionManager/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 PermissionManager/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 PermissionManager/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 PermissionManager/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 PermissionManager/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 PermissionManager/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 PermissionManager/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 PermissionManager/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 PermissionManager/app/src/main/res/values-night/themes.xml create mode 100644 PermissionManager/app/src/main/res/values/colors.xml create mode 100644 PermissionManager/app/src/main/res/values/strings.xml create mode 100644 PermissionManager/app/src/main/res/values/themes.xml create mode 100644 PermissionManager/app/src/test/java/com/linux/permissionmanager/ExampleUnitTest.java create mode 100644 PermissionManager/appKey.jks create mode 100644 PermissionManager/build.gradle create mode 100644 PermissionManager/gradle.properties create mode 100644 PermissionManager/gradle/wrapper/gradle-wrapper.jar create mode 100644 PermissionManager/gradle/wrapper/gradle-wrapper.properties create mode 100644 PermissionManager/gradlew create mode 100644 PermissionManager/gradlew.bat create mode 100644 PermissionManager/settings.gradle create mode 100644 README.md create mode 100644 ScreenCap/1.png create mode 100644 ScreenCap/2.png create mode 100644 ScreenCap/3.png create mode 100644 ScreenCap/4.png create mode 100644 find_kernel_func/find_cred_has_capability.exe create mode 100644 find_kernel_func/find_do_execve.exe create mode 100644 find_kernel_func/find_setresuid.exe create mode 100644 patch_kernel_root/ArmAsmHelper.h create mode 100644 patch_kernel_root/patch_kernel_root.cpp create mode 100644 su/base64.cpp create mode 100644 su/base64.h create mode 100644 su/jni/Android.mk create mode 100644 su/jni/Application.mk create mode 100644 su/log.h create mode 100644 su/su.cpp create mode 100644 su/su.h create mode 100644 su/su.vcxproj create mode 100644 su/su.vcxproj.filters create mode 100644 su/su.vcxproj.user create mode 100644 su/su_hide_path_utils.h create mode 100644 suTest/.gitignore create mode 100644 suTest/.idea/.gitignore create mode 100644 suTest/.idea/compiler.xml create mode 100644 suTest/.idea/encodings.xml create mode 100644 suTest/.idea/gradle.xml create mode 100644 suTest/.idea/jarRepositories.xml create mode 100644 suTest/.idea/misc.xml create mode 100644 suTest/app/.gitignore create mode 100644 suTest/app/build.gradle create mode 100644 suTest/app/proguard-rules.pro create mode 100644 suTest/app/src/androidTest/java/com/linux/sutest/ExampleInstrumentedTest.java create mode 100644 suTest/app/src/main/AndroidManifest.xml create mode 100644 suTest/app/src/main/java/com/linux/sutest/MainActivity.java create mode 100644 suTest/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 suTest/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 suTest/app/src/main/res/layout/activity_main.xml create mode 100644 suTest/app/src/main/res/menu/menu_main.xml create mode 100644 suTest/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 suTest/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 suTest/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 suTest/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 suTest/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 suTest/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 suTest/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 suTest/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 suTest/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 suTest/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 suTest/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 suTest/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 suTest/app/src/main/res/navigation/nav_graph.xml create mode 100644 suTest/app/src/main/res/values-night/themes.xml create mode 100644 suTest/app/src/main/res/values/colors.xml create mode 100644 suTest/app/src/main/res/values/dimens.xml create mode 100644 suTest/app/src/main/res/values/strings.xml create mode 100644 suTest/app/src/main/res/values/themes.xml create mode 100644 suTest/app/src/test/java/com/linux/sutest/ExampleUnitTest.java create mode 100644 suTest/build.gradle create mode 100644 suTest/gradle.properties create mode 100644 suTest/gradle/wrapper/gradle-wrapper.jar create mode 100644 suTest/gradle/wrapper/gradle-wrapper.properties create mode 100644 suTest/gradlew create mode 100644 suTest/gradlew.bat create mode 100644 suTest/settings.gradle delete mode 100644 testRoot/README.md create mode 100644 testRoot/base64.cpp create mode 100644 testRoot/base64.h create mode 100644 testRoot/init64_process_helper.h create mode 100644 testRoot/kernel_root_helper.h create mode 100644 testRoot/kernel_root_key.h create mode 100644 testRoot/maps_helper.h create mode 100644 testRoot/myself_path_utils.h create mode 100644 testRoot/process64_inject.cpp create mode 100644 testRoot/process64_inject.h create mode 100644 testRoot/process_cmdline_utils.h create mode 100644 testRoot/random_utils.h create mode 100644 testRoot/safe_fork_helper.h create mode 100644 testRoot/so_symbol_parser.h create mode 100644 testRoot/su_install_helper.cpp create mode 100644 testRoot/su_install_helper.h create mode 100644 testRoot/testRoot.cpp create mode 100644 testRoot/testRoot.h diff --git a/PermissionManager/.gitignore b/PermissionManager/.gitignore new file mode 100644 index 00000000..aa724b77 --- /dev/null +++ b/PermissionManager/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/PermissionManager/.idea/.gitignore b/PermissionManager/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/PermissionManager/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/PermissionManager/.idea/compiler.xml b/PermissionManager/.idea/compiler.xml new file mode 100644 index 00000000..fb7f4a8a --- /dev/null +++ b/PermissionManager/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/PermissionManager/.idea/gradle.xml b/PermissionManager/.idea/gradle.xml new file mode 100644 index 00000000..526b4c25 --- /dev/null +++ b/PermissionManager/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/PermissionManager/.idea/misc.xml b/PermissionManager/.idea/misc.xml new file mode 100644 index 00000000..73acc52f --- /dev/null +++ b/PermissionManager/.idea/misc.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/PermissionManager/app/.gitignore b/PermissionManager/app/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/PermissionManager/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/PermissionManager/app/build.gradle b/PermissionManager/app/build.gradle new file mode 100644 index 00000000..4147f11e --- /dev/null +++ b/PermissionManager/app/build.gradle @@ -0,0 +1,53 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdk 31 + + defaultConfig { + applicationId "com.linux.permissionmanager" + minSdk 23 + targetSdk 31 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + externalNativeBuild { + cmake { + cppFlags '-std=c++17' + abiFilters "arm64-v8a" //需要什么构架的so,就在这边添加即 + } + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + externalNativeBuild { + cmake { + path file('src/main/cpp/CMakeLists.txt') + version '3.18.1' + } + } + buildFeatures { + viewBinding true + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'com.google.android.material:material:1.5.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' +} \ No newline at end of file diff --git a/PermissionManager/app/proguard-rules.pro b/PermissionManager/app/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/PermissionManager/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/PermissionManager/app/src/androidTest/java/com/linux/permissionmanager/ExampleInstrumentedTest.java b/PermissionManager/app/src/androidTest/java/com/linux/permissionmanager/ExampleInstrumentedTest.java new file mode 100644 index 00000000..e63884ad --- /dev/null +++ b/PermissionManager/app/src/androidTest/java/com/linux/permissionmanager/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.linux.permissionmanager; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.linux.permissionmanager", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/PermissionManager/app/src/main/AndroidManifest.xml b/PermissionManager/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..ac7de7ed --- /dev/null +++ b/PermissionManager/app/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PermissionManager/app/src/main/assets/su b/PermissionManager/app/src/main/assets/su new file mode 100644 index 0000000000000000000000000000000000000000..caf06dfb2b8e26e8fdd80782721c3bf1d8e43435 GIT binary patch literal 193872 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 TqU*LMJ*Mg(pcAUdu%P%qg_Wxm literal 0 HcmV?d00001 diff --git a/PermissionManager/app/src/main/cpp/CMakeLists.txt b/PermissionManager/app/src/main/cpp/CMakeLists.txt new file mode 100644 index 00000000..d70571ec --- /dev/null +++ b/PermissionManager/app/src/main/cpp/CMakeLists.txt @@ -0,0 +1,52 @@ +# For more information about using CMake with Android Studio, read the +# documentation: https://d.android.com/studio/projects/add-native-code.html + +# Sets the minimum version of CMake required to build the native library. + +cmake_minimum_required(VERSION 3.18.1) + +# Declares and names the project. + +project("permissionmanager") + +# Creates and names a library, sets it as either STATIC +# or SHARED, and provides the relative paths to its source code. +# You can define multiple libraries, and CMake builds them for you. +# Gradle automatically packages shared libraries with your APK. + +add_library( # Sets the name of the library. + permissionmanager + + # Sets the library as a shared library. + SHARED + + # Provides a relative path to your source file(s). + ../../../../../testRoot/process64_inject.cpp + ../../../../../testRoot/ptrace_arm64_utils.cpp + ../../../../../testRoot/su_install_helper.cpp + ../../../../../testRoot/base64.cpp + root.cpp) + +# Searches for a specified prebuilt library and stores the path as a +# variable. Because CMake includes system libraries in the search path by +# default, you only need to specify the name of the public NDK library +# you want to add. CMake verifies that the library exists before +# completing its build. + +find_library( # Sets the name of the path variable. + log-lib + + # Specifies the name of the NDK library that + # you want CMake to locate. + log) + +# Specifies libraries CMake should link to your target library. You +# can link multiple libraries, such as libraries you define in this +# build script, prebuilt third-party libraries, or system libraries. + +target_link_libraries( # Specifies the target library. + permissionmanager + + # Links the target library to the log library + # included in the NDK. + ${log-lib}) \ No newline at end of file diff --git a/PermissionManager/app/src/main/cpp/root.cpp b/PermissionManager/app/src/main/cpp/root.cpp new file mode 100644 index 00000000..0ccf4702 --- /dev/null +++ b/PermissionManager/app/src/main/cpp/root.cpp @@ -0,0 +1,265 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../../../../testRoot/testRoot.h" +#include "../../../../../testRoot/kernel_root_helper.h" +#include "../../../../../testRoot/process64_inject.h" +#include "../../../../../testRoot/init64_process_helper.h" +#include "../../../../../testRoot/su_install_helper.h" + +using namespace std; + +std::string g_last_su_full_path; + +string getCapabilityInfo() +{ + __uid_t now_uid, now_euid, now_suid; + if (getresuid(&now_uid, &now_euid, &now_suid)) { + return "FAILED getresuid()"; + } + + + __gid_t now_gid, now_egid, now_sgid; + if (getresgid(&now_gid, &now_egid, &now_sgid)) { + return "FAILED getresgid()"; + } + + stringstream sstrCapInfo; + sstrCapInfo<< "Current process information:\n"; + sstrCapInfo<< "uid:"<pid = getpid(); + cap_header->version = _LINUX_CAPABILITY_VERSION_3; //_1、_2、_3 + + if (capget(cap_header, cap_data) < 0) { + return "FAILED capget()"; + // perror("FAILED capget()"); + //exit(1); + } + sstrCapInfo << "cap effective:" << hex <effective << "," << std::endl + <<"cap permitted:"<< hex << cap_data->permitted<< "," << std::endl + <<"cap inheritable:"<< hex <inheritable<< std::endl; + sstrCapInfo << "native check SELinux status:"<< (kernel_root::is_disable_selinux_status() ? "0" : "1") <<"\n"; + + FILE * fp = popen("getenforce", "r"); + if (fp) + { + char cmd[512] = { 0 }; + fread(cmd, 1, sizeof(cmd), fp); + pclose(fp); + + sstrCapInfo<< "read system SELinux status:"<< cmd; + } + + return sstrCapInfo.str(); +} + +extern "C" JNIEXPORT jint JNICALL +Java_com_linux_permissionmanager_MainActivity_getUid( + JNIEnv* env, + jobject /* this */) { + return getuid(); +} + +extern "C" JNIEXPORT jstring JNICALL +Java_com_linux_permissionmanager_MainActivity_getCapabilityInfo( + JNIEnv* env, + jobject /* this */) { + + return env->NewStringUTF(getCapabilityInfo().c_str()); +} + +extern "C" JNIEXPORT jint JNICALL +Java_com_linux_permissionmanager_MainActivity_getRoot( + JNIEnv* env, + jobject /* this */, + jstring rootKey) { + const char *str1 = env->GetStringUTFChars(rootKey, 0); + string strRootKey= str1; + env->ReleaseStringUTFChars(rootKey, str1); + + return kernel_root::get_root(strRootKey.c_str()); +} + +extern "C" JNIEXPORT jstring JNICALL +Java_com_linux_permissionmanager_MainActivity_runRootCmd( + JNIEnv* env, + jobject /* this */, + jstring rootKey, + jstring cmd) { + const char *str1 = env->GetStringUTFChars(rootKey, 0); + string strRootKey= str1; + env->ReleaseStringUTFChars(rootKey, str1); + + str1 = env->GetStringUTFChars(cmd, 0); + string strCmd= str1; + env->ReleaseStringUTFChars(cmd, str1); + + + ssize_t err; + string result = kernel_root::run_root_cmd(strRootKey.c_str(), strCmd.c_str(), err); + stringstream sstr; + sstr << "runRootCmd err:" << err << ", result:" << result; + return env->NewStringUTF(sstr.str().c_str()); +} + + +extern "C" JNIEXPORT jstring JNICALL +Java_com_linux_permissionmanager_MainActivity_runInit64ProcessCmd( + JNIEnv* env, + jobject /* this */, + jstring rootKey, + jstring cmd) { + const char *str1 = env->GetStringUTFChars(rootKey, 0); + string strRootKey= str1; + env->ReleaseStringUTFChars(rootKey, str1); + + str1 = env->GetStringUTFChars(cmd, 0); + string strCmd= str1; + env->ReleaseStringUTFChars(cmd, str1); + + + ssize_t err; + string result = safe_run_init64_cmd_wrapper(strRootKey.c_str(), strCmd.c_str(), err); + + stringstream sstr; + sstr << "runInit64Cmd err:" << err << ", result:" << result; + return env->NewStringUTF(sstr.str().c_str()); +} + +extern "C" JNIEXPORT jstring JNICALL +Java_com_linux_permissionmanager_MainActivity_installSu( + JNIEnv* env, + jobject /* this */, + jstring rootKey, + jstring basePath, + jstring originSuFullPath) { + + const char *str1 = env->GetStringUTFChars(rootKey, 0); + string strRootKey= str1; + env->ReleaseStringUTFChars(rootKey, str1); + + str1 = env->GetStringUTFChars(basePath, 0); + string strBasePath= str1; + env->ReleaseStringUTFChars(basePath, str1); + + str1 = env->GetStringUTFChars(originSuFullPath, 0); + string strOriginSuFullPath= str1; + env->ReleaseStringUTFChars(originSuFullPath, str1); + + stringstream sstr; + //安装su工具套件 + ssize_t err; + std::string su_hide_full_path = safe_install_su(strRootKey.c_str(), strBasePath.c_str(), strOriginSuFullPath.c_str(), err); + sstr << "install su err:" << err<<", su_hide_full_path:" << su_hide_full_path << std::endl; + g_last_su_full_path = su_hide_full_path; + if (err == 0) { + sstr << "installSu done."<< std::endl; + } + return env->NewStringUTF(sstr.str().c_str()); +} + +extern "C" JNIEXPORT jstring JNICALL +Java_com_linux_permissionmanager_MainActivity_getLastInstallSuFullPath( + JNIEnv* env, + jobject /* this */) { + return env->NewStringUTF(g_last_su_full_path.c_str()); +} + +extern "C" JNIEXPORT jstring JNICALL +Java_com_linux_permissionmanager_MainActivity_uninstallSu( + JNIEnv* env, + jobject /* this */, + jstring rootKey, + jstring basePath) { + + const char *str1 = env->GetStringUTFChars(rootKey, 0); + string strRootKey= str1; + env->ReleaseStringUTFChars(rootKey, str1); + + str1 = env->GetStringUTFChars(basePath, 0); + string strBasePath= str1; + env->ReleaseStringUTFChars(basePath, str1); + + stringstream sstr; + + ssize_t err = safe_uninstall_su(strRootKey.c_str(), strBasePath.c_str()); + sstr << "uninstallSu err:" << err << std::endl; + if (err != 0) { + return env->NewStringUTF(sstr.str().c_str()); + } + g_last_su_full_path.clear(); + sstr << "uninstallSu done."; + return env->NewStringUTF(sstr.str().c_str()); +} + +extern "C" JNIEXPORT jstring JNICALL +Java_com_linux_permissionmanager_MainActivity_autoSuEnvInject( + JNIEnv* env, + jobject /* this */, + jstring rootKey, + jstring targetProcessCmdline) { + + if(g_last_su_full_path.empty()) { + return env->NewStringUTF("【错误】请先安装部署su"); + } + const char *str1 = env->GetStringUTFChars(rootKey, 0); + string strRootKey= str1; + env->ReleaseStringUTFChars(rootKey, str1); + + str1 = env->GetStringUTFChars(targetProcessCmdline, 0); + string strTargetProcessCmdline = str1; + env->ReleaseStringUTFChars(targetProcessCmdline, str1); + + stringstream sstr; + + //杀光所有历史进程 + std::vector vOut; + ssize_t err = safe_find_all_cmdline_process(strRootKey.c_str(), strTargetProcessCmdline.c_str(), vOut); + sstr << "find_all_cmdline_process err:"<< err<<", cnt:"<NewStringUTF(sstr.str().c_str()); + } + std::string kill_cmd; + for (pid_t t : vOut) { + err = kill_process(strRootKey.c_str(), t); + sstr << "kill_ret err:"<< err << std::endl; + if (err != 0) { + return env->NewStringUTF(sstr.str().c_str()); + } + } + + pid_t pid; + err = safe_wait_and_find_cmdline_process(strRootKey.c_str(), strTargetProcessCmdline.c_str(), 60*1000, pid); + + std::string folder_path = g_last_su_full_path; + int n = folder_path.find_last_of("/"); + if(n != -1) { + folder_path = folder_path.substr(0,n); + } + sstr << "autoSuEnvInject("<< err<<", " << folder_path <<")" << std::endl; + if (err != 0) { + return env->NewStringUTF(sstr.str().c_str()); + } + err = safe_inject_process_env64_PATH_wrapper(strRootKey.c_str(), pid, folder_path.c_str()); + sstr << "autoSuEnvInject ret val:" << err << std::endl; + if (err != 0) { + return env->NewStringUTF(sstr.str().c_str()); + } + sstr << "autoSuEnvInject done."; + return env->NewStringUTF(sstr.str().c_str()); +} diff --git a/PermissionManager/app/src/main/java/com/linux/permissionmanager/Adapter/SelectAppRecyclerAdapter.java b/PermissionManager/app/src/main/java/com/linux/permissionmanager/Adapter/SelectAppRecyclerAdapter.java new file mode 100644 index 00000000..ee308d45 --- /dev/null +++ b/PermissionManager/app/src/main/java/com/linux/permissionmanager/Adapter/SelectAppRecyclerAdapter.java @@ -0,0 +1,110 @@ +package com.linux.permissionmanager.Adapter; + +import android.content.Context; +import android.os.Handler; +import android.os.Message; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.PopupWindow; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.linux.permissionmanager.Model.SelectAppRecyclerItem; +import com.linux.permissionmanager.R; + +import java.util.List; + +public class SelectAppRecyclerAdapter extends RecyclerView.Adapter { + + + + public static class ViewHolder extends RecyclerView.ViewHolder { + public View v; + public ImageView select_app_icon; + public TextView select_app_text; + public TextView select_package_name; + // TODO Auto-generated method stub + public ViewHolder(View v) { + super(v); + this.v = v; + } + + } + + private int resourceId; + private List objects; + private PopupWindow popupWindow; + private Handler selectAppItemCallback; + public SelectAppRecyclerAdapter(Context context, int textViewResourceId, List objects, PopupWindow popupWindow, Handler selectAppItemCallback) { + this.resourceId = textViewResourceId; + this.objects = objects; + this. popupWindow = popupWindow; + this. selectAppItemCallback = selectAppItemCallback; + } + + + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View v =LayoutInflater.from(parent.getContext()).inflate(resourceId,parent,false); + SelectAppRecyclerAdapter.ViewHolder holder = new SelectAppRecyclerAdapter.ViewHolder(v); + + holder.select_app_icon = v.findViewById(R.id.select_app_icon); + holder.select_app_text=v.findViewById(R.id.select_app_text) ; + holder.select_package_name=v.findViewById(R.id.select_package_name) ; + return holder; + } + + + @Override + public void onBindViewHolder(@NonNull SelectAppRecyclerAdapter.ViewHolder holder, int position) { + SelectAppRecyclerItem appItem=objects.get(position); //获取当前项的实例 + + //图标+进程PID+名字+内存 + holder.select_app_icon.setImageDrawable(appItem.getIcon()); + String showText=""+appItem.getShowName() +" " + +" "+" ("+appItem.getPackageName()+")"+""; + + holder.select_app_text.setText(Html.fromHtml(showText)); + holder.select_package_name.setText(appItem.getPackageName()); + + //item被点击 + holder.v.setOnClickListener(new ClickRecyclerItemListener(appItem)); + } + + + @Override + public int getItemCount() { + return objects.size(); + } + + @Override + public int getItemViewType(int position) { + return position; + } + + + class ClickRecyclerItemListener implements View.OnClickListener { + SelectAppRecyclerItem appItem; + public ClickRecyclerItemListener( SelectAppRecyclerItem appItem){ + this.appItem =appItem; + } + @Override + public void onClick(View v) { + popupWindow.dismiss(); + Message msg = new Message(); + msg.obj = (SelectAppRecyclerItem)appItem; + selectAppItemCallback.sendMessage(msg); + } + } + + + + +} diff --git a/PermissionManager/app/src/main/java/com/linux/permissionmanager/MainActivity.java b/PermissionManager/app/src/main/java/com/linux/permissionmanager/MainActivity.java new file mode 100644 index 00000000..1f17a2a8 --- /dev/null +++ b/PermissionManager/app/src/main/java/com/linux/permissionmanager/MainActivity.java @@ -0,0 +1,457 @@ +package com.linux.permissionmanager; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.ProgressDialog; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.graphics.Color; +import android.graphics.PixelFormat; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.linux.permissionmanager.Adapter.SelectAppRecyclerAdapter; +import com.linux.permissionmanager.Model.PopupWindowOnTouchClose; +import com.linux.permissionmanager.Model.SelectAppRecyclerItem; +import com.linux.permissionmanager.Utils.ScreenInfoUtils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +public class MainActivity extends AppCompatActivity { + + private String rootKey = "wxqI1MByBPNTLPwgzEsoVE9RRvvZIZNJ4XKEZnnYaPjHUURy"; + private String suBasePath = "/data/local/tmp"; + private String lastInputCmd = "id"; + + //保存的本地配置信息 + private SharedPreferences m_shareSave; + private ProgressDialog m_loadingDlg = null; + + // Used to load the 'permissionmanager' library on application startup. + static { + System.loadLibrary("permissionmanager"); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + + m_shareSave = getSharedPreferences("zhcs", Context.MODE_PRIVATE); + try { + rootKey = m_shareSave.getString("rootKey", rootKey); + } catch (Exception e) { + } + + //验证用户的KEY + final EditText inputKey = new EditText(MainActivity.this); + inputKey.setText(rootKey); + AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); + builder.setCancelable(false); + builder.setTitle("请输入ROOT权限的KEY").setIcon(android.R.drawable.ic_dialog_info).setView(inputKey) + .setPositiveButton("确定", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + rootKey = inputKey.getText().toString(); + //数值保存到本地 + SharedPreferences.Editor mEdit = m_shareSave.edit(); + mEdit.putString("rootKey", rootKey); + mEdit.commit(); + } + + ; + }); + builder.show(); + + + Button show_myself_info_btn = findViewById(R.id.show_myself_info_btn); + show_myself_info_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showConsoleMsg(getCapabilityInfo()); + } + }); + + Button get_root_btn = findViewById(R.id.get_root_btn); + get_root_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int ret = getRoot(rootKey); + showConsoleMsg("getRoot: " + ret); + } + }); + + Button run_root_cmd_btn = findViewById(R.id.run_root_cmd_btn); + run_root_cmd_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + final EditText inputCMD = new EditText(MainActivity.this); + inputCMD.setText(lastInputCmd); + inputCMD.setFocusable(true); + inputCMD.setSelection(inputCMD.length(), 0); + AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); + builder.setTitle("输入普通命令").setIcon(android.R.drawable.ic_dialog_info).setView(inputCMD) + .setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + String text = inputCMD.getText().toString(); + lastInputCmd = text; + showConsoleMsg(text + "\n" + runRootCmd(rootKey, text)); + } + }); + builder.show(); + + } + }); + Button run_init_process_cmd_btn = findViewById(R.id.run_init_process_cmd_btn); + run_init_process_cmd_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + final EditText inputCMD = new EditText(MainActivity.this); + inputCMD.setText(lastInputCmd); + inputCMD.setFocusable(true); + inputCMD.setSelection(inputCMD.length(), 0); + AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); + builder.setTitle("输入ROOT命令").setIcon(android.R.drawable.ic_dialog_info).setView(inputCMD) + .setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + String text = inputCMD.getText().toString(); + lastInputCmd = text; + showConsoleMsg(text + "\n" + runInit64ProcessCmd(rootKey, text)); + } + }); + builder.show(); + + } + }); + + Button su_env_install_btn = findViewById(R.id.su_env_install_btn); + su_env_install_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(getUid() == 0) { + showConsoleMsg("【错误】请重新打开APP,在普通权限下点击此按钮,不要将APP提升为ROOT"); + return; + } + //1.获取su工具文件路径 + String suOriginalFilePath = WirteSuToolsFilePath("su", MainActivity.this); + showConsoleMsg("su origin path:"+ suOriginalFilePath); + + //2.安装su工具 + String insRet = installSu(rootKey, suBasePath, suOriginalFilePath); + showConsoleMsg(insRet); + if(insRet.indexOf("installSu done.") == -1) { + return; + } + + //3.复制su的路径到剪贴板 + String suFullPath = getLastInstallSuFullPath(); + showConsoleMsg("lastInstallSuFullPath:" + suFullPath); + copyEditText(suFullPath); + Toast.makeText(v.getContext(), "su路径已复制到剪贴板", Toast.LENGTH_SHORT).show(); + + } + }); + + Button su_env_inject_btn = findViewById(R.id.su_env_inject_btn); + su_env_inject_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(getUid() == 0) { + showConsoleMsg("【错误】请重新打开APP,在普通权限下点击此按钮,不要将APP提升为ROOT"); + return; + } + showSelectAppWindow(); + } + }); + + Button clean_su_btn = findViewById(R.id.clean_su_btn); + clean_su_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + showConsoleMsg(uninstallSu(rootKey,suBasePath)); + } + }); + + Button copy_info_btn = findViewById(R.id.copy_info_btn); + copy_info_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + EditText edit = findViewById(R.id.console_edit); + copyEditText(edit.getText().toString()); + Toast.makeText(v.getContext(), "复制成功", Toast.LENGTH_SHORT).show(); + + } + }); + Button clean_info_btn = findViewById(R.id.clean_info_btn); + clean_info_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + cleanConsoleMsg(); + } + }); + } + + public void showConsoleMsg(String msg) { + EditText console_edit = findViewById(R.id.console_edit); + StringBuffer txt = new StringBuffer(); + txt.append(console_edit.getText().toString()); + if (txt.length() != 0) { + txt.append("\n"); + } + txt.append(msg); + txt.append("\n"); + console_edit.setText(txt.toString()); + console_edit.setSelection(txt.length()); + } + + public void cleanConsoleMsg() { + EditText console_edit = findViewById(R.id.console_edit); + console_edit.setText(""); + } + + public void copyEditText(String text) { + //获取剪贴板管理器: + ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + // 创建普通字符型ClipData + ClipData mClipData = ClipData.newPlainText("Label", text); + // 将ClipData内容放到系统剪贴板里。 + cm.setPrimaryClip(mClipData); + + } + + Handler selectAppItemCallback = new Handler() { + @Override + public void handleMessage(@NonNull Message msg) { + + SelectAppRecyclerItem appItem = (SelectAppRecyclerItem) msg.obj; + + if (m_loadingDlg == null) { + m_loadingDlg = new ProgressDialog(MainActivity.this); + m_loadingDlg.setCancelable(false); + } + m_loadingDlg.setTitle(""); + m_loadingDlg.setMessage("请现在手动启动APP [" + appItem.getShowName() + "]"); + m_loadingDlg.show(); + + new Thread() { + public void run() { + String ret = autoSuEnvInject(rootKey, appItem.getPackageName()); + runOnUiThread(new Runnable() { + public void run() { + showConsoleMsg(ret); + m_loadingDlg.cancel(); + + if(ret.indexOf("autoSuEnvInject done.")!= -1) { + //弹个提示,通知一下成功了 + AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this) + .setCancelable(false) + .setTitle("提示") + .setIcon(appItem.getIcon()) + .setMessage("已经授予ROOT权限到APP [" + appItem.getShowName() + "]") + .setNegativeButton("确定", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + AlertDialog dialog = builder.create(); + dialog.show(); + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.BLACK); + } + + } + }); + } + }.start(); + super.handleMessage(msg); + } + }; + + //显示选择应用程序窗口 + public void showSelectAppWindow() { + final PopupWindow popupWindow = new PopupWindow(this); + + View view = View.inflate(this, R.layout.select_app_wnd, null); + popupWindow.setContentView(view); + + popupWindow.setHeight(ViewGroup.LayoutParams.MATCH_PARENT); + popupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); + popupWindow.setBackgroundDrawable(new ColorDrawable(0x9B000000)); //阴影半透明 + popupWindow.setOutsideTouchable(true); + popupWindow.setFocusable(true); + popupWindow.setTouchable(true); + + //全屏 + View parent = View.inflate(MainActivity.this, R.layout.activity_main, null); + popupWindow.showAtLocation(parent, Gravity.NO_GRAVITY, 0, 0); + popupWindow.showAsDropDown(parent, 0, 0); + + popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { //窗口即将关闭 + + } + }); + + //设置中心布局大小 + final int screenWidth = ScreenInfoUtils.getRealWidth(this); + final int screenHeight = ScreenInfoUtils.getRealHeight(this); + + final double centerWidth = ((double) screenWidth) * 0.80; + final double centerHeight = ((double) screenHeight) * 0.90; + + LinearLayout center_layout = (LinearLayout) view.findViewById(R.id.center_layout); + android.view.ViewGroup.LayoutParams lp = center_layout.getLayoutParams(); + lp.width = (int) centerWidth; + lp.height = (int) centerHeight; + + //点击阴影部分可关闭窗口 + popupWindow.setTouchInterceptor(new PopupWindowOnTouchClose(popupWindow, + screenWidth, screenHeight, (int) centerWidth, (int) centerHeight)); + + //显示APP列表 + List appList = new ArrayList<>(); + + //获取已安装的APK列表 + List packages = getPackageManager().getInstalledPackages(0); + + //先判断cmdline与包名是否完全相同 + for (int i = 0; i < packages.size(); i++) { + PackageInfo packageInfo = packages.get(i); + + if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { + //系统应用 + continue; + } + String showName = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString(); + + Drawable icon = packageInfo.applicationInfo.loadIcon(getPackageManager()); + + String packageName = packageInfo.applicationInfo.packageName; + if(packageName.equals(getPackageName())){ + //不显示自己 + continue; + } + //加入到显示APP列表 + appList.add(new SelectAppRecyclerItem( + icon, + showName, + packageName)); + } + for (int i = 0; i < packages.size(); i++) { + PackageInfo packageInfo = packages.get(i); + + if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { + //非系统应用 + continue; + } + + String showName = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString(); + + Drawable icon = packageInfo.applicationInfo.loadIcon(getPackageManager()); + + String packageName = packageInfo.applicationInfo.packageName; + + //加入到显示APP列表 + appList.add(new SelectAppRecyclerItem( + icon, + showName, + packageName)); + } + + SelectAppRecyclerAdapter adapter = new SelectAppRecyclerAdapter( + MainActivity.this, R.layout.select_app_recycler_item, appList, popupWindow, selectAppItemCallback); + + RecyclerView select_app_recycler_view = (RecyclerView) view.findViewById(R.id.select_app_recycler_view); + // 设置布局管理器 + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); + linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); + select_app_recycler_view.setLayoutManager(linearLayoutManager); + select_app_recycler_view.setAdapter(adapter); + + } + + public static String WirteSuToolsFilePath(String suName, Context context) { + String suFilePath = ""; + try { + suFilePath = context.getFilesDir().getPath() + "/" + suName; + File file = new File(suFilePath); + if (!file.exists()) { + if (!file.getParentFile().exists()) file.getParentFile().mkdirs(); + file.createNewFile(); + } + if (file.exists()) { + InputStream inputStream = context.getAssets().open(suName); + FileOutputStream outputStream = new FileOutputStream(file); + byte[] content = new byte[1024]; + while (inputStream.read(content) > 0) { + outputStream.write(content); + } + inputStream.close(); + outputStream.flush(); + outputStream.close(); + } + } catch (Exception e) { + } + return suFilePath; + } + + public native int getUid(); + + public native String getCapabilityInfo(); + + public native int getRoot(String rootKey); + + public native String runRootCmd(String rootKey, String cmd); + + public native String runInit64ProcessCmd(String rootKey, String cmd); + + public native String installSu(String rootKey, String basePath, String originSuFullPath); + + public native String getLastInstallSuFullPath(); + + public native String uninstallSu(String rootKey, String basePath); + + public native String autoSuEnvInject(String rootKey, String targetProcessCmdline); +} \ No newline at end of file diff --git a/PermissionManager/app/src/main/java/com/linux/permissionmanager/Model/PopupWindowOnTouchClose.java b/PermissionManager/app/src/main/java/com/linux/permissionmanager/Model/PopupWindowOnTouchClose.java new file mode 100644 index 00000000..ca4889d7 --- /dev/null +++ b/PermissionManager/app/src/main/java/com/linux/permissionmanager/Model/PopupWindowOnTouchClose.java @@ -0,0 +1,48 @@ +package com.linux.permissionmanager.Model; + +import android.view.MotionEvent; +import android.view.View; +import android.widget.PopupWindow; + +public class PopupWindowOnTouchClose implements View.OnTouchListener { + private boolean lastVailedDown = true; + private int screenWidth, screenHeight, centerWidth, centerHeight; + private PopupWindow popupWindow; + + public PopupWindowOnTouchClose(PopupWindow popupWindow, int screenWidth, int screenHeight, int centerWidth, int centerHeight) { + this.popupWindow = popupWindow; + this.screenWidth = screenWidth; + this.screenHeight = screenHeight; + this.centerWidth = centerWidth; + this.centerHeight = centerHeight; + } + + private boolean isValiedRegion(View v, MotionEvent event) { + int x = (int) event.getX(); + int y = (int) event.getY(); + double wndLeft = (screenWidth - centerWidth) / 2; + double wndTop = (screenHeight - centerHeight) / 2; + if (x < wndLeft || x > wndLeft + centerWidth || y < wndTop || y > wndTop + centerHeight) { + return false; + } + return true; + } + + @Override + public boolean onTouch(View v, MotionEvent event) { + + if (event.getAction() == MotionEvent.ACTION_DOWN) { + lastVailedDown = isValiedRegion(v, event); + } else if (event.getAction() == MotionEvent.ACTION_UP) { + if (!lastVailedDown) { + if (!isValiedRegion(v, event)) { + popupWindow.dismiss(); + } + } + } + return false; + } +} + + + diff --git a/PermissionManager/app/src/main/java/com/linux/permissionmanager/Model/SelectAppRecyclerItem.java b/PermissionManager/app/src/main/java/com/linux/permissionmanager/Model/SelectAppRecyclerItem.java new file mode 100644 index 00000000..0a2eecba --- /dev/null +++ b/PermissionManager/app/src/main/java/com/linux/permissionmanager/Model/SelectAppRecyclerItem.java @@ -0,0 +1,40 @@ +package com.linux.permissionmanager.Model; + +import android.graphics.drawable.Drawable; + +public class SelectAppRecyclerItem { + private Drawable icon=null; + private String showName; + private String packageName; + + public SelectAppRecyclerItem(Drawable icon, String showName, String packageName){ + this.icon=icon; + this.showName = showName; + this.packageName = packageName; + } + + public Drawable getIcon() { + return icon; + } + + public void setIcon(Drawable icon) { + this.icon = icon; + } + + public String getShowName() { + return showName; + } + + public void setShowName(String showName) { + this.showName = showName; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + +} diff --git a/PermissionManager/app/src/main/java/com/linux/permissionmanager/Utils/ScreenInfoUtils.java b/PermissionManager/app/src/main/java/com/linux/permissionmanager/Utils/ScreenInfoUtils.java new file mode 100644 index 00000000..5e50159e --- /dev/null +++ b/PermissionManager/app/src/main/java/com/linux/permissionmanager/Utils/ScreenInfoUtils.java @@ -0,0 +1,187 @@ +package com.linux.permissionmanager.Utils; + +import android.app.Activity; +import android.content.Context; +import android.content.res.Resources; +import android.util.DisplayMetrics; +import android.util.Log; +import android.util.TypedValue; +import android.view.Display; +import android.view.WindowManager; + +/** + * Get Screen Information Utils + * + * @author yh + * @date 2018/12/18. + */ +public class ScreenInfoUtils { + + private static final String TAG = "ScreenInfoUtils"; + + /** + * Get Screen Width + */ + public static int getScreenWidth(Context context) { + return getDisplayMetrics(context).widthPixels; + } + + /** + * Get Screen Height + */ + public static int getScreenHeight(Context context) { + return getDisplayMetrics(context).heightPixels; + } + + + /** + * Get Screen Real Height + * + * @param context Context + * @return Real Height + */ + public static int getRealHeight(Context context) { + Display display = getDisplay(context); + if (display == null) { + return 0; + } + DisplayMetrics dm = new DisplayMetrics(); + display.getRealMetrics(dm); + return dm.heightPixels; + } + + /** + * Get Screen Real Width + * + * @param context Context + * @return Real Width + */ + public static int getRealWidth(Context context) { + Display display = getDisplay(context); + if (display == null) { + return 0; + } + DisplayMetrics dm = new DisplayMetrics(); + display.getRealMetrics(dm); + return dm.widthPixels; + } + + /** + * Get StatusBar Height + */ + public static int getStatusBarHeight(Context mContext) { + int resourceId = mContext.getResources().getIdentifier("status_bar_height", "dimen", "android"); + if (resourceId > 0) { + return mContext.getResources().getDimensionPixelSize(resourceId); + } + return 0; + } + + /** + * Get ActionBar Height + */ + public static int getActionBarHeight(Context mContext) { + TypedValue tv = new TypedValue(); + if (mContext.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) { + return TypedValue.complexToDimensionPixelSize(tv.data, mContext.getResources().getDisplayMetrics()); + } + return 0; + } + + /** + * Get NavigationBar Height + */ + public static int getNavigationBarHeight(Context mContext) { + Resources resources = mContext.getResources(); + int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); + if (resourceId > 0) { + return resources.getDimensionPixelSize(resourceId); + } + return 0; + } + + /** + * Get Density + */ + private static float getDensity(Context context) { + return getDisplayMetrics(context).density; + } + + /** + * Get Dpi + */ + private static int getDpi(Context context) { + return getDisplayMetrics(context).densityDpi; + } + + /** + * Get Display + * + * @param context Context for get WindowManager + * @return Display + */ + private static Display getDisplay(Context context) { + WindowManager wm; + if (context instanceof Activity) { + Activity activity = (Activity) context; + wm = activity.getWindowManager(); + } else { + wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + } + if (wm != null) { + return wm.getDefaultDisplay(); + } + return null; + } + + /** + * Get DisplayMetrics + * + * @param context Context for get Resources + * @return DisplayMetrics + */ + private static DisplayMetrics getDisplayMetrics(Context context) { + return context.getResources().getDisplayMetrics(); + } + + + /** + * Get ScreenInfo + */ + private static String getScreenInfo(Context context) { + return " \n" + + "--------ScreenInfo--------" + "\n" + + "Screen Width : " + getScreenWidth(context) + "px\n" + + "Screen RealWidth :" + getRealWidth(context) + "px\n" + + "Screen Height: " + getScreenHeight(context) + "px\n" + + "Screen RealHeight: " + getRealHeight(context) + "px\n" + + "Screen StatusBar Height: " + getStatusBarHeight(context)+ "px\n" + + "Screen ActionBar Height: " + getActionBarHeight(context)+ "px\n" + + "Screen NavigationBar Height: " + getNavigationBarHeight(context)+ "px\n" + + "Screen Dpi: " + getDpi(context) + "\n" + + "Screen Density: " + getDensity(context) + "\n" + + "--------------------------"; + } + + + /** + * 根据手机的分辨率从 dp 的单位 转成为 px(像素) + */ + public static int dip2px(Context context, float dpValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale); + } + + /** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */ + public static int px2dip(Context context, float pxValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (pxValue / scale); + } + + /** + * Print screenInfo to logcat + */ + public static void printScreenInfo(Context context) { + Log.d(TAG, getScreenInfo(context)); + } +} diff --git a/PermissionManager/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/PermissionManager/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..2b068d11 --- /dev/null +++ b/PermissionManager/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/PermissionManager/app/src/main/res/drawable/ic_launcher_background.xml b/PermissionManager/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..07d5da9c --- /dev/null +++ b/PermissionManager/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PermissionManager/app/src/main/res/drawable/line.xml b/PermissionManager/app/src/main/res/drawable/line.xml new file mode 100644 index 00000000..597142f2 --- /dev/null +++ b/PermissionManager/app/src/main/res/drawable/line.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/PermissionManager/app/src/main/res/drawable/line_drawable.xml b/PermissionManager/app/src/main/res/drawable/line_drawable.xml new file mode 100644 index 00000000..4f79f470 --- /dev/null +++ b/PermissionManager/app/src/main/res/drawable/line_drawable.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/PermissionManager/app/src/main/res/drawable/ripple_grey.xml b/PermissionManager/app/src/main/res/drawable/ripple_grey.xml new file mode 100644 index 00000000..ac736de4 --- /dev/null +++ b/PermissionManager/app/src/main/res/drawable/ripple_grey.xml @@ -0,0 +1,6 @@ + +//点击时波纹的颜色 + //未点击时控件的背景(可以是图片,可以是颜色,也可以是drawable里的xml背景(比如圆角)) + \ No newline at end of file diff --git a/PermissionManager/app/src/main/res/drawable/shape_wnd_grey_corner.xml b/PermissionManager/app/src/main/res/drawable/shape_wnd_grey_corner.xml new file mode 100644 index 00000000..6bc80841 --- /dev/null +++ b/PermissionManager/app/src/main/res/drawable/shape_wnd_grey_corner.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/PermissionManager/app/src/main/res/drawable/thumb.xml b/PermissionManager/app/src/main/res/drawable/thumb.xml new file mode 100644 index 00000000..0646431b --- /dev/null +++ b/PermissionManager/app/src/main/res/drawable/thumb.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/PermissionManager/app/src/main/res/drawable/thumb_drawable.xml b/PermissionManager/app/src/main/res/drawable/thumb_drawable.xml new file mode 100644 index 00000000..a93b8b83 --- /dev/null +++ b/PermissionManager/app/src/main/res/drawable/thumb_drawable.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/PermissionManager/app/src/main/res/layout/activity_main.xml b/PermissionManager/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..0bbd1358 --- /dev/null +++ b/PermissionManager/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + +