Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
apk-reverse — Agent skill per il reverse engineering di APK Android: dex patching, unpacking, repacking, rimozione di annunci e paywall, analisi di .so nativi e strumentazione runtime con Frida. | Kitploit
Strumenti/GitHubGitHub/newliver666/apk-reverse
Sicurezza AndroidAnalisi StaticaAnalisi Dinamica (Sandboxing)Analisi del CodicePentesting di App MobiliReverse EngineeringScripting e AutomazioneAnalisi MalwareSicurezza MobileAnalisi di BinariApprendimento e Formazione
1.4k37921 giorno faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
GitHubnewliver666/apk-reverse

apk-reverse

Agent skill per il reverse engineering di APK Android: dex patching, unpacking, repacking, rimozione di annunci e paywall, analisi di .so nativi e strumentazione runtime con Frida.

Vedi Repository

apk-reverse

English · 简体中文

stars forks license python android ci

Capabilities · Structure · Install · Requirements · Failure catalogue · Scope · Maintenance · Disclaimer

apk-reverse

Una Agent Skill per il reverse engineering di APK Android, il debloating, la rimozione di annunci pubblicitari, il patching chirurgico del dex, il repacking e l'analisi runtime/server.

È una skill, non un tutorial: è scritta per essere caricata da un agente (Claude Code, Codex, o qualsiasi harness che supporti il formato Agent Skills) mentre lavora, quindi è organizzata per la divulgazione progressiva — un breve SKILL.md orientato alle decisioni, riferimenti dettagliati caricati solo quando un passaggio li richiede, e script parametrizzati che puoi eseguire direttamente.

Come ci si aspetta che un agente lo utilizzi

SKILL.md è deliberatamente scritto come una procedura con gate piuttosto che come un consiglio, perché la modalità di fallimento osservata non è l'ignoranza — è un modello che legge tutto quanto, concorda con esso e poi ragiona comunque dai primi principi.

Quindi ci sono quattro cose nel corpo che sono pensate per essere messe in atto, non lette:

  • Quattro regole di override (R1–R4). Quando sono in conflitto con il piano corrente, vincono finché l'evidenza non le sovrascrive.
  • Un indice dei sintomi. Ogni riga è un fallimento che è già stato pagato. Una riga corrispondente è un segnale di stop: carica quel file prima di eseguire un altro comando, piuttosto che dopo qualche altro tentativo. Ragionare oltre un sintomo noto è il modo in cui le stesse ore vengono spese due volte.
  • Quattro gate (G1–G4), ciascuno un'azione con un criterio di superamento. "Ho capito l'idea" non supera un gate. Esistono affinché la classificazione, la verità sull'ambiente e una build di controllo avvengano prima della prima patch, non dopo il terzo fallimento.
  • Una regola dei due colpi e condizioni di stop. Due fallimenti della stessa forma significano che il modello è sbagliato, non i parametri. La terza variante di un'ipotesi che ha già fallito due volte è dove i round vanno a morire.

E una cosa alla fine che è pensata per essere trattenuta: "fatto" ha una definizione (sei elementi). Un log pulito non è uno di essi. Qualcosa di meno di tutti e sei è un checkpoint, e dovrebbe essere riportato come un checkpoint con ciò che rimane.

Se sei un agente che legge questo: il primo comando possibile più economico è python skills/apk-reverse/scripts/doctor.py. Ti dice quali di questi strumenti esistono qui, quali script possono effettivamente essere eseguiti, e se qualcosa nell'ambiente sta già avvelenando le tue misurazioni.

In cosa è bravo

  • Decidere velocemente se una richiesta è anche solo realizzabile lato client, invece di bruciare ore su un paywall che è imposto da un server.
  • Decidere quale forma deve assumere il deliverable prima che inizi qualsiasi lavoro — un artefatto self-contained non rootato è un problema diverso da "fallo funzionare su questa macchina", e confondere i due è la deriva più costosa in questo dominio.
  • Scegliere il layer di patch più sicuro per una data modifica, ed evitare i layer che rompono l'app.
  • Catturare il fallimento del repack che sembra un successo: un'app che si installa, si avvia e si renderizza perfettamente mentre ogni richiesta firmata viene rifiutata, perché il client deriva la sua chiave di firma delle richieste dal proprio certificato di firma.
  • Separare i tuoi errori dai problemi dell'app o del server — un fallimento limitato a una funzionalità (login, registrazione, pagamento) è spesso un problema TLS/certificato su un percorso di codice, non una conseguenza della patch che hai appena creato. Lo stato del dispositivo, un device server morto e la deriva dell'orologio si mascherano allo stesso modo.
  • Stabilire quale architettura e quale libreria si stanno effettivamente eseguendo, invece di fidarsi di ciò che il manifest fornisce o di ciò che il dispositivo dichiara.
  • Lavorare attraverso target packed/hardened: identificare il packer, unpacking, e trasformare un memory dump di nuovo in un APK patchato e installabile.
  • Gestire una libreria hardened che termina il processo di proposito — inclusa la forma del crash deliberato (fault addr 0x4) che sembra esattamente un normale bug di null-dereference, e la regola "neutralizzalo, ma mai facendolo non ritornare" che decide se la correzione funziona o congela l'intera app in un modo che non assomiglia per niente alla causa.
  • Sapere quali strumenti usare e dove ciascuno mente — inclusi quelli che esistono solo come GUI, così chiedi un umano invece di sostituire silenziosamente un metodo più debole.
  • Far rimanere patchata una build patchata: neutralizzare i controlli di versione, le finestre di aggiornamento forzato e gli installer di auto-aggiornamento in modo che il lavoro non possa essere disattivato da remoto — e riconoscere il canale di hot-update/remote-config che può annullarlo silenziosamente senza alcun cambio di versione.
  • Separare un gate di accesso lato client (patchabile) da una risorsa con scope di account (vuota perché il server non ha nulla con cui rispondere), e sapere che forgiare una sessione produce uno stato peggiore dell'essere disconnessi.

