From 1ea8047aefdaa358e9af8038923ac54d68a39176 Mon Sep 17 00:00:00 2001 From: 1fexd <58902674+1fexd@users.noreply.github.com> Date: Wed, 16 Apr 2025 08:55:07 +0000 Subject: [PATCH] feat: Add `Hide ADB status` patch (#4585) Co-authored-by: oSumAtrIX --- .../all/misc/adb/hide-adb/build.gradle.kts | 16 ++++++ .../adb/hide-adb/src/main/AndroidManifest.xml | 1 + .../extension/all/hide/adb/HideAdbPatch.java | 28 +++++++++ patches/api/patches.api | 4 ++ .../patches/all/misc/adb/HideAdbPatch.kt | 57 +++++++++++++++++++ 5 files changed, 106 insertions(+) create mode 100644 extensions/all/misc/adb/hide-adb/build.gradle.kts create mode 100644 extensions/all/misc/adb/hide-adb/src/main/AndroidManifest.xml create mode 100644 extensions/all/misc/adb/hide-adb/src/main/java/app/revanced/extension/all/hide/adb/HideAdbPatch.java create mode 100644 patches/src/main/kotlin/app/revanced/patches/all/misc/adb/HideAdbPatch.kt diff --git a/extensions/all/misc/adb/hide-adb/build.gradle.kts b/extensions/all/misc/adb/hide-adb/build.gradle.kts new file mode 100644 index 000000000..18568df5c --- /dev/null +++ b/extensions/all/misc/adb/hide-adb/build.gradle.kts @@ -0,0 +1,16 @@ +android { + namespace = "app.revanced.extension" + + defaultConfig { + minSdk = 21 + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } +} + +dependencies { + compileOnly(libs.annotation) +} diff --git a/extensions/all/misc/adb/hide-adb/src/main/AndroidManifest.xml b/extensions/all/misc/adb/hide-adb/src/main/AndroidManifest.xml new file mode 100644 index 000000000..15e7c2ae6 --- /dev/null +++ b/extensions/all/misc/adb/hide-adb/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/all/misc/adb/hide-adb/src/main/java/app/revanced/extension/all/hide/adb/HideAdbPatch.java b/extensions/all/misc/adb/hide-adb/src/main/java/app/revanced/extension/all/hide/adb/HideAdbPatch.java new file mode 100644 index 000000000..b64cf28e4 --- /dev/null +++ b/extensions/all/misc/adb/hide-adb/src/main/java/app/revanced/extension/all/hide/adb/HideAdbPatch.java @@ -0,0 +1,28 @@ +package app.revanced.extension.all.hide.adb; + +import android.content.ContentResolver; +import android.provider.Settings; + +import java.util.Arrays; +import java.util.List; + +@SuppressWarnings("unused") +public final class HideAdbPatch { + private static final List SPOOF_SETTINGS = Arrays.asList("adb_enabled", "adb_wifi_enabled", "development_settings_enabled"); + + public static int getInt(ContentResolver cr, String name) throws Settings.SettingNotFoundException { + if (SPOOF_SETTINGS.contains(name)) { + return 0; + } + + return Settings.Global.getInt(cr, name); + } + + public static int getInt(ContentResolver cr, String name, int def) { + if (SPOOF_SETTINGS.contains(name)) { + return 0; + } + + return Settings.Global.getInt(cr, name, def); + } +} diff --git a/patches/api/patches.api b/patches/api/patches.api index 414342e4e..72c53e50a 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -2,6 +2,10 @@ public final class app/revanced/patches/all/misc/activity/exportall/ExportAllAct public static final fun getExportAllActivitiesPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } +public final class app/revanced/patches/all/misc/adb/HideAdbPatchKt { + public static final fun getHideAdbStatusPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/all/misc/build/BaseSpoofBuildInfoPatchKt { public static final fun baseSpoofBuildInfoPatch (Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/adb/HideAdbPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/adb/HideAdbPatch.kt new file mode 100644 index 000000000..61a7c9dfb --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/adb/HideAdbPatch.kt @@ -0,0 +1,57 @@ +package app.revanced.patches.all.misc.adb + +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.all.misc.transformation.transformInstructionsPatch +import app.revanced.util.getReference +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c +import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.immutable.reference.ImmutableMethodReference +import com.android.tools.smali.dexlib2.util.MethodUtil + +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/all/spoof/adb/SpoofAdbPatch;" + +private val SETTINGS_GLOBAL_GET_INT_METHOD_REFERENCE = ImmutableMethodReference( + "Landroid/provider/Settings\$Global;", + "getInt", + emptyList(), + "I" +) + +@Suppress("unused") +val hideAdbStatusPatch = bytecodePatch( + name = "Hide ADB status", + description = "Hides enabled development settings and/or ADB.", + use = false, +) { + extendWith("extensions/all/misc/adb/hide-adb.rve") + + dependsOn( + transformInstructionsPatch( + filterMap = filterMap@{ classDef, method, instruction, instructionIndex -> + val reference = instruction + .takeIf { it.opcode == Opcode.INVOKE_STATIC } + ?.getReference() + ?.takeIf { MethodUtil.methodSignaturesMatch(SETTINGS_GLOBAL_GET_INT_METHOD_REFERENCE, it) } + ?: return@filterMap null + + Triple(instruction as Instruction35c, instructionIndex, reference.parameterTypes) + }, + transform = { method, entry -> + val (instruction, index, parameterTypes) = entry + val parameterString = parameterTypes.joinToString(separator = "") + + val registerString = when (parameterTypes.size) { + 2 -> "v${instruction.registerC}, v${instruction.registerD}" + else -> "v${instruction.registerC}, v${instruction.registerD}, v${instruction.registerE}" + } + + method.replaceInstruction( + index, + "invoke-static { $registerString }, $EXTENSION_CLASS_DESCRIPTOR->getInt($parameterString)I" + ) + } + ) + ) +}