diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/HandleBindApp.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/HandleBindApp.java index 80262e7bf..094172b1a 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/HandleBindApp.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/HandleBindApp.java @@ -1,17 +1,24 @@ package com.elderdrivers.riru.edxp._hooker.impl; import android.app.ActivityThread; +import android.app.ContextImpl; import android.app.LoadedApk; import android.content.ComponentName; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import android.content.res.CompatibilityInfo; import android.content.res.XResources; +import android.graphics.Bitmap; +import android.os.UserHandle; import com.elderdrivers.riru.edxp.config.ConfigManager; import com.elderdrivers.riru.edxp.util.Hookers; import com.elderdrivers.riru.edxp.util.Utils; +import java.io.File; + import de.robv.android.xposed.XC_MethodHook; +import de.robv.android.xposed.XC_MethodReplacement; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.XposedInit; @@ -25,7 +32,7 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable { Hookers.logD("ActivityThread#handleBindApplication() starts"); ActivityThread activityThread = (ActivityThread) param.thisObject; Object bindData = param.args[0]; - ApplicationInfo appInfo = (ApplicationInfo) XposedHelpers.getObjectField(bindData, "appInfo"); + final ApplicationInfo appInfo = (ApplicationInfo) XposedHelpers.getObjectField(bindData, "appInfo"); // save app process name here for later use ConfigManager.appProcessName = (String) XposedHelpers.getObjectField(bindData, "processName"); String reportedPackageName = appInfo.packageName.equals("android") ? "system" : appInfo.packageName; @@ -42,7 +49,6 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (appInfo.sourceDir == null) { return; } - XposedHelpers.setObjectField(activityThread, "mBoundApplication", bindData); XposedInit.loadedPackagesInProcess.add(reportedPackageName); LoadedApk loadedApk = activityThread.getPackageInfoNoCheck(appInfo, compatInfo); @@ -51,6 +57,19 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable { String processName = (String) XposedHelpers.getObjectField(bindData, "processName"); + + final ApplicationInfo ai = ActivityThread.currentActivityThread().getSystemContext().getPackageManager().getApplicationInfo(appInfo.packageName, PackageManager.GET_META_DATA); + + if(ai.metaData.getBoolean("xposedmodule") && ai.metaData.getInt("xposedminversion", -1) > 92) { + Utils.logW("New modules detected, hook preferences"); + XposedHelpers.findAndHookMethod(ContextImpl.class, "getSharedPreferences", File.class, int.class, new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + String fileName = ((File)param.args[0]).getName(); + param.args[0] = new File(ConfigManager.getPrefsPath(ai.packageName), fileName); + } + }); + } LoadedApkGetCL hook = new LoadedApkGetCL(loadedApk, reportedPackageName, processName, true); hook.setUnhook(XposedHelpers.findAndHookMethod( diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/ConfigManager.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/ConfigManager.java index 1599784c5..de5988d03 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/ConfigManager.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/ConfigManager.java @@ -43,6 +43,8 @@ private static boolean isFileExists(String path) { public static native String getConfigPath(String suffix); + public static native String getPrefsPath(String suffix); + public static native String getBaseConfigPath(); public static native String getDataPathPrefix(); diff --git a/edxp-core/src/main/cpp/main/src/jni/edxp_config_manager.cpp b/edxp-core/src/main/cpp/main/src/jni/edxp_config_manager.cpp index 503f1bf07..5f0a96c9f 100644 --- a/edxp-core/src/main/cpp/main/src/jni/edxp_config_manager.cpp +++ b/edxp-core/src/main/cpp/main/src/jni/edxp_config_manager.cpp @@ -46,6 +46,13 @@ namespace edxp { return env->NewStringUTF(result.c_str()); } + static jstring ConfigManager_getPrefsPath(JNI_START, jstring jSuffix) { + const char *suffix = env->GetStringUTFChars(jSuffix, JNI_FALSE); + auto result = ConfigManager::GetInstance()->GetPrefsPath(suffix); + env->ReleaseStringUTFChars(jSuffix, suffix); + return env->NewStringUTF(result.c_str()); + } + static jstring ConfigManager_getBaseConfigPath(JNI_START) { auto result = ConfigManager::GetInstance()->GetBaseConfigPath(); return env->NewStringUTF(result.c_str()); @@ -71,6 +78,8 @@ namespace edxp { NATIVE_METHOD(ConfigManager, getDataPathPrefix, "()Ljava/lang/String;"), NATIVE_METHOD(ConfigManager, getConfigPath, "(Ljava/lang/String;)Ljava/lang/String;"), + NATIVE_METHOD(ConfigManager, getPrefsPath, + "(Ljava/lang/String;)Ljava/lang/String;"), NATIVE_METHOD(ConfigManager, getBaseConfigPath,"()Ljava/lang/String;"), NATIVE_METHOD(ConfigManager, getModulesList, "()Ljava/lang/String;"), }; diff --git a/hiddenapi-stubs/src/main/java/android/app/ActivityThread.java b/hiddenapi-stubs/src/main/java/android/app/ActivityThread.java index d78e8f402..fb83f96fe 100644 --- a/hiddenapi-stubs/src/main/java/android/app/ActivityThread.java +++ b/hiddenapi-stubs/src/main/java/android/app/ActivityThread.java @@ -19,4 +19,7 @@ public static String currentPackageName() { public final LoadedApk getPackageInfoNoCheck(ApplicationInfo ai, CompatibilityInfo compatInfo) { throw new UnsupportedOperationException("STUB"); } + public ContextImpl getSystemContext() { + throw new UnsupportedOperationException("STUB"); + } } diff --git a/hiddenapi-stubs/src/main/java/android/app/ContextImpl.java b/hiddenapi-stubs/src/main/java/android/app/ContextImpl.java new file mode 100644 index 000000000..c16b3a597 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/app/ContextImpl.java @@ -0,0 +1,550 @@ +package android.app; + +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.IntentSender; +import android.content.ServiceConnection; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.res.AssetManager; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.database.DatabaseErrorHandler; +import android.database.sqlite.SQLiteDatabase; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.UserHandle; +import android.view.Display; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +public class ContextImpl extends Context { + @Override + public AssetManager getAssets() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Resources getResources() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public PackageManager getPackageManager() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public ContentResolver getContentResolver() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Looper getMainLooper() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Context getApplicationContext() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void setTheme(int resid) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Resources.Theme getTheme() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public ClassLoader getClassLoader() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public String getPackageName() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public ApplicationInfo getApplicationInfo() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public String getPackageResourcePath() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public String getPackageCodePath() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public SharedPreferences getSharedPreferences(String name, int mode) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public boolean moveSharedPreferencesFrom(Context sourceContext, String name) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public boolean deleteSharedPreferences(String name) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public FileInputStream openFileInput(String name) throws FileNotFoundException { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public FileOutputStream openFileOutput(String name, int mode) throws FileNotFoundException { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public boolean deleteFile(String name) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File getFileStreamPath(String name) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File getDataDir() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File getFilesDir() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File getNoBackupFilesDir() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File getExternalFilesDir(String type) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File[] getExternalFilesDirs(String type) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File getObbDir() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File[] getObbDirs() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File getCacheDir() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File getCodeCacheDir() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File getExternalCacheDir() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File[] getExternalCacheDirs() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File[] getExternalMediaDirs() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public String[] fileList() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File getDir(String name, int mode) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public boolean moveDatabaseFrom(Context sourceContext, String name) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public boolean deleteDatabase(String name) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public File getDatabasePath(String name) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public String[] databaseList() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Drawable getWallpaper() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Drawable peekWallpaper() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public int getWallpaperDesiredMinimumWidth() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public int getWallpaperDesiredMinimumHeight() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void setWallpaper(Bitmap bitmap) throws IOException { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void setWallpaper(InputStream data) throws IOException { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void clearWallpaper() throws IOException { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void startActivity(Intent intent) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void startActivity(Intent intent, Bundle options) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void startActivities(Intent[] intents) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void startActivities(Intent[] intents, Bundle options) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags) throws IntentSender.SendIntentException { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, Bundle options) throws IntentSender.SendIntentException { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void sendBroadcast(Intent intent) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void sendBroadcast(Intent intent, String receiverPermission) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void sendOrderedBroadcast(Intent intent, String receiverPermission) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void sendBroadcastAsUser(Intent intent, UserHandle user) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void sendStickyBroadcast(Intent intent) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void removeStickyBroadcast(Intent intent) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler, int flags) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void unregisterReceiver(BroadcastReceiver receiver) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public ComponentName startService(Intent service) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public ComponentName startForegroundService(Intent service) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public boolean stopService(Intent service) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public boolean bindService(Intent service, ServiceConnection conn, int flags) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void unbindService(ServiceConnection conn) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public boolean startInstrumentation(ComponentName className, String profileFile, Bundle arguments) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Object getSystemService(String name) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public String getSystemServiceName(Class serviceClass) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public int checkPermission(String permission, int pid, int uid) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public int checkCallingPermission(String permission) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public int checkCallingOrSelfPermission(String permission) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public int checkSelfPermission(String permission) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void enforcePermission(String permission, int pid, int uid, String message) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void enforceCallingPermission(String permission, String message) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void enforceCallingOrSelfPermission(String permission, String message) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void grantUriPermission(String toPackage, Uri uri, int modeFlags) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void revokeUriPermission(Uri uri, int modeFlags) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void revokeUriPermission(String toPackage, Uri uri, int modeFlags) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public int checkCallingUriPermission(Uri uri, int modeFlags) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public int checkUriPermission(Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void enforceUriPermission(Uri uri, int pid, int uid, int modeFlags, String message) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void enforceCallingUriPermission(Uri uri, int modeFlags, String message) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void enforceCallingOrSelfUriPermission(Uri uri, int modeFlags, String message) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public void enforceUriPermission(Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags, String message) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Context createPackageContext(String packageName, int flags) throws PackageManager.NameNotFoundException { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Context createContextForSplit(String splitName) throws PackageManager.NameNotFoundException { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Context createConfigurationContext(Configuration overrideConfiguration) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Context createDisplayContext(Display display) { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public Context createDeviceProtectedStorageContext() { + throw new UnsupportedOperationException("STUB"); + } + + @Override + public boolean isDeviceProtectedStorage() { + throw new UnsupportedOperationException("STUB"); + } +}