Structure

SKILL.md, references/ e scripts/ sono tutti all'interno della directory della skill, skills/apk-reverse/. Tutto ciò che è nella root del repository è tooling di manutenzione condiviso tra le skill, non parte di una skill installata.``` SKILL.md a procedure with gates, not background reading: how-to-use -> four override rules (R1-R4) symptom index (a matching row is a stop signal) four gates (G1-G4, actions with pass criteria) thirteen classification questions the workflow, with a per-step skip condition and a two-strike rule what "done" means -> stop conditions -> constraints -> indexes references/ loaded on demand, one topic each recon.md identify packer, SDKs, code location, tamper checks; unpacking server-config-and-updates.md the most common shape of "ad" and the one usually mis-diagnosed: the server supplies UI the client renders (launch screen, popup, announcement, tab set). The two-layer fetch that proves it, how to find the config DTOs by the field names data classes keep, why you patch the decision and not the data, deciding the scope of "remove", and remote re-enable / cached config durability byte-level-patching.md equal-length byte edits: why they beat method rebuilding (measured), locating an instruction's exact offset without scraping listings, the instruction width traps that desynchronise a decode, neutralise a branch vs redirect it, dex header integrity field order, and the verifier's move-result rule packers.md hardened targets: rejection signals, measuring the validation boundary with single-variable tests, choosing a native host code-virtualization-and-custom-linkers.md the layer between "packed" and "clean": whole classes turned into native declarations, a private loader whose SONAME does not match its filename, an embedded self-decrypting payload, a Java-layer "signature killer" that logs success while a native check kills you. The keep-it/drop-it deadlock, how to separate the checker from the implementation, and the string-redirect technique that ends it without neutralizing anything framework-runtimes.md Flutter / React Native / Unity: which layer owns the UI, and how to find logic when there are no symbols (string encoding traps) dart-aot.md Dart AOT in depth: version pinning and building a matching decompiler, the object pool and reference indexes, register/boolean conventions, the three signatures that identify business logic, locating, patching. Begins with the snapshot-decoding front end it depends on (aotopsy or blutter) because the pool listing is an input, not something this skill produces itself native-and-so.md .so hosts, DT_NEEDED vs JNI_OnLoad, relocation limits, relocation-free bootstrapping, replacing Java methods natively, and which ABI/library is native-tamper-and-suicide.md how a hardened library kills its own process: the visible mechanisms, how to tell which one actually fires, how to find the site, forged section headers, function boundaries from PT_GNU_EH_FRAME, scanner traps, and neutralising safely detection-and-anti-analysis.md when the app fights back or the tool cannot run here: telling detection apart from a broken environment, deciding by cost instead of escalating, recognising an environment where dynamic analysis simply does not work, and keeping the "blocks my analysis" question separate from "blocks the deliverable" toolchain.md what to install, how to invoke it non-interactively, which tools are GUI-only, version-alignment traps, working offline, , and which signer to use long-task-discipline.md live record, conclusion grading, drift control, timeout and wait calibration, deliverable-form drift, captures-you-never-looked-at, long-context decay, handover ad-removal.md ad taxonomy, wrapper mapping, callback trap, global gates, verification updates-and-forced-upgrade.md keeping a patched build alive: locating the version check, the two-layer patch (no-op the routine, neutralise the comparison), what not to touch (manifest version, installer permission, host blocking), self-update and hot-update/remote-config channels, verifying that no version request is issued at all account-gates.md sign-in walls, forced phone binding, guest mode: telling a client-side gate (patchable) apart from an account-scoped resource (not), why fabricating a session is worse than staying signed out, and the unavoidable session loss after a reinstall signature-derived-keys.md when the app's own signing certificate is used as key material: detection greps, why offline extraction is unreliable, the hardcode-then-verify procedure membership-and-limits.md server vs client authority; what is and is not patchable server-api.md probe an app's API; prove who owns the gate tls-and-cert.md feature-scoped network failures: expired certs, dual trust chains third-party-builds.md auditing a "cracked"/"modded" APK before trusting it dex-patching.md patch-layer table + dexlib2 technique in depth patch-audit.md proving a patch and is : length-vs-bytes comparison, the equal-length-replacement blind spot, verifier-level legality (move-result adjacency) checked statically, text-matching patch traps, and reporting a missing patch repack-and-sign.md repack rules, unpack-and-repack, signing, post-install hazards runtime-data.md DataStore / SharedPreferences / SQLite / protobuf; when the app rewrites your edit, and decoding a value that looks encrypted dynamic-frida.md Frida setup, version pinning, the four-layer probe, hook strategy environment.md device/emulator setup, root, ADB, offline devices, log signals, emulator console control and recovery, preflight, look-at-the-screen verification.md the claim ladder; what "done" means desensitization-and-leak-scans.md publishing discipline: what must be desensitized and what must stay, the do-not-anonymize list, the leak scanner and its exit states, and the entry-point file as a prompt surface precedents/ the positive case library: route including dead ends, a grade per assertion, measured pit-falls, and the write-back checklist routing.md the on-demand inventory: every reference with when to load it, every script with what it does, and a mirror of the symptom index rasc-and-droidsaw.md the Rust re-implementation of the ASC indexer: measured speedup and identical class sets, the enum shape where it silently drops bodies, and how to build and verify it evidence-summary.md the condensation that ships with the skill: capability, one-line conclusion, strength, and the evidence you can actually open in an installed copy

