Skip to content

Commit

Permalink
feat(Gboard - Always-incognito mode): Add new fingerprint for inlined…
Browse files Browse the repository at this point in the history
… incognito mode check
  • Loading branch information
jkennethcarino committed Jul 27, 2024
1 parent ea2d9d5 commit 6aacbeb
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,16 @@ package dev.jkcarino.revanced.patches.google.gboard.misc.incognito

import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction35c
import dev.jkcarino.revanced.patches.google.gboard.detection.signature.BypassSignaturePatch
import dev.jkcarino.revanced.patches.google.gboard.misc.incognito.fingerprints.IsIncognitoModeFingerprint
import dev.jkcarino.revanced.util.exception
import dev.jkcarino.revanced.patches.google.gboard.misc.incognito.fingerprints.IsIncognitoModeInlinedFingerprint

@Patch(
name = "Always-incognito mode for Gboard",
Expand All @@ -21,15 +25,43 @@ import dev.jkcarino.revanced.util.exception
)
@Suppress("unused")
object AlwaysIncognitoModePatch : BytecodePatch(
setOf(IsIncognitoModeFingerprint)
setOf(
IsIncognitoModeFingerprint,
IsIncognitoModeInlinedFingerprint, // since 14.4.06.646482735 beta
)
) {
override fun execute(context: BytecodeContext) {
IsIncognitoModeFingerprint.result?.mutableMethod?.addInstructions(
val isIncognitoModeFingerprintResult = IsIncognitoModeFingerprint.result
val isIncognitoModeInlinedFingerprintResult = IsIncognitoModeInlinedFingerprint.result

isIncognitoModeFingerprintResult
?: isIncognitoModeInlinedFingerprintResult
?: throw PatchException("Failed to force-enable incognito mode.")

isIncognitoModeFingerprintResult?.mutableMethod?.addInstructions(
index = 0,
smaliInstructions = """
const/4 v0, 0x1
return v0
"""
) ?: throw IsIncognitoModeFingerprint.exception
)

isIncognitoModeInlinedFingerprintResult?.let { result ->
val patternScanResult = result.scanResult.patternScanResult!!
val requestIncognitoModeIndex = patternScanResult.endIndex
val isIncognitoModeIndex = patternScanResult.endIndex - 1

result.mutableMethod.apply {
val requestIncognitoModeInstruction = getInstruction<BuilderInstruction35c>(
index = requestIncognitoModeIndex
)
val isIncognitoModeRegister = requestIncognitoModeInstruction.registerD

replaceInstruction(
index = isIncognitoModeIndex,
smaliInstruction = "const/4 v$isIncognitoModeRegister, 0x1"
)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package dev.jkcarino.revanced.patches.google.gboard.misc.incognito.fingerprints

import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode

internal object IsIncognitoModeInlinedFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("Landroid/view/inputmethod/EditorInfo;", "Z"),
opcodes = listOf(
Opcode.IF_EQZ,
Opcode.IGET,
Opcode.CONST_HIGH16,
Opcode.AND_INT_2ADDR,
Opcode.IF_EQZ,
Opcode.MOVE,
Opcode.GOTO,
Opcode.CONST_4,
Opcode.INVOKE_VIRTUAL,
),
customFingerprint = { methodDef, _ ->
methodDef.name == "onStartInput"
}
)

0 comments on commit 6aacbeb

Please sign in to comment.