Agent skill

Fingerprinting Guide

by Paresh-Maheshwari in Paresh-Maheshwari/morphe-ai

Complete guide to Morphe fingerprinting — how to identify obfuscated methods using stable characteristics.

GPL-3.0Auto-check passedDevelopment

Install Fingerprinting Guide

skills CLI
$ npx skills add Paresh-Maheshwari/morphe-ai --skill fingerprinting-guide -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Paresh-Maheshwari/morphe-ai fingerprinting-guide --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Paresh-Maheshwari/morphe-ai.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.kiro/skills/fingerprinting-guide .claude/skills/fingerprinting-guide && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
fingerprinting-guide
GitHub stars
178
Token cost
~2.4k tokens
SKILL.md length
567 words
Files
1
Skills in repo
13
Repo updated
First seen
Licence
GPL-3.0

At a glance

Complete guide to Morphe fingerprinting — how to identify obfuscated methods using stable characteristics.

  • Works in 2 steps: Preferred — ordered via filters: filters… → Unordered via strings: strings =…
  • Creating fingerprints
  • SKILL.md covers Fingerprint Declaration —…, Access Flags — Exact Bitmask, Filter Types and InstructionLocation Options, plus 7 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Fingerprinting Guide is an agent skill from Paresh-Maheshwari/morphe-ai. Complete guide to Morphe fingerprinting — how to identify obfuscated methods using stable characteristics. Use when creating fingerprints, debugging fingerprint match failures, or understanding how filters work.

Its SKILL.md is about 2.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Debugging. The repository describes itself as: Morphe's AI-powered Android APK patching workspace — multi-agent pipeline for APK analysis, target hunting, patch writing & deployment. The licence is GPL-3.0.

When your agent uses it

  • Creating fingerprints
  • Debugging fingerprint match failures
  • Understanding how filters work

Example prompts

  • “/fingerprinting-guide”

Workflow steps

2 steps, taken from the first numbered list in SKILL.md.

  1. Preferred — ordered via filters: filters = listOf(string("foo"), string("bar")) — order must match target method
  2. Unordered via strings: strings = listOf("foo", "bar") — matches in any order, useful for enums with many strings

What it can do on your machine

Read from SKILL.md and the folder at commit 2d7fde2. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are kotlin).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Fingerprinting Guide loads about 2.4k tokens when it runs. Until then it costs about 58 tokens; SKILL.md has 567 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~58
When it runs · the whole SKILL.md, loaded when a task matches
~2.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from Paresh-Maheshwari/morphe-ai at commit 2d7fde2, republished under its GPL-3.0 licence (© Paresh-Maheshwari). 567 words, ~2,385 tokens.