../evals/ NOT a spec directory either, but the location the Agent Skills guidance recommends: evals.json holds the with-skill / without-skill cases this skill has not run, with the method for running them written into the file ../evidence/ NOT a spec directory: the machine-readable companions to the evidence summary reference above -- capability-matrix.json (the same rows with more fields), tested-tool-versions.json (versions and the probe behind each), known-limitations.md (the installer-facing limit list). Shipped inside the skill so an installed copy can answer "was this verified, and how strongly" without the repository pitfalls.md the failure catalogue -- read before building advanced-unpacking.md the dump landed but the bodies are empty: extraction-shell diagnosis by trivial-body ratio, FART-style active invocation and why its classic hooks died on Android 12-16, code_item splicing, the root-side dump for when frida itself is refused, and the honest VMP boundary lsposed-and-modules.md the repack is refused, so deliver a system-level hook module instead: module anatomy, a gradle-free build chain, scope configuration and how to verify injection, and the layer a Java module cannot reach emulation-and-rpc.md call the routine instead of reading it: Unidbg/Unicorn emulation and its environment-filling cost, versus service-ifying a live function over Frida RPC native-dbi-and-deobfuscation.md OLLVM shapes, Frida-Stalker traces, the trace-to-CFG route, the Stalker/QBDI/emulation decision, and two measured boundaries (a follow that delivers no events, and a crash from following a hot libc export) protocol-reverse.md protobuf without a schema, schema recovery from decompiled code, gRPC frame capture, the QUIC/HTTP3 limit, and native-side certificate pinning kernel-and-environment-hardening.md userspace hooking provably cannot reach the check: raw svc, init_array-early detection, what each root scheme hides, the kernel-route map with its version gate, and when to stop escalating on-device-tooling.md working from the phone itself: MT Manager edit/repack/sign and its APK MCP, LSPosed Manager, Termux+frida, on-device data inspection java2c-and-jni-sinking.md Java2C and JNI sinking, the two hardening shapes most easily confused with an extraction shell: the table that separates landing shell / extraction shell / VMP / Java2C / JNI sinking, why the code is in the and in a dumped dex, and why a symbol search comes back empty (dynamic registration, ) split-apk.md App Bundle / split APK sets: what the set is, pulling it off a device, merging into one APK vs signing the set as a unit, the install refusals and what each means, and making an installable fixture from a pulled set vmp-differential-analysis.md the known-plaintext differential for a real Dex VMP: which links can be automated and which cannot (the upload is the bottleneck), the coverage a compiled fixture can reach, how to a derived private-opcode table, smali generation, and when the route is closed coverage-and-limits.md the claim ladder applied to the skill itself: the evidence behind each covered item, the dependencies this skill does not ship, and what was never exercised handoff-boundaries.md where this skill ends and another discipline begins: the JNI form table, the packer-versus-loader split, and what "verified" means for each of the four deliverable forms scripts/ parameterized, path-agnostic doctor.py run this first: capability report + per-script runnability, finds tools installed off-PATH or as runnable jars, and surfaces the environment facts that poison experiments (clock skew, leftover adb forward / proxy, a device-side frida process already running) dexutil.py dependency-free dex reader: structural walk + exact instruction decode, dex header recompute/verify (correct checksum/signature order), branch-target and operand helpers. Library shared by the dex scripts, also runs standalone to dump one method with offsets dex_find_insn.py locate an instruction by decoded semantics and print its exact byte offset with context and both sides of any branch -- how you find a patch site instead of guessing offsets dex_patch_bytes.py equal-length byte patches from a JSON spec: semantic match, polarity pin via expect_next, equal-length enforcement, verifier check, dex header recompute, re-decode to prove it landed (--dry-run first) dex_check_verifier.py tier-3 check: does any conditional branch target a move-result (bypassing its producer)? Compares two builds and separates pre-existing findings from regressions your patch introduced coldstart.py cold-launch capture: timed screenshot burst + logcat signals + installed-build facts + launch timing, and warns when the foreground activity is not your app so_constpatch.py same-length in-place rewrite of an isolated string constant, for redirecting a library load instead of defeating a check smtool.py baksmali/smali wrapper with a configurable classpath dexpatch/ dexlib2 method-level rewriter (for changes that need new instructions) patch_smali.py method-body replacement in a smali tree dex_strpatch.py byte-level string patch with a string_ids ordering guard dex_classdiff.py prove a dex edit was surgical dex_strings.py strings/URLs/SDK markers without a decompiler dart_pool_strings.py recover literals from a Dart AOT snapshot (framed entries, the one-byte vs UTF-16 split, file offsets, run-length noise filter) dart_pprefs.py build/query the object-pool -> code-site index for a Dart snapshot dart_disasm.py annotated windowed disassembly of Dart AOT code + B/BL caller index find_refs.py count callers of a method before patching it repack.py rebuild APK, strip only signatures, keep META-INF/services/, write a 4-byte-aligned archive (resources.arsc STORED+aligned), sign, verify; also split APK / App Bundle sets: inventory, sign every member with one keystore, or merge code/native members into a standalone APK devsh.py quoting-safe ADB shell helper usb_net_proxy.py give an offline device network over USB datastore_inject.py encode/inject AndroidX DataStore preferences safely probe_api.py probe an HTTP API with the right headers grab_crash.py recover stacks hidden by a crash-reporter SDK install_test.py install + launch health check with logcat signal scan frida_probe.js four-layer runtime probe (app net layer + OkHttp + java.net + exceptions) run_probe.py inject the probe, stream it to a log file, stay resident tls_check.py strict certificate check for one or more hosts preflight.py environment check before every experiment block (device, root, ABI/translation, clock skew, leftover proxy/forwards, dead server) lib_map.py what is into a live process: per-library path, base, architecture, and whether it came from the APK or was materialized at runtime elf_plt.py resolve a PLT stub to its imported symbol (x86_64 + aarch64) from the relocation table; list a symbol's callers; byte-diff two libraries and name the symbol each changed stub belongs to apk_diff.py entry-level diff of two builds: changed / added / removed, by content hash so same-size replacements are caught native_crash.py locate a native death from a log or tombstone: signal, fault address, registers, frames split app vs system, the faulting instruction, and a flag when the fault looks blob_decode.py search, don't guess, the framing of a stored value (base64/hex x rotation x deflate); re-encode the edited payload snap.py bounded burst screenshots + control-tree capture with a stall detector, and a verdict on whether the tree is usable at all sig_probe.py find the exact signatures[0].toCharsString() value — offline candidates from an APK, or the authoritative read from a device spawn_patch_detach.py spawn under a Frida probe, detach, then launch and capture: under spawn mode the Activity stack often never comes up, and memory writes survive detach while hooks do not hook_patch_only.js the minimal probe for spawn_patch_detach.py — neutralise one native death site by offset and report PATCHED dex_dump_validate.py dedupe, validate and rank a directory of dumped dex images: sha256 grouping, header integrity, the trivial-body ratio that separates a real dump from an extraction-shell skeleton, and a most-likely-original ranking (--trim for page-aligned /proc//mem captures) dex_mem_scan.py search memory captures for embedded dex images and extract each at the size its own header declares -- for a decrypted dex sitting in an anonymous mapping no maps entry names lsposed_scaffold.py generate a minimal LSPosed/Xposed module project (manifest with the xposed meta-data, assets/xposed_init, hook class, gradle-free build notes) frida_rpc_serve.py bridge a Frida script's rpc.exports to a local caller with reconnect handling, so a live native function can be called rather than reversed rpc_template.js the editable companion to frida_rpc_serve.py stalker_trace.js instruction-level tracing with Frida Stalker: configurable targets, trigger selection, the event stream, and output-size rules stalker_report.py reduce a stalker_trace.js log to block histograms and call sequences, with an explicit diagnostic for the measured zero-event case mt_mcp_probe.py probe MT Manager's on-device APK MCP (Streamable HTTP, port 8787): JSON-RPC handshake plus the grouped tool inventory java2c_probe.py collect the evidence that separates Java2C from an extraction shell, a VMP and ordinary JNI sinking: native density and stub ratio from the dex, JNI_OnLoad / dynamic registration / toolchain strings from the , each item labelled strong/medium/weak protobuf_decode_raw.py schema-free protobuf decode: hex / file / stdin to a JSON tree, every length-delimited field kept as a candidate set with ties labelled rather than guessed, plus a byte-exact re-encode to check a round trip vmp_diff_harness.py build a labelled opcode-coverage fixture, derive a candidate private- opcode map from an original/hardened dex pair, verify the comparison in a closed loop, and render a restored stream as a smali skeleton kernelsu_syscall_mask.py generate a KernelSU/APatch syscall-masking scaffold: an installable userspace module skeleton plus KPM/LKM/eBPF kernel-side templates, each with its version gate and an explicit unverified label rasc_build.py build and verify rasc, the Rust ASC re-implementation: --check what is present, --build clone plus cargo, --verify an APK against droidasc and fail on any class-set difference scan_leaks.py scan a repository for target identity before publishing it: bundle ids in manifest / / contexts, serial-shaped tokens, PATs, inline appkey assignments, literal endpoints, host user paths. Exemptions for everything that must stay (tools, libraries, CVEs, hardening products, public crackmes, placeholders), findings carry their context, prints why a hit was suppressed, exit 0/1/2 svc_scan.py name the syscall behind an inline and the segment it sits in, which decides whether a libc-level hook can observe the call at all; shows neighbours because a byte scan also matches data anti_detect_probe.js observer-only Frida probe (patches nothing): path/loader/thread/kill hooks with caller module + offset, an environment self-report (, frida-named mappings), and live streaming so a sub-second self-destructing target still yields evidence

root@kitploit:~
Il repository include anche un livello di test **eseguibile**, che è cosa diversa dal
registro delle evidenze: `tests/` verifica ciò che gli script fanno (unit, contratto CLI,
integrazione senza dispositivo) e `tests/benchmark.md` registra ciò che una route ha fatto su un
target reale. `tests/README.md` esplicita la separazione, e `.github/workflows/ci.yml` esegue i
gate più la suite.

## Installazione

Questo repository è un **repository di skill**: la skill risiede in `skills/apk-reverse/`, che è il
layout risolto dalla CLI `skills`, e viene installata per nome anziché copiando una directory:```
npx skills add newliver666/apk-reverse              # install every skill in the repo
npx skills add newliver666/apk-reverse --list       # list what is here, install nothing
npx skills add newliver666/apk-reverse --skill apk-reverse -y
npx skills use  newliver666/apk-reverse@apk-reverse # use it once, without installing

La CLI crea un symlink della skill nella directory delle skill del tuo agente per impostazione predefinita (--copy crea invece copie indipendenti), e -g installa per ogni progetto anziché per quello corrente. Con una sola skill nel repository, --skill apk-reverse è ridondante oggi; è scritto qui perché è ciò che seleziona una singola skill una volta che ne esiste una seconda.

Una volta installata, l'agente carica SKILL.md quando un'attività corrisponde alla sua descrizione, e richiama references/* solo quando necessario. Nessuno stato globale, nessun percorso specifico della macchina e nessuno step di build.

Requisiti

Nulla è obbligatorio; ogni script verifica ciò di cui ha bisogno. skills/apk-reverse/scripts/doctor.py riporta quali di questi sono presenti qui, quali script possono quindi essere eseguiti e — utilmente — quali strumenti esistono altrove rispetto al PATH.

Se la tua toolchain risiede al di fuori del PATH (una directory tools/ locale al progetto, una cartella SDK versionata, un .jar eseguibile invece di un comando), imposta APKREV_TOOLS su una o più directory e doctor.py le troverà:``` set APKREV_TOOLS=

; # Windows, e.g. an SDK or project-local tools dir export APKREV_TOOLS=: # POSIX

root@kitploit:~
Gli script stessi sono semplici `python3` e sono pensati per funzionare in modo identico su Windows, macOS e
Linux; dove uno snippet è solo POSIX viene etichettato. Nulla qui presuppone una shell Unix.

| Strumento | Utilizzato per |
|---|---|
| Python 3.9+ | tutti gli script |
| **`droidasc`** (ASC) (**opzionale ma fortemente consigliato — installalo per primo**) | indice di cross-reference dell'intero APK: `findrefs` / `listclass` / `getclass` / `getmanifest`. Un solo `pip install droidasc`, nessuna JVM, nessun SDK, nessuna build dell'indice. Trasforma "quale delle N migliaia di classi menziona questa stringa" in una query sub-secondo, ed è l'unica via verso una classe il cui nome è stato offuscato da R8. **Questo è lo strumento a cui un agente dovrebbe ricorrere prima di qualsiasi decompilazione completa** — vedi `skills/apk-reverse/references/toolchain.md` §droidasc (ASC) — chiedi a un APK "chi referenzia questo?", in una sola query |
| `ddc` (opzionale ma fortemente consigliato) | decompilatore dex→Java in singolo binario con sottocomandi di query (`info`, `findrefs`, `strings --with-locations`, decompilazione per classe). Nessuna JVM. **Legge** ciò che ASC **individua**; riporta inoltre l'identità del pacchetto in modo affidabile — vedi `skills/apk-reverse/references/toolchain.md` §ddc — dex-to-Java con sottocomandi di query (vale la pena adottarlo) |
| jar `baksmali` / `smali` + `dexlib2` | disassemblaggio, assemblaggio, patching chirurgico |
| JDK (`javac`, `java`) | compilazione/esecuzione del patcher dexlib2; fornisce anche `keytool`/`jarsigner` |
| Android SDK build-tools (`aapt`, `zipalign`, `apksigner`) | informazioni sul manifest, allineamento, firma. **`apksigner` è il firmatario da usare** — `jarsigner` riscrive l'archivio e rompe l'allineamento richiesto da Android R+ |
| `uber-apk-signer` (opzionale) | allineamento + firma in un solo passaggio |
| ADB | lavoro sul dispositivo |
| Frida (pacchetto host + server corrispondente sul dispositivo) | analisi dinamica |
| un dispositivo rootato o emulatore | qualsiasi cosa oltre l'analisi statica |

Nessuno di questi deve essere nel `PATH`: ogni script accetta un percorso esplicito per gli
strumenti che invoca, e `skills/apk-reverse/references/toolchain.md` copre come trovare
un'installazione che il `PATH` non conosce (il caso comune per `apksigner` e
`keytool`).

