feat(kakaotalk): Add bypass request checksums patch to prevent checksum verification

This commit is contained in:
2025-05-14 17:59:57 +09:00
parent b1c9b5e47c
commit e5c7a88550
3 changed files with 74 additions and 3 deletions

View File

@ -265,14 +265,18 @@ 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;
public final class app/revanced/patches/kakaotalk/integrity/BypassRequestChecksumsFingerprintKt {
public static final fun getBypassRequestChecksumPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/kakaotalk/signature/VerifyingSignaturePatchKt {
public final class app/revanced/patches/kakaotalk/integrity/VerifyingSignaturePatchKt {
public static final fun getVerifyingSignaturePatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/kakaotalk/misc/RemoveShopTabPatchKt {
public static final fun getRemoveShopTabPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/kakaotalk/versioninfo/VersionInfoPatchKt {
public static final fun getVersionInfoPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}

View File

@ -0,0 +1,31 @@
package app.revanced.patches.kakaotalk.integrity
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.kakaotalk.common.fingerprints.kotlinUnitInstanceFingerprint
import app.revanced.patches.kakaotalk.integrity.fingerprints.bypassRequestChecksumsFingerprint
@Suppress("unused")
val bypassRequestChecksumPatch = bytecodePatch(
name = "Bypass requestChecksums",
description = "Prevents the execution of checksum verification logic by making it return early."
) {
compatibleWith("com.kakao.talk"("25.4.0"))
execute {
val findUnit = kotlinUnitInstanceFingerprint.method
val unitClass = findUnit.definingClass
val method = bypassRequestChecksumsFingerprint.method
// I tried to find the field name, but it's pretty obvious to me, so I hardcode it.
// If it changes, we need to fix it
method.addInstructions(
0,
"""
sget-object v0, $unitClass->a:$unitClass
return-object v0
""".trimIndent()
)
}
}

View File

@ -0,0 +1,36 @@
package app.revanced.patches.kakaotalk.integrity.fingerprints
import app.revanced.patcher.fingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal val bypassRequestChecksumsFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Ljava/lang/Object;")
strings(
"context"
)
opcodes(
Opcode.INSTANCE_OF,
Opcode.IF_EQZ,
Opcode.MOVE_OBJECT,
Opcode.CHECK_CAST,
Opcode.IGET,
Opcode.CONST_HIGH16,
Opcode.AND_INT,
Opcode.IF_EQZ,
Opcode.SUB_INT_2ADDR,
Opcode.IPUT,
Opcode.GOTO,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IGET_OBJECT,
Opcode.SGET_OBJECT,
Opcode.IGET,
Opcode.CONST_4,
Opcode.IF_EQZ,
Opcode.IF_NE,
Opcode.INVOKE_STATIC,
Opcode.GOTO,
)
}