Download SKILL.mdSave it as .claude/skills/fingerprinting-guide/SKILL.md (or your agent's skills folder).
name
fingerprinting-guide
description
Complete guide to Morphe fingerprinting — how to identify obfuscated methods using stable characteristics. Use when creating fingerprints, debugging fingerprint match failures, or understanding how filters work.

When to use: User needs to create or debug fingerprints. NEVER use obfuscated names. Always verify against smali, not jadx. Use filters (ordered) over strings (unordered). Declare as object classes for named stack traces.

Morphe Fingerprinting — Official Reference

⚠️ Pinned source: morphe-patcher 6f189f9. Official docs may lag the source — the pinned source wins if anything contradicts this file.

A fingerprint is a partial description of a method used to uniquely match it by stable characteristics that survive app updates. Obfuscated names change every release — fingerprints match on return type, access flags, parameters, and instruction patterns instead.

Fingerprint Declaration — Preferred Style

Declare as object classes — this gives named stack traces when a fingerprint fails to match:

kotlin
object MyFingerprint : Fingerprint(
    definingClass = "Lcom/example/Class;",   // StringComparisonType semantics
    name = "methodName",                      // Only for non-obfuscated methods
    accessFlags = listOf(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL),
    returnType = "Z",
    parameters = listOf("Ljava/lang/String;", "I", "L"),  // "L" for obfuscated classes

    // Ordered instruction filters (must appear in same order as target method)
    filters = listOf(
        fieldAccess(opcode = Opcode.IGET, definingClass = "this", type = "Ljava/util/Map;"),
        string("showBannerAds"),
        methodCall(definingClass = "Ljava/lang/String;", name = "equals"),
        opcode(Opcode.MOVE_RESULT, InstructionLocation.MatchAfterImmediately()),
        literal(1337),
        opcode(Opcode.IF_EQ),
    ),

    // Unordered string matching (for methods with many strings in random order)
    strings = listOf("unordered1", "unordered2"),

    // Custom predicate
    custom = { method, classDef -> classDef.type == "Lcom/target/Class;" },

    // Find class via another fingerprint first
    classFingerprint = AnotherFingerprint,
)

The old DSL builder (fingerprint { … }) is deprecated. Always use object X : Fingerprint(…).

Access Flags — Exact Bitmask

accessFlags matches the exact bitmask. Every flag present in the method must be listed:

kotlin
// ✅ Public static — list both
accessFlags = listOf(AccessFlags.PUBLIC, AccessFlags.STATIC)

// ✅ Public static final — list all three
accessFlags = listOf(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL)

// ❌ Wrong — won't match a "public static final" method if FINAL is omitted
accessFlags = listOf(AccessFlags.PUBLIC, AccessFlags.STATIC)

Always verify the exact flags from smali. The common ones:

AccessFlags valueSmali keyword
PUBLICpublic
PRIVATEprivate
PROTECTEDprotected
STATICstatic
FINALfinal
ABSTRACTabstract
CONSTRUCTORconstructor (<init>)
SYNTHETICsynthetic

Filter Types

FilterUsage
string("text")Match const-string instruction (EQUALS by default)
string("text", StringComparisonType.CONTAINS)Match string with custom comparison
methodCall(definingClass, name, parameters, returnType)Match invoke-* instruction
methodCall(smali = "Landroid/net/Uri;->parse(...)Landroid/net/Uri;")Smali shorthand
fieldAccess(opcode, definingClass, name, type)Match field get/put
fieldAccess(smali = "Landroid/os/Build;->MODEL:Ljava/lang/String;")Smali shorthand
opcode(Opcode.X)Match specific opcode
literal(value)Match const literal (Long, Int, Double, Float, or () -> Long? lambda)
resourceLiteral(ResourceType.ID, "view_name")Match resource ID literal
newInstance("Lcom/example/Foo;")Match new-instance / new-array
instanceOf("Lcom/example/Foo;")Match instance-of
checkCast("Lcom/example/Foo;")Match check-cast
anyInstruction(f1, f2)Match any alternative (for version differences)

For methodCall, fieldAccess, newInstance, instanceOf, and checkCast, the comparison type is inferred from the type declaration: exact types (e.g. Lcom/Foo;) use EQUALS, prefixes (e.g. Lcom/) use STARTS_WITH, and suffixes (e.g. /Foo;) use ENDS_WITH.

InstructionLocation Options

LocationDescription
MatchAfterAnywhere()Default — match anywhere after previous filter
MatchAfterImmediately()Must be immediately after previous filter (MOVE_RESULT etc.)
MatchAfterWithin(n)Within n unmatched instructions of previous filter
MatchFirst()First instruction of method; only valid for first filter
MatchAfterAtLeastDeprecated — avoid; will be removed
MatchAfterRangeDeprecated — avoid; will be removed
Show full SKILL.md (230 more words)Show less

String Declarations — Two Ways

  1. Preferred — ordered via filters: filters = listOf(string("foo"), string("bar")) — order must match target method
  2. Unordered via strings: strings = listOf("foo", "bar") — matches in any order, useful for enums with many strings

Using Fingerprints in Patches

kotlin
execute {
    // Auto-matches on first access, cached for reuse
    MyFingerprint.method.addInstructions(0, "...")

    // Access instruction match indices (only when filters are declared)
    val index = MyFingerprint.instructionMatches[0].index
    val reg = MyFingerprint.instructionMatches[0].getInstruction<OneRegisterInstruction>().registerA

    // Null-safe instructionMatches — doesn't throw if no filters
    val matchesOrNull = MyFingerprint.instructionMatchesOrNull

    // Navigate to called method from a methodCall filter match
    val calledMethod = MyFingerprint.instructionMatches[0].getMethodCalled()

    // Navigate to accessed field from a fieldAccess filter match
    val field = MyFingerprint.instructionMatches[1].getFieldAccessed()

    // Access class
    val classDef = MyFingerprint.originalClassDef

    // Null-safe access
    val methodOrNull = MyFingerprint.methodOrNull

    // Match all occurrences — with optional count range
    Fingerprint(filters = listOf(string("target"))).matchAll()
        .forEach { match -> match.method.apply { /* modify */ } }

    // Match all, require exactly 2–4 matches
    MyFingerprint.matchAll(2..4).forEach { /* … */ }

    // Manual matching in specific class
    MyFingerprint.match(SomeOtherFingerprint.originalClassDef)
}

Fingerprint Properties

PropertyReturnsOn no match
originalClassDefImmutable classException
originalClassDefOrNullImmutable classnull
originalMethodImmutable methodnull
classDefMutable class (replaces original)Exception
methodMutable method (replaces original)Exception
methodOrNullMutable methodnull
instructionMatchesList<InstructionMatch>Exception if no filters
instructionMatchesOrNullList<InstructionMatch>?null

Use original* for read-only access (avoids creating mutable copy).

Class-Based Fingerprint Chaining

Find class via one fingerprint, then find method within it:

kotlin
object AdClassFingerprint : Fingerprint(
    name = "toString",
    strings = listOf("classField="),
)

object ShowAdFingerprint : Fingerprint(
    classFingerprint = AdClassFingerprint,
    returnType = "Z",
    filters = listOf(
        methodCall(name = "getValue", returnType = "Z"),
        opcode(Opcode.MOVE_RESULT, InstructionLocation.MatchAfterImmediately()),
    )
)

Dynamic Fingerprints (using prior match results)

kotlin
execute {
    val dynamicFingerprint = Fingerprint(
        definingClass = SomeFingerprint.originalClassDef.type,
        returnType = "V",
        filters = listOf(fieldAccess(opcode = Opcode.IPUT_BOOLEAN, reference = someField))
    )
    dynamicFingerprint.method.apply { /* modify */ }
}

Multiple Modifications — Index Safety

When modifying multiple instructions, work from last index to first:

kotlin
AdLoaderFingerprint.let {
    // Last filter first
    val filter6 = it.instructionMatches[5]
    it.method.removeInstruction(filter6.index)

    // Then earlier filter
    val filter4 = it.instructionMatches[3]
    val reg = filter4.getInstruction<OneRegisterInstruction>().registerA
    it.method.addInstructions(filter4.index + 1, "const/4 v$reg, 0x0")
}

Or use clearMatch() + match() to refresh indices after modifications.

Critical Rules

  • NEVER use obfuscated class/method names (a, b, H)
  • Non-obfuscated names (isPremium, getEntitlements) are safe
  • Filters must appear in same order as target method instructions
  • Declare as object classes for named stack traces on match failure — preferred
  • Always verify against smali bytecode, not jadx Java output
  • Fingerprints match once and cache — safe to share between patches
  • Use "L" for obfuscated parameter types
  • Use definingClass = "this" for self-referencing fields
  • accessFlags is an exact bitmask — list every flag present in smali
  • Do not use MatchAfterAtLeast or MatchAfterRange — both deprecated
  • parametersStartsWith is renamed to parametersMatch — use the new name

© Paresh-Maheshwari, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .kiro/skills/fingerprinting-guide of Paresh-Maheshwari/morphe-ai.

Open the folder on GitHubat commit 2d7fde2

Compare with similar skills

Fingerprinting Guide next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Fingerprinting Guide compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Fingerprinting Guide this skillParesh-Maheshwari/morphe-ai178—~2.4kAutomated safety check: PassGPL-3.0
Trellis Session Insightmindfold-ai/Trellis15k4 repos~1.7kAutomated safety check: PassAGPL-3.0
Native Data FetchingCherryHQ/cherry-studio-app4k6 repos~2.9kAutomated safety check: NotesMIT
Debugging Executionsn8n-io/n8n207k—~2.6kAutomated safety check: PassCustom licence
Aoti Debugpytorch/pytorch104k1 repos~1.7kAutomated safety check: PassCustom licence
Herdr Throwaway Reproductionherdrdev/herdr43k—~2.4kAutomated safety check: PassApache-2.0

Similar skills

  • Trellis Session Insight

    mindfold-ai/Trellis

    Reach into past AI conversation history through the trellis mem CLI.

    15k GitHub starsUsed in 4 repos~1.7k tokens
    DevelopmentAuto-check passed
  • Native Data Fetching

    CherryHQ/cherry-studio-app

    A skill your agent uses when implementing or debugging ANY network request, API call, or data fetching.

    4k GitHub starsUsed in 6 repos~2.9k tokens
    DevelopmentAuto-check: notes
  • Official

    Debug failed or wrong-output workflow executions using executions tools.

    207k GitHub stars~2.6k tokensUpdated today
    DevelopmentAuto-check passed
  • Aoti Debug

    pytorch/pytorch

    Debug AOTInductor (AOTI) errors and crashes. An agent skill from pytorch/pytorch.

    104k GitHub starsUsed in 1 repo~1.7k tokens
    DevelopmentAuto-check passed
  • Runs a disposable, uniquely named Herdr session inside an existing one so runtime, pane, terminal or API bugs can be reproduced without touching the main session.

    43k GitHub stars~2.4k tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Systematic Debugging

    ultralisp/ultralisp

    A skill your agent uses when encountering any bug, test failure, or unexpected behavior, before proposing fixes

    258 GitHub starsUsed in 52 repos~2.4k tokens
    DevelopmentAuto-check passed

More from Paresh-Maheshwari/morphe-ai

All 13 skills in this repo
  • Build Deploy Troubleshoot

    Paresh-Maheshwari/morphe-ai

    Build, test, deploy, and troubleshoot Morphe patches — gradle commands, CLI usage, git workflow, common errors and fixes.

    178 GitHub stars~1.1k tokensUpdated 12 days ago
    Auto-check passed
  • Dev Environment Setup

    Paresh-Maheshwari/morphe-ai

    Complete Morphe development environment setup — prerequisites, cloning repos, gradle auth, IDE config, build commands.

    178 GitHub stars~1k tokensUpdated 12 days ago
    Auto-check: notes
  • Morphe CLI Reference

    Paresh-Maheshwari/morphe-ai

    Morphe CLI v1.17.0 (morphe-desktop) complete command reference — patch, list-patches, list-versions, options-create, utility install/uninstall.

    178 GitHub stars~2.9k tokensUpdated 12 days ago
    Auto-check passed
  • Morphe Faq And App Notes

    Paresh-Maheshwari/morphe-ai

    Morphe FAQ, current pinned official app targets, and app-specific notes.

    178 GitHub stars~573 tokensUpdated 12 days ago
    Auto-check passed
  • Morphe Library Reference

    Paresh-Maheshwari/morphe-ai

    Complete reference for all Morphe utility libraries — BytecodeUtils, ResourceUtils, FreeRegisterProvider, Settings, UI, Extensions.

    178 GitHub stars~1.9k tokensUpdated 12 days ago
    Auto-check passed
  • Patch Anatomy

    Paresh-Maheshwari/morphe-ai

    How to write Morphe patches — bytecodePatch DSL, compatibility, extensions, options, finalization.

    178 GitHub stars~2.4k tokensUpdated 12 days ago
    Auto-check passed

Categories

Questions about Fingerprinting Guide

What does Fingerprinting Guide do?

Complete guide to Morphe fingerprinting — how to identify obfuscated methods using stable characteristics. Fingerprinting Guide is an agent skill from Paresh-Maheshwari/morphe-ai. Complete guide to Morphe fingerprinting — how to identify obfuscated methods using stable characteristics.

When should I use Fingerprinting Guide?

Fingerprinting Guide fits situations like: creating fingerprints; debugging fingerprint match failures; understanding how filters work.

How do I install Fingerprinting Guide in Claude Code?

Run `npx skills add Paresh-Maheshwari/morphe-ai --skill fingerprinting-guide -a claude-code`. Or copy the skill folder (.kiro/skills/fingerprinting-guide in Paresh-Maheshwari/morphe-ai) into .claude/skills/fingerprinting-guide in your project. Claude Code loads it when a task matches its description.

How do I install Fingerprinting Guide in Codex?

Run `npx skills add Paresh-Maheshwari/morphe-ai --skill fingerprinting-guide -a codex`. Or copy the skill folder (.kiro/skills/fingerprinting-guide in Paresh-Maheshwari/morphe-ai) into .agents/skills/fingerprinting-guide in your project. Codex loads it when a task matches its description.

Can I use Fingerprinting Guide in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Paresh-Maheshwari/morphe-ai --skill fingerprinting-guide -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/fingerprinting-guide, .gemini/skills/fingerprinting-guide, .github/skills/fingerprinting-guide and .opencode/skills/fingerprinting-guide in your project.

What does Fingerprinting Guide need to run?

SKILL.md names no scripts, command-line tools or credentials: Fingerprinting Guide is instructions for the agent only.

Does Fingerprinting Guide access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Fingerprinting Guide safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Fingerprinting Guide use?

Fingerprinting Guide is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Fingerprinting Guide use?

About 2.4k tokens (SKILL.md is roughly 9.5k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Fingerprinting Guide?

Skills that share tags, products or a category with Fingerprinting Guide: Trellis Session Insight (mindfold-ai/Trellis, 15k stars), Native Data Fetching (CherryHQ/cherry-studio-app, 4k stars), Debugging Executions (n8n-io/n8n, 207k stars) and Aoti Debug (pytorch/pytorch, 104k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Fingerprinting Guide?

Paresh-Maheshwari (a GitHub user) maintains it in Paresh-Maheshwari/morphe-ai, which has 178 GitHub stars. The repository holds 13 skills in this directory. The repository was last updated on September 29, 2026.

Source: Paresh-Maheshwari/morphe-ai on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.