## Leggi prima questo

**Questo progetto è pubblicato solo per apprendimento, ricerca e test di sicurezza autorizzati.** Non include
payload di exploit, dati di target né binari di terze parti — è un metodo, un insieme di script
e una registrazione di prove. Sei responsabile di avere il diritto di analizzare qualunque cosa tu gli punti contro;
vedi **Disclaimer** alla fine di questo file.

`skills/apk-reverse/references/pitfalls.md`. È il file più prezioso qui — ogni voce è un
fallimento che ha prodotto un artefatto rotto pur sembrando completamente sano.

I quattro che fanno più male:

1. Rimuovere l'intera `META-INF/` durante un repack elimina le registrazioni ServiceLoader
   e l'app muore all'avvio con un errore che nomina una libreria non correlata.
2. Applicare una patch a una stringa a livello di byte senza preservare l'ordinamento di `string_ids` fa
   rigettare l'intero dex, mentre checksum e firme si verificano perfettamente.
3. Ricostruire un dex con un round-trip smali sull'intero albero danneggia l'output di R8 in modo invisibile —
   le tabelle delle classi risultano pulite al confronto, e salta fuori solo a runtime.
4. Neutralizzare un percorso di terminazione nativo facendolo **non ritornare**. Uno stub che gira a vuoto non
   sopprime il controllo; blocca il chiamante e ogni thread dietro di esso. L'app si blocca con *nessuna
   registrazione di crash* e la morte eventuale viene attribuita a qualunque cosa abbia ucciso il processo bloccato.

