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