fix: wrong opcode pattern for enable-seekbar-tapping-signature

This commit is contained in:
oSumAtrIX 2022-04-15 04:53:34 +02:00
parent 0924ca2ad3
commit 1d833957ed
No known key found for this signature in database
GPG key ID: A9B3094ACDB604B4
2 changed files with 20 additions and 29 deletions

View file

@ -30,7 +30,7 @@ class EnableSeekbarTappingPatch : Patch(
MethodSignature( MethodSignature(
MethodSignatureMetadata( MethodSignatureMetadata(
"enable-seekbar-tapping-parent-signature", "enable-seekbar-tapping-parent-signature",
MethodMetadata(null, null), // unknown MethodMetadata("Lesa;", "<init>"), // unknown
PatternScanMethod.Fuzzy(2), // FIXME: Test this threshold and find the best value. PatternScanMethod.Fuzzy(2), // FIXME: Test this threshold and find the best value.
compatiblePackages, compatiblePackages,
"Signature for a parent method, which is needed to find the actual method required to be patched.", "Signature for a parent method, which is needed to find the actual method required to be patched.",
@ -75,7 +75,7 @@ class EnableSeekbarTappingPatch : Patch(
MethodSignature( MethodSignature(
MethodSignatureMetadata( MethodSignatureMetadata(
"enable-seekbar-tapping-signature", "enable-seekbar-tapping-signature",
MethodMetadata(null, null), // unknown MethodMetadata("Lesa;", "onTouchEvent"), // unknown
PatternScanMethod.Fuzzy(2), // FIXME: Test this threshold and find the best value. PatternScanMethod.Fuzzy(2), // FIXME: Test this threshold and find the best value.
compatiblePackages, compatiblePackages,
"Signature for the method required to be patched.", "Signature for the method required to be patched.",
@ -85,17 +85,6 @@ class EnableSeekbarTappingPatch : Patch(
AccessFlags.PUBLIC or AccessFlags.FINAL, AccessFlags.PUBLIC or AccessFlags.FINAL,
listOf("L"), listOf("L"),
listOf( listOf(
Opcode.CMPG_DOUBLE,
Opcode.IF_GTZ,
Opcode.GOTO,
Opcode.INT_TO_FLOAT,
Opcode.INT_TO_FLOAT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.IF_NEZ,
Opcode.RETURN,
Opcode.IGET_OBJECT,
Opcode.IF_EQZ,
Opcode.INVOKE_VIRTUAL, Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_WIDE, Opcode.MOVE_RESULT_WIDE,
Opcode.INT_TO_FLOAT, Opcode.INT_TO_FLOAT,
@ -116,6 +105,15 @@ class EnableSeekbarTappingPatch : Patch(
Opcode.NEW_INSTANCE, Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT, Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT, Opcode.IPUT_OBJECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.FLOAT_TO_INT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.FLOAT_TO_INT,
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.INVOKE_VIRTUAL Opcode.INVOKE_VIRTUAL
) )
) )
@ -156,7 +154,7 @@ class EnableSeekbarTappingPatch : Patch(
val oMethod = tapSeekMethods["O"]!! val oMethod = tapSeekMethods["O"]!!
// get the required register // get the required register
val instruction = implementation.instructions[result.scanData.endIndex + 1] val instruction = implementation.instructions[result.scanData.endIndex - 1]
if (instruction.opcode != Opcode.INVOKE_VIRTUAL) if (instruction.opcode != Opcode.INVOKE_VIRTUAL)
return PatchResultError("Could not find the correct register") return PatchResultError("Could not find the correct register")
val register = (instruction as Instruction35c).registerC val register = (instruction as Instruction35c).registerC

View file

@ -10,7 +10,7 @@ import java.io.File
internal class SignatureChecker { internal class SignatureChecker {
@Test @Test
fun checkSignatures() { fun checkSignatures() {
val file = File("stock.apk") val file = File("newest.apk")
if (!file.exists()) { if (!file.exists()) {
throw IllegalStateException("Missing stock.apk! To run this test, please place stock.apk here: ${file.absolutePath}") throw IllegalStateException("Missing stock.apk! To run this test, please place stock.apk here: ${file.absolutePath}")
} }
@ -26,21 +26,14 @@ internal class SignatureChecker {
val patternScanMethod = signature.metadata.patternScanMethod val patternScanMethod = signature.metadata.patternScanMethod
if (patternScanMethod is PatternScanMethod.Fuzzy) { if (patternScanMethod is PatternScanMethod.Fuzzy) {
val warnings = patternScanMethod.warnings!! val warnings = patternScanMethod.warnings!!
println("Signature ${signature.metadata.name} had ${warnings.size} warnings!")
val method = signature.result!!.method val method = signature.result!!.method
val instructions = method.implementation!!.instructions
println("class = ${method.definingClass}, method = ${printMethod(method)}") println("Signature: ${signature.metadata.name}.\nMethod: ${method.definingClass}->${method.toStr()}\nWarnings: ${warnings.count()}")
for (warning in warnings) { for (warning in warnings) {
println("-".repeat(10)) println("${warning.instructionIndex} / ${warning.patternIndex}: ${warning.current} (expected: ${warning.expected})")
for (i in (warning.actualIndex - 5).coerceAtLeast(0) until warning.actualIndex) {
println("$i: ${instructions[i].opcode}")
} }
println("${warning.actualIndex}: $warning")
for (i in warning.actualIndex + 1 until (warning.actualIndex + 5).coerceAtMost(instructions.size)) { println("=".repeat(20) + "\n")
println("$i: ${instructions[i].opcode}")
}
}
println("=".repeat(20))
} }
} }
if (unresolved.isNotEmpty()) { if (unresolved.isNotEmpty()) {
@ -52,7 +45,7 @@ internal class SignatureChecker {
} }
} }
private fun printMethod(method: Method): String { private fun Method.toStr(): String {
return "${method.name}(${method.parameterTypes.joinToString("")})${method.returnType}" return "${this.name}(${this.parameterTypes.joinToString("")})${this.returnType}"
} }
} }