## Ambito

Costruito per lavorare sulle tue applicazioni, su campioni che sei autorizzato ad analizzare,
e in sandbox CTF/competizione. Non contiene binari di terze parti inclusi né
dati specifici di target.

Ciò che copre, e ciò che deliberatamente non copre, è dichiarato in cima a `SKILL.md`
sotto **Coverage**. La versione breve: solo Android (niente iOS), e in profondità sugli strati
che sono stati affrontati per davvero — patching dex, repacking, packer e loader personalizzati,
risposta di manomissione nativa, e Flutter/Dart AOT. Un passaggio di estensione ha aggiunto un secondo
livello di percorsi documentati: **consegna lato modulo** quando un repack è bloccato,
**recupero di extraction-shell** e il suo confine VMP, **emulazione e RPC live** per
chiamare invece di leggere, **tracing a livello di istruzione** contro OLLVM, **reverse di protocolli**
oltre REST, la mappa del **percorso lato kernel** per quando l'hooking in userspace è
dimostrabilmente fuori portata, e **strumenti on-device**. Un **passaggio di benchmark** ha poi messo target pubblici
sotto quei percorsi (`tests/benchmark.md`): ha aggiunto la **discriminazione Java2C** (la
diagnosi errata che manda un agente a caccia di un DEX decifrato che non esiste mai), la **gestione di split APK /
App Bundle**, la **decodifica protobuf senza schema**, un harness **differenziale Dex-VMP**,
e **template di moduli kernel con i loro gate di versione** — e ha corretto due affermazioni precedenti
le cui misurazioni erano in disaccordo con esse. Il recupero della logica Unity/IL2CPP,
gli interni del bytecode React Native/Hermes, e sconfiggere un'autorità lato server **non** sono
coperti, e la skill è scritta per dirlo e fermarsi piuttosto che applicare la più vicina
procedura documentata a un target per cui non è stata scritta.

