From dd09be95ab719d03cdfe962e8016a9780b3467bd Mon Sep 17 00:00:00 2001 From: Dr-TSNG Date: Sat, 27 Mar 2021 14:38:32 +0800 Subject: [PATCH] release 1.0 --- README.md | 18 ++++++--- app/build.gradle | 14 +++---- .../ExampleInstrumentedTest.java | 26 ------------- .../com/tsng/hidemyapplist/HookApplist.java | 10 ++--- .../com/tsng/hidemyapplist/MainActivity.java | 4 +- .../tsng/hidemyapplist/ScopeManageActivity.kt | 4 +- .../hidemyapplist/TemplateManageActivity.java | 4 +- .../hidemyapplist/ui/about/AboutFragment.java | 20 ---------- .../hidemyapplist/ui/about/AboutFragment.kt | 37 +++++++++++++++++++ .../ui/xposed/XposedFragment.java | 2 - .../main/res/drawable/ic_baseline_help_24.xml | 10 +++++ .../res/drawable/ic_baseline_language_24.xml | 10 +++++ app/src/main/res/layout/fragment_about.xml | 8 ---- .../main/res/navigation/mobile_navigation.xml | 3 +- .../main/res/values-zh-rCN/strings_about.xml | 12 ++++++ app/src/main/res/values/strings_about.xml | 12 ++++++ app/src/main/res/xml/scope_preferences.xml | 2 +- .../res/xml/template_hideapps_preference.xml | 2 +- .../tsng/hidemyapplist/ExampleUnitTest.java | 17 --------- 19 files changed, 115 insertions(+), 100 deletions(-) delete mode 100644 app/src/androidTest/java/com/tsng/hidemyapplist/ExampleInstrumentedTest.java delete mode 100644 app/src/main/java/com/tsng/hidemyapplist/ui/about/AboutFragment.java create mode 100644 app/src/main/java/com/tsng/hidemyapplist/ui/about/AboutFragment.kt create mode 100644 app/src/main/res/drawable/ic_baseline_help_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_language_24.xml delete mode 100644 app/src/main/res/layout/fragment_about.xml create mode 100644 app/src/main/res/values-zh-rCN/strings_about.xml create mode 100644 app/src/main/res/values/strings_about.xml delete mode 100644 app/src/test/java/com/tsng/hidemyapplist/ExampleUnitTest.java diff --git a/README.md b/README.md index c5d1f16..22bb881 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,16 @@ # Hide My Applist -An android app using loopholes to detect specific package names like Magisk and Edxposed Manager. -Also works as an xposed module to reject/hide other apps from detecting some packages. +## About this module +Although "It is incorrect to detect specific app's installation", yet not every app using root provides random packagename support. +In this case, detected apps that use root (such as Fake Location and Storage Isolation) is equal to detected root itself. +At the same time, some "smart" apps use various loopholes to acquire your applist, so that it can draw a persona for you. +This module provides some methods to test whether you have already hided your applist nicely. +Also, it can work as an Xposed module to hide some apps or reject applist requests to protect your privacy. -Todo: xposed module isn't finished +## 关于该模块 +虽然“检测安装的应用是不正确的做法”,而且很蠢,但是并不是所有的插件类应用都提供了随机包名支持。在这种情况下,检测到安装了root类应用(如Fake Location、存储重定向)与检测到了root本身区别不大。(会使用检测手段的app可不会认为你是在“我就蹭蹭不进去”) +与此同时,部分“不安分”的app会使用各种漏洞绕过系统权限来获取你的应用列表,从而对你建立用户画像。(如陈叔叔将安装了V2Ray的用户分为一类) +该模块提供了一些检测方式用于测试您是否成功的隐藏了带有root印记的包名,如Magisk/Edxposed Manager。 +同时可作为Xposed模块用于隐藏应用列表或特定应用,保护你的隐私。 -一个利用系统漏洞获取应用列表的app,可以用来检测特定包名,如Magisk/Edxposed Manager -同时可作为xposed模块用于隐藏应用列表或特定应用 \ No newline at end of file +## TODO ++ Add native detection \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 1c4f748..3106bce 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { applicationId "com.tsng.hidemyapplist" minSdkVersion 26 targetSdkVersion 30 - versionCode 5 - versionName "0.5" + versionCode 6 + versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -31,16 +31,14 @@ android { } dependencies { - + implementation 'com.github.medyo:android-about-page:1.3.1' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.3.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'org.jetbrains:annotations:15.0' - implementation 'androidx.preference:preference:1.1.1' - implementation 'androidx.navigation:navigation-fragment:2.3.4' - implementation 'androidx.navigation:navigation-ui:2.3.4' - implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0' - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0' + implementation 'androidx.preference:preference-ktx:1.1.1' + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.4' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.4' implementation 'com.google.android.material:material:1.3.0' implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.legacy:legacy-support-v4:1.0.0' diff --git a/app/src/androidTest/java/com/tsng/hidemyapplist/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/tsng/hidemyapplist/ExampleInstrumentedTest.java deleted file mode 100644 index bc95480..0000000 --- a/app/src/androidTest/java/com/tsng/hidemyapplist/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tsng.hidemyapplist; - -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.tsng.hidemyapplist", appContext.getPackageName()); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tsng/hidemyapplist/HookApplist.java b/app/src/main/java/com/tsng/hidemyapplist/HookApplist.java index 73b6753..c1f68a0 100644 --- a/app/src/main/java/com/tsng/hidemyapplist/HookApplist.java +++ b/app/src/main/java/com/tsng/hidemyapplist/HookApplist.java @@ -1,5 +1,10 @@ package com.tsng.hidemyapplist; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.ResolveInfo; +import android.util.Log; + import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; @@ -10,11 +15,6 @@ import java.util.Iterator; import java.util.List; import java.util.Set; -import android.content.Intent; -import android.content.pm.PackageInfo; -import android.content.pm.ResolveInfo; -import android.util.Log; - import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XSharedPreferences; diff --git a/app/src/main/java/com/tsng/hidemyapplist/MainActivity.java b/app/src/main/java/com/tsng/hidemyapplist/MainActivity.java index 6d38f9a..75bdc0b 100644 --- a/app/src/main/java/com/tsng/hidemyapplist/MainActivity.java +++ b/app/src/main/java/com/tsng/hidemyapplist/MainActivity.java @@ -2,13 +2,13 @@ package com.tsng.hidemyapplist; import android.os.Bundle; -import com.google.android.material.bottomnavigation.BottomNavigationView; - import androidx.appcompat.app.AppCompatActivity; import androidx.navigation.NavController; import androidx.navigation.Navigation; import androidx.navigation.ui.NavigationUI; +import com.google.android.material.bottomnavigation.BottomNavigationView; + public class MainActivity extends AppCompatActivity { @Override diff --git a/app/src/main/java/com/tsng/hidemyapplist/ScopeManageActivity.kt b/app/src/main/java/com/tsng/hidemyapplist/ScopeManageActivity.kt index db18057..b0e8565 100644 --- a/app/src/main/java/com/tsng/hidemyapplist/ScopeManageActivity.kt +++ b/app/src/main/java/com/tsng/hidemyapplist/ScopeManageActivity.kt @@ -4,7 +4,9 @@ import android.content.pm.ApplicationInfo import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity -import androidx.preference.* +import androidx.preference.ListPreference +import androidx.preference.PreferenceFragmentCompat +import kotlin.collections.set class ScopeManageActivity : AppCompatActivity() { diff --git a/app/src/main/java/com/tsng/hidemyapplist/TemplateManageActivity.java b/app/src/main/java/com/tsng/hidemyapplist/TemplateManageActivity.java index b713f77..fa0315a 100644 --- a/app/src/main/java/com/tsng/hidemyapplist/TemplateManageActivity.java +++ b/app/src/main/java/com/tsng/hidemyapplist/TemplateManageActivity.java @@ -1,7 +1,5 @@ package com.tsng.hidemyapplist; -import androidx.appcompat.app.AppCompatActivity; - import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -11,6 +9,8 @@ import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; + import com.google.android.material.dialog.MaterialAlertDialogBuilder; import java.io.File; diff --git a/app/src/main/java/com/tsng/hidemyapplist/ui/about/AboutFragment.java b/app/src/main/java/com/tsng/hidemyapplist/ui/about/AboutFragment.java deleted file mode 100644 index 92a4f81..0000000 --- a/app/src/main/java/com/tsng/hidemyapplist/ui/about/AboutFragment.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tsng.hidemyapplist.ui.about; - -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; - -import com.tsng.hidemyapplist.R; - -public class AboutFragment extends Fragment { - - public View onCreateView(@NonNull LayoutInflater inflater, - ViewGroup container, Bundle savedInstanceState) { - View root = inflater.inflate(R.layout.fragment_about, container, false); - return root; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tsng/hidemyapplist/ui/about/AboutFragment.kt b/app/src/main/java/com/tsng/hidemyapplist/ui/about/AboutFragment.kt new file mode 100644 index 0000000..ec0b3d7 --- /dev/null +++ b/app/src/main/java/com/tsng/hidemyapplist/ui/about/AboutFragment.kt @@ -0,0 +1,37 @@ +package com.tsng.hidemyapplist.ui.about + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.tsng.hidemyapplist.R +import mehdi.sakout.aboutpage.AboutPage +import mehdi.sakout.aboutpage.Element + +class AboutFragment : Fragment() { + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return AboutPage(activity) + .setDescription(getString(R.string.about_my_description)) + .addItem(Element().apply { + title = "Version " + requireContext().packageManager.getPackageInfo(requireContext().packageName, 0).versionName + iconDrawable = R.drawable.ic_baseline_language_24 + }) + .addItem(Element().apply { + title = getString(R.string.about_my_how_to_use_title) + iconDrawable = R.drawable.ic_baseline_help_24 + setOnClickListener { + MaterialAlertDialogBuilder(requireContext()) + .setTitle(title) + .setMessage(getString(R.string.about_my_how_to_use_message)) + .setPositiveButton(getString(R.string.accept), null) + .show() + } + }) + .addWebsite("http://www.coolapk.com/u/1911298", getString(R.string.about_my_author)) + .addGitHub("Dr-TSNG/Hide-My-Applist", getString(R.string.about_my_project_address)) + .addItem(Element()) + .create() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tsng/hidemyapplist/ui/xposed/XposedFragment.java b/app/src/main/java/com/tsng/hidemyapplist/ui/xposed/XposedFragment.java index 9c9518c..7e767a2 100644 --- a/app/src/main/java/com/tsng/hidemyapplist/ui/xposed/XposedFragment.java +++ b/app/src/main/java/com/tsng/hidemyapplist/ui/xposed/XposedFragment.java @@ -2,7 +2,6 @@ package com.tsng.hidemyapplist.ui.xposed; import android.app.Activity; import android.content.Intent; -import android.content.SharedPreferences; import android.graphics.Color; import android.os.Bundle; import android.view.LayoutInflater; @@ -12,7 +11,6 @@ import android.widget.Button; import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.annotation.RestrictTo; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.preference.PreferenceManager; diff --git a/app/src/main/res/drawable/ic_baseline_help_24.xml b/app/src/main/res/drawable/ic_baseline_help_24.xml new file mode 100644 index 0000000..c0c9268 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_help_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_language_24.xml b/app/src/main/res/drawable/ic_baseline_language_24.xml new file mode 100644 index 0000000..3f70646 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_language_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml deleted file mode 100644 index 918b84c..0000000 --- a/app/src/main/res/layout/fragment_about.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index dfdf69e..3126b50 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -19,6 +19,5 @@ + android:label="@string/title_about"/> \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings_about.xml b/app/src/main/res/values-zh-rCN/strings_about.xml new file mode 100644 index 0000000..5f22723 --- /dev/null +++ b/app/src/main/res/values-zh-rCN/strings_about.xml @@ -0,0 +1,12 @@ + + + + 关于该模块\n虽然“检测安装的应用是不正确的做法”,而且很蠢,但是并不是所有的插件类应用都提供了随机包名支持。在这种情况下,检测到安装了root类应用(如Fake Location、存储重定向)与检测到了root本身区别不大。(会使用检测手段的app可不会认为你是在“我就蹭蹭不进去”)\n与此同时,部分“不安分”的app会使用各种漏洞绕过系统权限来获取你的应用列表,从而对你建立用户画像。(如陈叔叔将安装了V2Ray的用户分为一类)\n该模块提供了一些检测方式用于测试您是否成功的隐藏了带有root印记的包名,如Magisk/Edxposed Manager。\n同时可作为Xposed模块用于隐藏应用列表或特定应用,保护你的隐私。 + + 如何使用该模块 + + 首先创建一个模板,其次在选择生效应用里对目标应用启用模板,然后重启目标应用,完成。\n如何测试隐藏是否成功\n对本模块自身启用一个模板,之后激活“Hook模块自身”按钮,重启app,开始检测。\n几种隐藏方式的区别\n正常app读取应用列表使用API request,“不安分”的app会使用其他几种方式(相当于漏洞)进行检测。不过请注意,全局模式(禁止读取应用列表)下禁止intent query可能会影响分享、启动浏览器等功能。\n目前已知的bug\nEdXposed YAHFA后端无法进行datafile detection隐藏(测试版本:4683),请更换Sandhook后端或LSPosed。 + + 项目地址 + 作者:Dr-TSNG (酷安) + \ No newline at end of file diff --git a/app/src/main/res/values/strings_about.xml b/app/src/main/res/values/strings_about.xml new file mode 100644 index 0000000..051fee2 --- /dev/null +++ b/app/src/main/res/values/strings_about.xml @@ -0,0 +1,12 @@ + + + + About this module\nAlthough "It is incorrect to detect specific app's installation", yet not every app using root provides random packagename support. In this case, detected apps that use root (such as Fake Location and Storage Isolation) is equal to detected root itself.\nAt the same time, some "smart" apps use various loopholes to acquire your applist, so that it can draw a persona for you.\nThis module provides some methods to test whether you have already hided your applist nicely.\nAlso, it can work as an Xposed module to hide some apps or reject applist requests to protect your privacy. + + How to use this module + + First create a template, then apply the template in "Select Effective Apps", and restart target apps, OK.\nHow to confirm whether hide is successful\nApply a template to the module itself, then activate "Hook Self" button, and restart the app, start detection.\nDifferences between hide methods\nNormal apps use API request to acquire applist, but "bad" apps will use other methods (loopholes) to detect it. Attention, under global mode (Reject applist requests) if hide "intent query" there may be some problems with share, start browser, etc.\nKnown bugs\nHide datafile detection does not work using EdXposed YAHFA (tested version: 4683). Please switch to Sandhook or LSPosed instead. + + Project address + Author: Dr-TSNG (CoolMarket) + \ No newline at end of file diff --git a/app/src/main/res/xml/scope_preferences.xml b/app/src/main/res/xml/scope_preferences.xml index 55418ef..6f1e916 100644 --- a/app/src/main/res/xml/scope_preferences.xml +++ b/app/src/main/res/xml/scope_preferences.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/app/src/main/res/xml/template_hideapps_preference.xml b/app/src/main/res/xml/template_hideapps_preference.xml index 55418ef..6f1e916 100644 --- a/app/src/main/res/xml/template_hideapps_preference.xml +++ b/app/src/main/res/xml/template_hideapps_preference.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/app/src/test/java/com/tsng/hidemyapplist/ExampleUnitTest.java b/app/src/test/java/com/tsng/hidemyapplist/ExampleUnitTest.java deleted file mode 100644 index d663776..0000000 --- a/app/src/test/java/com/tsng/hidemyapplist/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tsng.hidemyapplist; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file