1
mirror of https://github.com/revanced/revanced-patcher synced 2025-09-17 07:30:49 +02:00

Compare commits

..

7 Commits

Author SHA1 Message Date
semantic-release-bot
6b1337e4fc chore(release): 1.0.0-dev.7 [skip ci]
# [1.0.0-dev.7](https://github.com/ReVancedTeam/revanced-patcher/compare/v1.0.0-dev.6...v1.0.0-dev.7) (2022-03-24)

### Bug Fixes

* **MethodResolver:** fix cd57a8c9a0 ([1af31b2](1af31b2aa3))
2022-03-24 22:31:58 +00:00
Lucaskyy
f4589db3a9 test: fix assert message 2022-03-24 23:31:01 +01:00
Lucaskyy
1af31b2aa3 fix(MethodResolver): fix cd57a8c9a0 2022-03-24 23:29:32 +01:00
semantic-release-bot
14f7667156 chore(release): 1.0.0-dev.6 [skip ci]
# [1.0.0-dev.6](https://github.com/ReVancedTeam/revanced-patcher/compare/v1.0.0-dev.5...v1.0.0-dev.6) (2022-03-24)

### Bug Fixes

* **MethodResolver:** strip labels nodes so opcode patterns match ([cd57a8c](cd57a8c9a0))
2022-03-24 21:49:47 +00:00
Lucaskyy
cd57a8c9a0 fix(MethodResolver): strip labels nodes so opcode patterns match
this commit is also a fix for 8d1bb5f3d9 because it corrupted the stack by completely removing the nodes
2022-03-24 22:48:34 +01:00
Lucaskyy
0d3beb353d Merge remote-tracking branch 'origin/dev' into dev 2022-03-24 21:38:22 +01:00
Lucaskyy
ddef338631 refactor: log as trace instead of debug
so there's less spam in console
2022-03-24 21:38:13 +01:00
4 changed files with 55 additions and 20 deletions

View File