Quattro precisazioni che la sezione Coverage dichiara per intero e che appartengono anche qui:

- **L'analisi Flutter/Dart AOT ha una dipendenza.** Il workflow inizia da un elenco di pool
  (output di classe `pp.txt`). Produrlo richiede un decompilatore di snapshot — aotopsy (un binario
  statico, nessuna toolchain) o blutter (compilato dal sorgente, ~80 s) — e questo repository non ne contiene
  uno. È nominato come prerequisito piuttosto che lasciato implicito.
- **Non ogni affermazione in questo repository ha un'esecuzione dietro di sé.** `docs/tool-verification/` registra
  ciò che è stato effettivamente misurato, su quale target, e con quale verifica incrociata indipendente; qualsiasi cosa non
  coperta lì è documentata dall'esperienza e va letta come *inferita*, secondo la stessa
  scala di affermazioni di questa skill.
- **Il passaggio di estensione è registrato separatamente ed è per lo più *inferito*.** Le sue prove vivono in
  `docs/tool-verification/EXTENSION-*.md`, un file per argomento, con la propria nota di solidità. La
  forma comune lì è *lo strumento è stato misurato, il percorso no* — quindi leggi quei file prima
  di trattare uno qualsiasi dei documenti più recenti come un percorso verificato.
- **Il passaggio di benchmark è registrato per riga, con la solidità propria di quella riga.** `tests/benchmark.md`
  nomina ogni target pubblico, gli script che la riga esercita, cosa è effettivamente accaduto (incluse le
  righe che hanno fallito e le righe che nessuno ha eseguito), e quanto è forte la prova. Le righe contrassegnate
  `unverified` sono affermazioni sulle prove in questo repository, non sul meccanismo.

