From d545fb043f507ad98a9fb4a0e740008071a7eb45 Mon Sep 17 00:00:00 2001 From: Fankesyooni Date: Sun, 13 Feb 2022 11:36:04 +0800 Subject: [PATCH] ... --- .../highcapable/yukihookapi/YukiHookAPI.kt | 11 ++ .../hook/factory/ReflectionFactory.kt | 4 +- .../hook/type/android/ComponentTypeFactory.kt | 149 ++++++++++++++++-- .../hook/type/android/GraphicsTypeFactory.kt | 18 ++- .../hook/type/android/ViewTypeFactory.kt | 5 +- .../hook/type/java/VariableTypeFactory.kt | 62 +++++++- .../hook/xposed/prefs/YukiHookModulePrefs.kt | 8 + 7 files changed, 228 insertions(+), 29 deletions(-) diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt index b9f5b49c..6ff6a3e7 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt @@ -66,6 +66,13 @@ object YukiHookAPI { @DoNotUseField var modulePackageName = "" + /** + * 标识是否从自定义 Hook API 装载 + * + * - ❗这是私有 API - 请勿手动修改 - 否则会导致功能判断错误 + */ + internal var isLoadedFromBaseContext = false + /** * 配置 YukiHookAPI */ @@ -129,6 +136,7 @@ object YukiHookAPI { * @param initiate Hook 方法体 */ fun encase(initiate: PackageParam.() -> Unit) { + isLoadedFromBaseContext = false if (hasXposedBridge) packageParamCallback = initiate else printNoXposedBridge() @@ -144,6 +152,7 @@ object YukiHookAPI { * @throws IllegalStateException 如果 [hooker] 是空的 */ fun encase(vararg hooker: YukiBaseHooker) { + isLoadedFromBaseContext = false if (hasXposedBridge) packageParamCallback = { if (hooker.isNotEmpty()) @@ -167,6 +176,7 @@ object YukiHookAPI { * @param initiate Hook 方法体 */ fun encase(baseContext: Context?, initiate: PackageParam.() -> Unit) { + isLoadedFromBaseContext = true if (hasXposedBridge) (if (baseContext != null) initiate.invoke(baseContext.packagePararm)) else printNoXposedBridge() @@ -187,6 +197,7 @@ object YukiHookAPI { * @throws IllegalStateException 如果 [hooker] 是空的 */ fun encase(baseContext: Context?, vararg hooker: YukiBaseHooker) { + isLoadedFromBaseContext = true if (hasXposedBridge) (if (baseContext != null) if (hooker.isNotEmpty()) diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt index f829f000..92f240fd 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt @@ -164,7 +164,7 @@ fun Class<*>.obtainConstructor(vararg paramType: Class<*>): Constructor */ inline fun Method.invokeStatic(vararg param: Any?) = if (param.isNotEmpty()) - invoke(null, param) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}") + invoke(null, *param) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}") else invoke(null) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}") /** @@ -176,5 +176,5 @@ inline fun Method.invokeStatic(vararg param: Any?) = */ inline fun Method.invokeAny(any: Any?, vararg param: Any?) = if (param.isNotEmpty()) - invoke(any, param) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}") + invoke(any, *param) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}") else invoke(any) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}") diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.kt index 04acf3de..bd460d4d 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.kt @@ -39,16 +39,19 @@ import android.media.MediaPlayer import android.os.* import android.service.notification.StatusBarNotification import android.text.SpannableStringBuilder -import android.util.ArrayMap -import android.util.ArraySet -import android.util.Base64 -import android.util.DisplayMetrics +import android.util.* import android.view.Display import android.view.Window import android.view.WindowManager import android.widget.Toast import com.highcapable.yukihookapi.hook.factory.classOf +/** + * 获得 [android.R] 类型 + * @return [Class] + */ +val AndroidRClass get() = android.R::class.java + /** * 获得 [Context] 类型 * @return [Class] @@ -103,6 +106,12 @@ val LoadedApkClass get() = classOf(name = "android.app.LoadedApk") */ val ActivityClass get() = Activity::class.java +/** + * 获得 [Looper] 类型 + * @return [Class] + */ +val LooperClass get() = Looper::class.java + /** * 获得 [Fragment] 类型 - Support * @return [Class] @@ -127,12 +136,30 @@ val FragmentActivityClass_AndroidSupport get() = classOf(name = "android.support */ val FragmentActivityClass_AndroidX get() = classOf(name = "androidx.fragment.app.FragmentActivity") +/** + * 获得 [DocumentFile] 类型 - AndroidX + * @return [Class] + */ +val DocumentFileClass get() = classOf(name = "androidx.documentfile.provider.DocumentFile") + /** * 获得 [Service] 类型 * @return [Class] */ val ServiceClass get() = Service::class.java +/** + * 获得 [Binder] 类型 + * @return [Class] + */ +val BinderClass get() = Binder::class.java + +/** + * 获得 [IBinder] 类型 + * @return [Class] + */ +val IBinderClass get() = IBinder::class.java + /** * 获得 [BroadcastReceiver] 类型 * @return [Class] @@ -145,6 +172,12 @@ val BroadcastReceiverClass get() = BroadcastReceiver::class.java */ val BundleClass get() = Bundle::class.java +/** + * 获得 [BaseBundle] 类型 + * @return [Class] + */ +val BaseBundleClass get() = BaseBundle::class.java + /** * 获得 [Resources] 类型 * @return [Class] @@ -195,6 +228,18 @@ val Handler_CallbackClass get() = Handler.Callback::class.java */ val MessageClass get() = Message::class.java +/** + * 获得 [MessageQueue] 类型 + * @return [Class] + */ +val MessageQueueClass get() = MessageQueue::class.java + +/** + * 获得 [Messenger] 类型 + * @return [Class] + */ +val MessengerClass get() = Messenger::class.java + /** * 获得 [AsyncTask] 类型 * @return [Class] @@ -215,12 +260,24 @@ val SimpleDateFormatClass_Android get() = SimpleDateFormat::class.java */ val Base64Class_Android get() = Base64::class.java +/** + * 获得 [Window] 类型 + * @return [Class] + */ +val WindowClass get() = Window::class.java + /** * 获得 [WindowManager] 类型 * @return [Class] */ val WindowManagerClass get() = WindowManager::class.java +/** + * 获得 [Parcel] 类型 + * @return [Class] + */ +val ParcelClass get() = Parcel::class.java + /** * 获得 [Parcelable] 类型 * @return [Class] @@ -293,12 +350,6 @@ val SharedPreferencesClass get() = SharedPreferences::class.java */ val SpannableStringBuilderClass get() = SpannableStringBuilder::class.java -/** - * 获得 [Window] 类型 - * @return [Class] - */ -val WindowClass get() = Window::class.java - /** * 获得 [MediaPlayer] 类型 * @return [Class] @@ -311,24 +362,30 @@ val MediaPlayerClass get() = MediaPlayer::class.java */ val ProgressDialogClass get() = ProgressDialog::class.java +/** + * 获得 [Log] 类型 + * @return [Class] + */ +val LogClass get() = Log::class.java + /** * 获得 [Build] 类型 * @return [Class] */ val BuildClass get() = Build::class.java +/** + * 获得 [Xml] 类型 + * @return [Class] + */ +val XmlClass get() = Xml::class.java + /** * 获得 [ContrastColorUtil] 类型 * @return [Class] */ val ContrastColorUtilClass get() = classOf(name = "com.android.internal.util.ContrastColorUtil") -/** - * 获得 [DialogInterface] 类型 - * @return [Class] - */ -val DialogInterfaceClass get() = DialogInterface::class.java - /** * 获得 [StatusBarNotification] 类型 * @return [Class] @@ -347,6 +404,12 @@ val NotificationClass get() = Notification::class.java */ val Notification_BuilderClass get() = Notification.Builder::class.java +/** + * 获得 [DialogInterface] 类型 + * @return [Class] + */ +val DialogInterfaceClass get() = DialogInterface::class.java + /** * 获得 [DialogInterface.OnClickListener] 类型 * @return [Class] @@ -363,4 +426,56 @@ val DialogInterface_OnCancelListenerClass get() = DialogInterface.OnCancelListen * 获得 [DialogInterface.OnDismissListener] 类型 * @return [Class] */ -val DialogInterface_OnDismissListenerClass get() = DialogInterface.OnDismissListener::class.java \ No newline at end of file +val DialogInterface_OnDismissListenerClass get() = DialogInterface.OnDismissListener::class.java + +/** + * 获得 [Environment] 类型 + * @return [Class] + */ +val EnvironmentClass get() = Environment::class.java + +/** + * 获得 [Process] 类型 + * @return [Class] + */ +val ProcessClass get() = Process::class.java + +/** + * 获得 [Vibrator] 类型 + * @return [Class] + */ +val VibratorClass get() = Vibrator::class.java + +/** + * 获得 [VibrationEffect] 类型 + * + * ❗在 Android O (26) 及以上系统加入 + * @return [Class] + */ +val VibrationEffectClass get() = VibrationEffect::class.java + +/** + * 获得 [VibrationAttributes] 类型 + * + * ❗在 Android R (30) 及以上系统加入 + * @return [Class] + */ +val VibrationAttributesClass get() = VibrationAttributes::class.java + +/** + * 获得 [SystemClock] 类型 + * @return [Class] + */ +val SystemClockClass get() = SystemClock::class.java + +/** + * 获得 [PowerManager] 类型 + * @return [Class] + */ +val PowerManagerClass get() = PowerManager::class.java + +/** + * 获得 [PowerManager.WakeLock] 类型 + * @return [Class] + */ +val PowerManager_WakeLockClass get() = PowerManager.WakeLock::class.java \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.kt index b774809c..56beae06 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.kt @@ -45,12 +45,6 @@ val TypefaceClass get() = Typeface::class.java */ val BitmapClass get() = Bitmap::class.java -/** - * 获得 [Drawable] 类型 - * @return [Class] - */ -val DrawableClass get() = Drawable::class.java - /** * 获得 [Icon] 类型 * @@ -59,6 +53,18 @@ val DrawableClass get() = Drawable::class.java */ val IconClass get() = Icon::class.java +/** + * 获得 [Outline] 类型 + * @return [Class] + */ +val OutlineClass get() = Outline::class.java + +/** + * 获得 [Drawable] 类型 + * @return [Class] + */ +val DrawableClass get() = Drawable::class.java + /** * 获得 [GradientDrawable] 类型 * @return [Class] diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.kt index d234b10f..c2e9b9e9 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.kt @@ -29,7 +29,6 @@ package com.highcapable.yukihookapi.hook.type.android -import android.graphics.Outline import android.util.AttributeSet import android.view.* import android.widget.* @@ -161,10 +160,10 @@ val LinearLayout_LayoutParamsClass get() = LinearLayout.LayoutParams::class.java val FrameLayout_LayoutParamsClass get() = FrameLayout.LayoutParams::class.java /** - * 获得 [Outline] 类型 + * 获得 [TextClock] 类型 * @return [Class] */ -val OutlineClass get() = Outline::class.java +val TextClockClass get() = TextClock::class.java /** * 获得 [View.OnClickListener] 类型 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.kt index 87d4f426..379d4c16 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.kt @@ -450,4 +450,64 @@ val JavaMemberClass get() = Member::class.java * 获得 [Annotation] 类型 * @return [Class] */ -val JavaAnnotationClass get() = Annotation::class.java \ No newline at end of file +val JavaAnnotationClass get() = Annotation::class.java + +/** + * 获得 [Runtime] 类型 + * @return [Class] + */ +val RuntimeClass get() = Runtime::class.java + +/** + * 获得 [NullPointerException] 类型 + * @return [Class] + */ +val NullPointerExceptionClass get() = NullPointerException::class.java + +/** + * 获得 [NumberFormatException] 类型 + * @return [Class] + */ +val NumberFormatExceptionClass get() = NumberFormatException::class.java + +/** + * 获得 [IllegalStateException] 类型 + * @return [Class] + */ +val IllegalStateExceptionClass get() = IllegalStateException::class.java + +/** + * 获得 [RuntimeException] 类型 + * @return [Class] + */ +val RuntimeExceptionClass get() = RuntimeException::class.java + +/** + * 获得 [NoSuchMethodError] 类型 + * @return [Class] + */ +val NoSuchMethodErrorClass get() = NoSuchMethodError::class.java + +/** + * 获得 [NoSuchFieldError] 类型 + * @return [Class] + */ +val NoSuchFieldErrorClass get() = NoSuchFieldError::class.java + +/** + * 获得 [Error] 类型 + * @return [Class] + */ +val ErrorClass get() = Error::class.java + +/** + * 获得 [Exception] 类型 + * @return [Class] + */ +val ExceptionClass get() = Exception::class.java + +/** + * 获得 [Throwable] 类型 + * @return [Class] + */ +val ThrowableClass get() = Throwable::class.java \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.kt index 058af4cb..d38b330e 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.kt @@ -79,12 +79,18 @@ class YukiHookModulePrefs(private val context: Context? = null) { /** 缓存数据 */ private var xPrefCacheKeyValueFloats = HashMap() + /** 检查是否处于自定义 Hook API 状态 */ + private fun checkApiInBaseContext() { + if (YukiHookAPI.isLoadedFromBaseContext) error("YukiHookModulePrefs not allowed in Custom Hook API") + } + /** * 获得 [XSharedPreferences] 对象 * @return [XSharedPreferences] */ private val xPref get() = XSharedPreferences(YukiHookAPI.modulePackageName, prefsName).apply { + checkApiInBaseContext() makeWorldReadable() reload() } @@ -95,9 +101,11 @@ class YukiHookModulePrefs(private val context: Context? = null) { */ private val sPref get() = try { + checkApiInBaseContext() context?.getSharedPreferences(prefsName, Context.MODE_WORLD_READABLE) ?: error("If you want to use module prefs,you must set the context instance first") } catch (_: Throwable) { + checkApiInBaseContext() context?.getSharedPreferences(prefsName, Context.MODE_PRIVATE) ?: error("If you want to use module prefs,you must set the context instance first") }