@@ -1,3 +1,17 @@
# [1.0.0-dev.7](https://github.com/ReVancedTeam/revanced-patcher/compare/v1.0.0-dev.6...v1.0.0-dev.7) (2022-03-24)
### Bug Fixes
* **MethodResolver:** fix cd57a8c9a0db7e3ae5ad0bca202e5955930319ab ([1af31b2](https://github.com/ReVancedTeam/revanced-patcher/commit/1af31b2aa3772a7473c04d27bf835c8eae13438d))
# [1.0.0-dev.6](https://github.com/ReVancedTeam/revanced-patcher/compare/v1.0.0-dev.5...v1.0.0-dev.6) (2022-03-24)
### Bug Fixes
* **MethodResolver:** strip labels nodes so opcode patterns match ([cd57a8c](https://github.com/ReVancedTeam/revanced-patcher/commit/cd57a8c9a0db7e3ae5ad0bca202e5955930319ab))
# [1.0.0-dev.5](https://github.com/ReVancedTeam/revanced-patcher/compare/v1.0.0-dev.4...v1.0.0-dev.5) (2022-03-24) # [1.0.0-dev.5](https://github.com/ReVancedTeam/revanced-patcher/compare/v1.0.0-dev.4...v1.0.0-dev.5) (2022-03-24)

View File

@@ -1,2 +1,2 @@
kotlin.code.style = official kotlin.code.style = official
version = 1.0.0-dev.5 version = 1.0.0-dev.7

View File

@@ -1,11 +1,11 @@
package app.revanced.patcher.resolver package app.revanced.patcher.resolver
import mu.KotlinLogging
import app.revanced.patcher.cache.MethodMap import app.revanced.patcher.cache.MethodMap
import app.revanced.patcher.cache.PatchData import app.revanced.patcher.cache.PatchData
import app.revanced.patcher.cache.PatternScanData import app.revanced.patcher.cache.PatternScanData
import app.revanced.patcher.signature.Signature import app.revanced.patcher.signature.Signature
import app.revanced.patcher.util.ExtraTypes import app.revanced.patcher.util.ExtraTypes
import mu.KotlinLogging
import org.objectweb.asm.Type import org.objectweb.asm.Type
import org.objectweb.asm.tree.* import org.objectweb.asm.tree.*
@@ -19,16 +19,16 @@ internal class MethodResolver(private val classList: List<ClassNode>, private va
for (method in methods) { for (method in methods) {
for (signature in signatures) { for (signature in signatures) {
if (methodMap.containsKey(signature.name)) { // method already found for this sig if (methodMap.containsKey(signature.name)) { // method already found for this sig
logger.debug { "Sig ${signature.name} already found, skipping." } logger.trace { "Sig ${signature.name} already found, skipping." }
continue continue
} }
logger.debug { "Resolving sig ${signature.name}: ${classNode.name} / ${method.name}" } logger.trace { "Resolving sig ${signature.name}: ${classNode.name} / ${method.name}" }
val (r, sr) = cmp(method, signature) val (r, sr) = cmp(method, signature)
if (!r || sr == null) { if (!r || sr == null) {
logger.debug { "Compare result for sig ${signature.name} has failed!" } logger.trace { "Compare result for sig ${signature.name} has failed!" }
continue continue
} }
logger.debug { "Method for sig ${signature.name} found!" } logger.trace { "Method for sig ${signature.name} found!" }
methodMap[signature.name] = PatchData( methodMap[signature.name] = PatchData(
classNode, classNode,
method, method,
@@ -69,7 +69,7 @@ internal class MethodResolver(private val classList: List<ClassNode>, private va
signature.returns?.let { _ -> signature.returns?.let { _ ->
val methodReturns = Type.getReturnType(method.desc).convertObject() val methodReturns = Type.getReturnType(method.desc).convertObject()
if (signature.returns != methodReturns) { if (signature.returns != methodReturns) {
logger.debug { logger.trace {
""" """
Comparing sig ${signature.name}: invalid return type: Comparing sig ${signature.name}: invalid return type:
expected ${signature.returns}, expected ${signature.returns},
@@ -82,7 +82,7 @@ internal class MethodResolver(private val classList: List<ClassNode>, private va
signature.accessors?.let { _ -> signature.accessors?.let { _ ->
if (signature.accessors != method.access) { if (signature.accessors != method.access) {
logger.debug { logger.trace {
""" """
Comparing sig ${signature.name}: invalid accessors: Comparing sig ${signature.name}: invalid accessors:
expected ${signature.accessors}, expected ${signature.accessors},
@@ -96,7 +96,7 @@ internal class MethodResolver(private val classList: List<ClassNode>, private va
signature.parameters?.let { _ -> signature.parameters?.let { _ ->
val parameters = Type.getArgumentTypes(method.desc).convertObjects() val parameters = Type.getArgumentTypes(method.desc).convertObjects()
if (!signature.parameters.contentEquals(parameters)) { if (!signature.parameters.contentEquals(parameters)) {
logger.debug { logger.trace {
""" """
Comparing sig ${signature.name}: invalid parameter types: Comparing sig ${signature.name}: invalid parameter types:
expected ${signature.parameters.joinToString()}}, expected ${signature.parameters.joinToString()}},
@@ -108,9 +108,9 @@ internal class MethodResolver(private val classList: List<ClassNode>, private va
} }
signature.opcodes?.let { _ -> signature.opcodes?.let { _ ->
val result = method.instructions.stripLabels().scanFor(signature.opcodes) val result = method.instructions.scanFor(signature.opcodes)
if (!result.found) { if (!result.found) {
logger.debug { "Comparing sig ${signature.name}: invalid opcode pattern" } logger.trace { "Comparing sig ${signature.name}: invalid opcode pattern" }
return@cmp false to null return@cmp false to null
} }
return@cmp true to result return@cmp true to result
@@ -128,7 +128,14 @@ private fun InsnList.scanFor(pattern: IntArray): ScanResult {
for (i in 0 until this.size()) { for (i in 0 until this.size()) {
var occurrence = 0 var occurrence = 0
while (i + occurrence < this.size()) { while (i + occurrence < this.size()) {
if (this[i + occurrence].opcode != pattern[occurrence]) break val n = this[i + occurrence]
if (
!n.anyOf(
LabelNode::class.java,
LineNumberNode::class.java
) &&
n.opcode != pattern[occurrence]
) break
if (++occurrence >= pattern.size) { if (++occurrence >= pattern.size) {
val current = i + occurrence val current = i + occurrence
return ScanResult(true, current - pattern.size, current) return ScanResult(true, current - pattern.size, current)
@@ -151,7 +158,5 @@ private fun Array<Type>.convertObjects(): Array<Type> {
return this.map { it.convertObject() }.toTypedArray() return this.map { it.convertObject() }.toTypedArray()
} }
private fun InsnList.stripLabels(): InsnList { private fun AbstractInsnNode.anyOf(vararg types: Class<*>): Boolean =
this.removeAll { it is LabelNode || it is LineNumberNode } types.any { this@anyOf.javaClass == it }
return this
}

View File

@@ -39,8 +39,10 @@ internal class PatcherTest {
ACC_PUBLIC or ACC_STATIC, ACC_PUBLIC or ACC_STATIC,
arrayOf(ExtraTypes.ArrayAny), arrayOf(ExtraTypes.ArrayAny),
intArrayOf( intArrayOf(
GETSTATIC,
LDC, LDC,
INVOKEVIRTUAL INVOKEVIRTUAL,
RETURN
) )
) )
) )
@@ -66,7 +68,19 @@ internal class PatcherTest {
// Get the start index of our opcode pattern. // Get the start index of our opcode pattern.
// This will be the index of the LDC instruction. // This will be the index of the LDC instruction.
val startIndex = mainMethod.scanData.startIndex val startIndex = mainMethod.scanData.startIndex
TestUtil.assertNodeEqual(LdcInsnNode("Hello, world!"), instructions[startIndex]!!)
// Ignore this, just testing if the method resolver works :)
TestUtil.assertNodeEqual(
FieldInsnNode(
GETSTATIC,
Type.getInternalName(System::class.java),
"out",
// for whatever reason, it adds an "L" and ";" to the node string
"L${Type.getInternalName(PrintStream::class.java)};"
),
instructions[startIndex]!!
)
// Create a new LDC node and replace the LDC instruction. // Create a new LDC node and replace the LDC instruction.
val stringNode = LdcInsnNode("Hello, ReVanced! Editing bytecode.") val stringNode = LdcInsnNode("Hello, ReVanced! Editing bytecode.")
instructions.setAt(startIndex, stringNode) instructions.setAt(startIndex, stringNode)
@@ -82,7 +96,7 @@ internal class PatcherTest {
GETSTATIC, GETSTATIC,
Type.getInternalName(System::class.java), // "java/lang/System" Type.getInternalName(System::class.java), // "java/lang/System"
"out", "out",
"L" + Type.getInternalName(PrintStream::class.java) // "Ljava/io/PrintStream" Type.getInternalName(PrintStream::class.java) // "java/io/PrintStream"
), ),
LdcInsnNode("Hello, ReVanced! Adding bytecode."), LdcInsnNode("Hello, ReVanced! Adding bytecode."),
MethodInsnNode( MethodInsnNode(
@@ -143,7 +157,9 @@ internal class PatcherTest {
fun `should not raise an exception if any signature member except the name is missing`() { fun `should not raise an exception if any signature member except the name is missing`() {
val sigName = "testMethod" val sigName = "testMethod"
assertDoesNotThrow("Should raise an exception because opcodes is empty") { assertDoesNotThrow(
"Should not raise an exception if any signature member except the name is missing"
) {
Patcher( Patcher(
PatcherTest::class.java.getResourceAsStream("/test1.jar")!!, PatcherTest::class.java.getResourceAsStream("/test1.jar")!!,
ByteArrayOutputStream(), ByteArrayOutputStream(),