From 8ade9e88023566c34e7799ab90b19e8f78590333 Mon Sep 17 00:00:00 2001 From: naijun0403 Date: Wed, 14 May 2025 13:48:43 +0900 Subject: [PATCH] feat(kakaotalk): Add Ghost Mode patch to hide typing status --- patches/api/patches.api | 4 +++ .../patches/kakaotalk/ghost/GhostModePatch.kt | 25 +++++++++++++++ .../fingerprints/GhostModeFingerprint.kt | 32 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 patches/src/main/kotlin/app/revanced/patches/kakaotalk/ghost/GhostModePatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/kakaotalk/ghost/fingerprints/GhostModeFingerprint.kt diff --git a/patches/api/patches.api b/patches/api/patches.api index 1c967bb33..d65cc263a 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -261,6 +261,10 @@ public final class app/revanced/patches/kakaotalk/emoticon/ForceEnableEmoticonPl public static final fun getForceEnableEmoticonPlusPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/kakaotalk/ghost/GhostModePatchKt { + public static final fun getGhostMode ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/kakaotalk/misc/RemoveShopTabPatchKt { public static final fun getRemoveShopTabPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/kakaotalk/ghost/GhostModePatch.kt b/patches/src/main/kotlin/app/revanced/patches/kakaotalk/ghost/GhostModePatch.kt new file mode 100644 index 000000000..4edad69f2 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/kakaotalk/ghost/GhostModePatch.kt @@ -0,0 +1,25 @@ +package app.revanced.patches.kakaotalk.ghost + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.kakaotalk.ghost.fingerprints.ghostModeFingerprint + +@Suppress("unused") +val ghostMode = bytecodePatch( + name = "Ghost Mode", + description = "Don't expose your typing status to the other party.", +) { + compatibleWith("com.kakao.talk"("25.4.0")) + + execute { + val method = ghostModeFingerprint.method + + method.addInstructions( + 0, + """ + sget-object v0, Lnk0/C;->a:Lnk0/C; + return-object v0 + """.trimIndent() + ) + } +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/kakaotalk/ghost/fingerprints/GhostModeFingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/kakaotalk/ghost/fingerprints/GhostModeFingerprint.kt new file mode 100644 index 000000000..98fe2fe34 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/kakaotalk/ghost/fingerprints/GhostModeFingerprint.kt @@ -0,0 +1,32 @@ +package app.revanced.patches.kakaotalk.ghost.fingerprints + +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode + +internal val ghostModeFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Ljava/lang/Object;") + parameters("Ljava/lang/Object;") + strings( + "method", + "chatId", + "type", + "linkId" + ) + opcodes( + Opcode.SGET_OBJECT, + Opcode.INVOKE_STATIC, + Opcode.INVOKE_STATIC, + Opcode.MOVE_RESULT_OBJECT, + Opcode.NEW_INSTANCE, + Opcode.IGET_WIDE, + Opcode.INVOKE_DIRECT, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT_WIDE, + Opcode.CONST_WIDE_16, + Opcode.CMP_LONG, + Opcode.IF_GEZ, + Opcode.GOTO + ) +} \ No newline at end of file