Trellis Session Insight
mindfold-ai/Trellis
Reach into past AI conversation history through the trellis mem CLI.
Complete guide to Morphe fingerprinting — how to identify obfuscated methods using stable characteristics.
$ npx skills add Paresh-Maheshwari/morphe-ai --skill fingerprinting-guide -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Paresh-Maheshwari/morphe-ai fingerprinting-guide --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "fingerprinting-guide" agent skill from https://github.com/Paresh-Maheshwari/morphe-ai/tree/main/.kiro/skills/fingerprinting-guide into .claude/skills/fingerprinting-guide/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fingerprinting-guide", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Paresh-Maheshwari/morphe-ai/tree/main/.kiro/skills/fingerprinting-guideType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Paresh-Maheshwari/morphe-ai --skill fingerprinting-guide -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Paresh-Maheshwari/morphe-ai fingerprinting-guide --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Paresh-Maheshwari/morphe-ai.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.kiro/skills/fingerprinting-guide .agents/skills/fingerprinting-guide && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "fingerprinting-guide" agent skill from https://github.com/Paresh-Maheshwari/morphe-ai/tree/main/.kiro/skills/fingerprinting-guide into .agents/skills/fingerprinting-guide/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fingerprinting-guide", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Paresh-Maheshwari/morphe-ai --skill fingerprinting-guide -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Paresh-Maheshwari/morphe-ai fingerprinting-guide --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Paresh-Maheshwari/morphe-ai.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.kiro/skills/fingerprinting-guide .cursor/skills/fingerprinting-guide && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "fingerprinting-guide" agent skill from https://github.com/Paresh-Maheshwari/morphe-ai/tree/main/.kiro/skills/fingerprinting-guide into .cursor/skills/fingerprinting-guide/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fingerprinting-guide", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Paresh-Maheshwari/morphe-ai.git --path .kiro/skills/fingerprinting-guide--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Paresh-Maheshwari/morphe-ai --skill fingerprinting-guide -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Paresh-Maheshwari/morphe-ai fingerprinting-guide --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Paresh-Maheshwari/morphe-ai.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.kiro/skills/fingerprinting-guide .gemini/skills/fingerprinting-guide && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "fingerprinting-guide" agent skill from https://github.com/Paresh-Maheshwari/morphe-ai/tree/main/.kiro/skills/fingerprinting-guide into .gemini/skills/fingerprinting-guide/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fingerprinting-guide", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Paresh-Maheshwari/morphe-ai fingerprinting-guideInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Paresh-Maheshwari/morphe-ai --skill fingerprinting-guide -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Paresh-Maheshwari/morphe-ai.git skills-src && mkdir -p .github/skills && cp -r skills-src/.kiro/skills/fingerprinting-guide .github/skills/fingerprinting-guide && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "fingerprinting-guide" agent skill from https://github.com/Paresh-Maheshwari/morphe-ai/tree/main/.kiro/skills/fingerprinting-guide into .github/skills/fingerprinting-guide/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fingerprinting-guide", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Paresh-Maheshwari/morphe-ai --skill fingerprinting-guide -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Paresh-Maheshwari/morphe-ai fingerprinting-guide --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Paresh-Maheshwari/morphe-ai.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.kiro/skills/fingerprinting-guide .opencode/skills/fingerprinting-guide && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "fingerprinting-guide" agent skill from https://github.com/Paresh-Maheshwari/morphe-ai/tree/main/.kiro/skills/fingerprinting-guide into .opencode/skills/fingerprinting-guide/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fingerprinting-guide", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
fingerprinting-guideComplete 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. 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.
2 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 2d7fde2. It shows what the files ask for, not the result of running them.
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.
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.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
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.
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.
.claude/skills/fingerprinting-guide/SKILL.md (or your agent's skills folder).When to use: User needs to create or debug fingerprints. NEVER use obfuscated names. Always verify against smali, not jadx. Use
filters(ordered) overstrings(unordered). Declare asobjectclasses for named stack traces.
⚠️ 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.
Declare as object classes — this gives named stack traces when a fingerprint fails to match:
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(…).
accessFlags matches the exact bitmask. Every flag present in the method must be listed:
// ✅ 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 value | Smali keyword |
|---|---|
PUBLIC | public |
PRIVATE | private |
PROTECTED | protected |
STATIC | static |
FINAL | final |
ABSTRACT | abstract |
CONSTRUCTOR | constructor (<init>) |
SYNTHETIC | synthetic |
| Filter | Usage |
|---|---|
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.
| Location | Description |
|---|---|
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 |
MatchAfterAtLeast | Deprecated — avoid; will be removed |
MatchAfterRange | Deprecated — avoid; will be removed |
filters = listOf(string("foo"), string("bar")) — order must match target methodstrings = listOf("foo", "bar") — matches in any order, useful for enums with many stringsexecute {
// 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)
}| Property | Returns | On no match |
|---|---|---|
originalClassDef | Immutable class | Exception |
originalClassDefOrNull | Immutable class | null |
originalMethod | Immutable method | null |
classDef | Mutable class (replaces original) | Exception |
method | Mutable method (replaces original) | Exception |
methodOrNull | Mutable method | null |
instructionMatches | List<InstructionMatch> | Exception if no filters |
instructionMatchesOrNull | List<InstructionMatch>? | null |
Use original* for read-only access (avoids creating mutable copy).
Find class via one fingerprint, then find method within it:
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()),
)
)execute {
val dynamicFingerprint = Fingerprint(
definingClass = SomeFingerprint.originalClassDef.type,
returnType = "V",
filters = listOf(fieldAccess(opcode = Opcode.IPUT_BOOLEAN, reference = someField))
)
dynamicFingerprint.method.apply { /* modify */ }
}When modifying multiple instructions, work from last index to first:
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.
a, b, H)isPremium, getEntitlements) are safeobject classes for named stack traces on match failure — preferred"L" for obfuscated parameter typesdefiningClass = "this" for self-referencing fieldsaccessFlags is an exact bitmask — list every flag present in smaliMatchAfterAtLeast or MatchAfterRange — both deprecatedparametersStartsWith 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
Just SKILL.md in .kiro/skills/fingerprinting-guide of Paresh-Maheshwari/morphe-ai.
Open the folder on GitHubat commit 2d7fde2
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Fingerprinting Guide this skillParesh-Maheshwari/morphe-ai | 178 | — | ~2.4k | Automated safety check: Pass | GPL-3.0 | |
| Trellis Session Insightmindfold-ai/Trellis | 15k | 4 repos | ~1.7k | Automated safety check: Pass | AGPL-3.0 | |
| Native Data FetchingCherryHQ/cherry-studio-app | 4k | 6 repos | ~2.9k | Automated safety check: Notes | MIT | |
| Debugging Executionsn8n-io/n8n | 207k | — | ~2.6k | Automated safety check: Pass | Custom licence | |
| Aoti Debugpytorch/pytorch | 104k | 1 repos | ~1.7k | Automated safety check: Pass | Custom licence | |
| Herdr Throwaway Reproductionherdrdev/herdr | 43k | — | ~2.4k | Automated safety check: Pass | Apache-2.0 |
mindfold-ai/Trellis
Reach into past AI conversation history through the trellis mem CLI.
CherryHQ/cherry-studio-app
A skill your agent uses when implementing or debugging ANY network request, API call, or data fetching.
n8n-io/n8n
Debug failed or wrong-output workflow executions using executions tools.
pytorch/pytorch
Debug AOTInductor (AOTI) errors and crashes. An agent skill from pytorch/pytorch.
herdrdev/herdr
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.
ultralisp/ultralisp
A skill your agent uses when encountering any bug, test failure, or unexpected behavior, before proposing fixes
Paresh-Maheshwari/morphe-ai
Build, test, deploy, and troubleshoot Morphe patches — gradle commands, CLI usage, git workflow, common errors and fixes.
Paresh-Maheshwari/morphe-ai
Complete Morphe development environment setup — prerequisites, cloning repos, gradle auth, IDE config, build commands.
Paresh-Maheshwari/morphe-ai
Morphe CLI v1.17.0 (morphe-desktop) complete command reference — patch, list-patches, list-versions, options-create, utility install/uninstall.
Paresh-Maheshwari/morphe-ai
Morphe FAQ, current pinned official app targets, and app-specific notes.
Paresh-Maheshwari/morphe-ai
Complete reference for all Morphe utility libraries — BytecodeUtils, ResourceUtils, FreeRegisterProvider, Settings, UI, Extensions.
Paresh-Maheshwari/morphe-ai
How to write Morphe patches — bytecodePatch DSL, compatibility, extensions, options, finalization.
Categories
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.
Fingerprinting Guide fits situations like: creating fingerprints; debugging fingerprint match failures; understanding how filters work.
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.
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.
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.
SKILL.md names no scripts, command-line tools or credentials: Fingerprinting Guide is instructions for the agent only.
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.
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.
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.
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.
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.
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.