ReVanced / revanced-patcher

💉 ReVanced Patcher used to patch Android applications
https://revanced.app
GNU General Public License v3.0
2.49k stars 206 forks source link

feat: use class fingerprint instead of method fingerprint #164

Open Aunali321 opened 1 year ago

Aunali321 commented 1 year ago

Type

Functionality

Issue

Class fingerprints are helpful to find methods that have same method signature.

Feature

object MyClassFingerprint : ClassFingerprint(
    "com/example/package/MyClass",  // Name of the class
    listOf( // list of method signatures present in the class
        MethodFingerprint("V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf("L", "L", "L"), listOf(
            // Opcode list for method 1
        )),

        MethodFingerprint(strings = listOf("force_overlay", "Media#updateFields", "live_reels_metadata"))

        MethodFingerprint(customFingerprint = { methodDef ->
            methodDef.definingClass.endsWith("ClipsEditMetadataController;")
    }),

        // Add more method fingerprints as needed
    ),
    // Number of methods in the class
    3
)

ClassFingerprint: This is a class that extends the Fingerprint class and is used to define the fingerprint of the target class. The ClassFingerprint includes a set of characteristics that uniquely identify the target class, such as the class name, method signatures, and number of methods in the class.

Other details are self-explanatory.

Motivation

  1. Class structure is more stable
  2. More precise matching
  3. Less prone to false positives

Additional context

No response

Acknowledgements

oSumAtrIX commented 1 year ago

Also fields and other metadata like access flags

badawoll commented 1 year ago

This feature came up in a discussion here.

Not sure what the best way to implement this would be (I don't have much Kotlin development experience), I came up with two viable solutions (they both expose ClassDef to `customFingerprint):

Maybe there exists even a cleaner way? I looked at extensions, but I couldn't find a nice way to pass a local variable into an extension function/field.

MethodFingerprint could also be reworked to perform matching on the ClassDef.

oSumAtrIX commented 1 year ago

The first way is not an issue. The commit will be marked as a breaking change, if patches update to it, they will have to adjust.