## Manutenzione del repository

Quattro strumenti risiedono nella radice e non fanno parte della skill installata:```
check_repo.py      every skill discovered, frontmatter valid, scripts runnable,
                   documented paths resolve, README paths explicit and existing,
                   and -- on the tracked surface only -- no target identity
                   (delegates the rules to skills/apk-reverse/scripts/scan_leaks.py
                   so there is one place to argue with the exemption list)
check_refs.py      every cross-reference that names a section of another
                   document reaches a real heading in that document
check_routing.py   the on-demand inventory still matches the entry point: the
                   symptom mirror agrees with SKILL.md, every reference file is
                   named in skills/apk-reverse/references/routing.md, and every
                   script is too
check_commands.py  every command a document tells you to run is checked against
                   the script's own argparse table -- a documented flag that does
                   not exist is a drift the anchor checks cannot see
check_budget.py    keep the always-loaded part from creeping: SKILL.md's whole
                   body (index lines included, because they load too) measured in
                   lines and tokens, index-row length, long files with no
                   navigable head, and hedged rules reported as a trend
build_scripts.py   audit for machine-specific leftovers (absolute paths, credentials)

La coerenza ha una contropressione naturale: un percorso rotto fallisce in modo evidente e qualcuno lo corregge. Il gonfiamento non ne ha alcuna, ed è per questo che esiste il terzo strumento: ogni passaggio aggiunge un riferimento, una riga di indice e un'affermazione di copertura, e senza una misurazione nulla nel repository se ne accorge.

tests/benchmark.md contiene la matrice di regressione: dimensione -> obiettivo pubblico -> gli script che la riga esercita -> risultato misurato -> etichetta di solidità. È la checklist da rieseguire prima di fidarsi di qualsiasi affermazione sotto docs/tool-verification/. I campioni vengono scaricati in tools/_work/ e non vengono mai committati, quindi ogni riga indica la sua fonte pubblica e registra l'hash su cui è stata eseguita.

docs/tool-verification/ non fa parte nemmeno della skill installata. È il registro delle prove per un singolo passaggio di misurazione su un obiettivo reale: cosa ha effettivamente fatto ogni script, quale metodo indipendente lo ha confermato, quali difetti sono stati trovati e quali scenari l'obiettivo non ha potuto esercitare. Esiste affinché le affermazioni di Coverage in SKILL.md possano essere verificate rispetto alle esecuzioni invece che prese per buone, e affinché le lacune siano scritte dove la prossima persona le troverà.


Con orgoglio sostenuto dalla community LINUX DO.

Disclaimer

Solo per apprendimento, ricerca e test di sicurezza autorizzati. Ogni script, riferimento e risultato registrato in questo repository esiste per spiegare come funziona l'analisi delle applicazioni Android, affinché i professionisti possano ragionare sugli strumenti che già possiedono. Nulla di quanto qui contenuto è un servizio, un prodotto o un'approvazione di qualsiasi uso particolare.

  • Solo obiettivi autorizzati. Usa questo materiale su applicazioni che possiedi o per cui ti è stato esplicitamente permesso analizzare, su materiale CTF/challenge pubblico, o in una sandbox che controlli. Analizzare software che non hai il diritto di analizzare può essere illegale dove vivi, e tale determinazione spetta a te, non a questo repository.
  • Nessuna garanzia, nessuna idoneità per alcuno scopo. Il materiale è fornito così com'è, senza garanzia di alcun tipo. I risultati sono registrati come sono stati misurati su una macchina in un momento preciso; nulla qui promette che una route funzionerà sul tuo obiettivo, sul tuo dispositivo, sulla tua toolchain o sulla versione attuale dell'app.
  • Verifica prima di fidarti; fai un backup prima di agire. Diversi script modificano artefatti (dex, APK, .so, dati dell'app memorizzati) e alcuni operano su un dispositivo rooted. Conserva le tue copie, lavora su duplicati e leggi i gate di SKILL.md prima di eseguire qualsiasi cosa su qualcosa a cui tieni.
  • Il tuo uso è la tua responsabilità. Gli autori e i contributori non accettano alcuna responsabilità per qualsiasi perdita, danno, conseguenza legale o interruzione del servizio derivante dall'uso o dall'abuso di questo repository, e non sono affiliati, approvati o agenti per conto di alcuna applicazione, vendor o piattaforma che possa essere usata per esaminare.
  • I dati di test non sono distribuiti qui. Campioni, dump e artefatti del dispositivo sono deliberatamente assenti dall'albero (.gitignore li esclude) e risiedono solo in un workspace locale ignorato. Qualsiasi cosa tu ottenga per seguire il materiale è tua responsabilità custodirla e cancellarla quando hai finito — segui le tue regole locali e i termini che accompagnavano il campione. Ciò che questo repository pubblica è il metodo e le prove, con ogni identità dell'obiettivo rimossa.
  • Nessuna affiliazione. I nomi di strumenti, librerie, prodotti di hardening e obiettivi di challenge pubblici compaiono solo per rendere il materiale riutilizzabile; appartengono ai rispettivi proprietari e questo progetto non è collegato ad essi.
Scarica lo strumento
  • Mantenere onesto un compito lungo: un registro live, conclusioni classificate, timeout calibrati, e attese limitate, così il progresso non va perso e lo stesso errore non viene commesso due volte.
  • Evitare gli errori specifici che producono un APK che si compila perfettamente e muore a runtime.
  • Decidere quale dovrebbe essere il deliverable quando un APK non è un'opzione — un repack rifiutato da diversi controlli indipendenti è bloccato, non costoso, e la scala di fallback è un modulo a livello di sistema, un servizio RPC locale, o un resoconto onesto con un confine dichiarato.
  • Distinguere un vero memory dump da uno scheletro di extraction-shell, e sapere quale percorso di recupero si applica — incluso il dump lato root per quando frida stesso viene rifiutato. Cosa la misurazione può e non può vedere è in skills/apk-reverse/references/advanced-unpacking.md.
  • Chiamare una routine invece di invertirla quando invertirla costa più che invocarla: esecuzione emulata sull'host, o una funzione live trasformata in servizio tramite Frida RPC.
  • Leggere evidenza di esecuzione a livello di istruzione quando una funzione nativa è stata appiattita in una macchina a stati da OLLVM — inclusi i due modi in cui Stalker è stato misurato per ritorcersi contro su un dispositivo reale.
  • Riconoscere quando l'hooking in userspace non può raggiungere affatto il controllo (syscall svc grezze, rilevamento precoce tramite init_array), cosa possono effettivamente fare il layer successivo sopra e sotto, e quando escalare è la risposta sbagliata.
  • Lavorare su protocolli che non sono REST — protobuf senza schema, gRPC, QUIC/HTTP3 — e certificate pinning lato nativo che ignora il trust store di sistema.
  • Lavorare dal telefono stesso: il flusso edit/repack/sign di MT Manager e la sua superficie APK MCP, LSPosed Manager, e l'ispezione dei dati on-device, insieme alla toolchain del PC piuttosto che al suo posto.
  • Distinguere Java2C da un extraction shell prima di passare ore a caccia di un DEX decifrato che non esiste in nessun punto del ciclo di vita del processo — il codice è stato compilato in un .so.
  • Gestire una build che arriva come un set di split APK / App Bundle: leggere il set da un dispositivo, firmare ogni membro con un unico keystore per pm install-multiple, o unire i membri di codice/nativi in un APK standalone quando ciò è legale.
  • Lavorare su un vero Dex VMP con il differenziale known-plaintext — quali link possono essere automatizzati e quali no, cosa può e non può raggiungere un fixture compilato, e come provare una tabella di opcode privati derivata invece di asserirla.
  • Pubblicare ciò che impara senza pubblicare il target — uno scanner che riporta forme di identità con il loro contesto, una lista esplicita di ciò che non deve essere redatto (strumenti, librerie, campi di protocollo, CVE, prodotti di hardening, crackme pubblici) perché redigere quelli distrugge la parte riutilizzabile, e codici di uscita che fanno da gate a un commit.
  • Leggere un precedente prima di ripetere un lavoro su cui questo repository si è già converguto: la metà positiva del registro, con il percorso inclusi i suoi vicoli ciechi, un grado su ogni asserzione, e i file su cui il caso dice di riscrivere.
  • actually loaded and executing
    "not on PATH" is not "not installed"
    landed
    legal
    .so
    never
    Java_*
    -fvisibility=hidden
    prove
    actually mapped
    arranged
    .so
    pm
    ps
    --show-exempt
    svc
    --context
    TracerPid