Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
apk-reverse — Habilidade de agente para engenharia reversa de APK Android: patch de dex, desempacotamento, reempacotamento, remoção de anúncios e paywall, análise de .so nativo e instrumentação em tempo de execução com Frida. | Kitploit
Ferramentas/GitHubGitHub/newliver666/apk-reverse
Segurança AndroidAnálise EstáticaAnálise Dinâmica (Sandboxing)Análise de CódigoPentesting de Apps MóveisEngenharia ReversaScripting e AutomaçãoAnálise de MalwareSegurança MóvelAnálise de BináriosAprendizado e Educação
1.4k37910há 1 diaAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
GitHubnewliver666/apk-reverse

apk-reverse

Habilidade de agente para engenharia reversa de APK Android: patch de dex, desempacotamento, reempacotamento, remoção de anúncios e paywall, análise de .so nativo e instrumentação em tempo de execução com Frida.

Ver Repositório

apk-reverse

English · 简体中文

stars forks license python android ci

Capacidades · Estrutura · Instalação · Requisitos · Catálogo de falhas · Escopo · Manutenção · Aviso legal

apk-reverse

Uma Agent Skill para engenharia reversa de APK Android, desbloat, remoção de anúncios, patch cirúrgico de dex, reempacotamento e análise em tempo de execução/servidor.

É uma skill, não um tutorial: foi escrita para ser carregada por um agente (Claude Code, Codex, ou qualquer harness que suporte o formato Agent Skills) enquanto ele trabalha, então está organizada para divulgação progressiva — um SKILL.md curto orientado a decisões, referências detalhadas carregadas apenas quando um passo precisa delas, e scripts parametrizados que você pode executar diretamente.

Como se espera que um agente consuma isto

SKILL.md foi deliberadamente escrito como um procedimento com gates em vez de conselhos, porque o modo de falha observado não é ignorância — é um modelo ler tudo, concordar com tudo e depois raciocinar a partir de primeiros princípios de qualquer forma.

Então há quatro coisas no corpo que devem ser acionadas, não lidas:

  • Quatro regras de sobreposição (R1–R4). Onde elas conflitam com o plano atual, elas vencem até que evidências as sobreponham.
  • Um índice de sintomas. Cada linha é uma falha que já foi paga. Uma linha correspondente é um sinal de parada: carregue aquele arquivo antes de executar outro comando, em vez de depois de mais algumas tentativas. Raciocinar além de um sintoma conhecido é como as mesmas horas são gastas duas vezes.
  • Quatro gates (G1–G4), cada um uma ação com um critério de aprovação. "Eu entendo a ideia" não limpa um gate. Eles existem para que classificação, verdade do ambiente e uma build de controle aconteçam antes do primeiro patch, não depois da terceira falha.
  • Uma regra de duas tentativas e condições de parada. Duas falhas da mesma forma significam que o modelo está errado, não os parâmetros. A terceira variante de uma hipótese que já falhou duas vezes é onde as rodadas vão morrer.

E uma coisa no final que deve ser retida: "pronto" tem uma definição (seis itens). Um log limpo não é um deles. Qualquer coisa aquém dos seis é um checkpoint, e deve ser reportado como um checkpoint com o que resta.

Se você é um agente lendo isto: o primeiro comando mais barato possível é python skills/apk-reverse/scripts/doctor.py. Ele diz quais destas ferramentas existem aqui, quais scripts podem realmente rodar, e se algo no ambiente já está envenenando suas medições.

No que ele é bom

  • Decidir rapidamente se uma solicitação é sequer alcançável no lado do cliente, em vez de queimar horas em um paywall que é imposto por um servidor.
  • Decidir que forma o entregável deve ter antes de qualquer trabalho começar — um artefato autocontido e sem root é um problema diferente de "fazer funcionar nesta máquina", e confundir os dois é o desvio mais caro neste domínio.
  • Escolher a camada de patch mais segura para uma dada mudança, e evitar as camadas que quebram o app.
  • Capturar a falha de reempacotamento que parece sucesso: um app que instala, inicia e renderiza perfeitamente enquanto toda requisição assinada é rejeitada, porque o cliente deriva sua chave de assinatura de requisição do seu próprio certificado de assinatura.
  • Separar seus próprios erros dos problemas do app ou do servidor — uma falha com escopo de funcionalidade (login, registro, pagamento) é frequentemente um problema de TLS/certificado em um caminho de código, não uma consequência do patch que você acabou de construir. Estado do dispositivo, um servidor de dispositivo morto e desvio de relógio se disfarçam da mesma forma.
  • Estabelecer qual arquitetura e qual biblioteca estão realmente executando, em vez de confiar no que o manifesto entrega ou no que o dispositivo afirma.
  • Trabalhar com alvos empacotados/protegidos: identificar o packer, desempacotar, e transformar um dump de memória de volta em um APK corrigido e instalável.
  • Lidar com uma biblioteca protegida que encerra o processo de propósito — incluindo a forma de crash deliberado (fault addr 0x4) que parece exatamente um bug comum de desreferência nula, e a regra "neutralize-o, mas nunca fazendo com que ele não retorne" que decide se a correção funciona ou congela o app inteiro de uma forma que não se parece em nada com a causa.
  • Saber quais ferramentas usar e onde cada uma mente — incluindo as que só existem como GUI, então você pede um humano em vez de substituir silenciosamente por um método mais fraco.
  • Fazer uma build corrigida permanecer corrigida: neutralizar verificações de versão, diálogos de atualização forçada e instaladores de auto-atualização para que o trabalho não possa ser desligado remotamente — e reconhecer o canal de hot-update/remote-config que pode desfazê-lo silenciosamente sem qualquer mudança de versão.
  • Separar um gate de login do lado do cliente (corrigível) de um recurso com escopo de conta (vazio porque o servidor não tem nada para responder), e saber que forjar uma sessão produz um estado pior do que estar desconectado.

Estrutura

SKILL.md, references/ e scripts/ estão todos dentro do diretório da skill, skills/apk-reverse/. Tudo na raiz do repositório é ferramental de manutenção compartilhado entre skills, não parte de uma skill instalada.``` 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:~
O repositório também possui uma camada de testes **executável**, que é uma coisa diferente do
registro de evidências: `tests/` afirma o que os scripts fazem (unitário, contrato de CLI, integração
sem dispositivo) e `tests/benchmark.md` registra o que uma rota fez em um alvo real. `tests/README.md`
declara a divisão, e `.github/workflows/ci.yml` executa os gates mais a suíte.

## Instalação

Este repositório é um **repositório de skills**: a skill fica em `skills/apk-reverse/`, que é o
layout que a CLI `skills` resolve, e é instalada por nome em vez de copiar um diretório:```
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

A CLI cria links simbólicos da skill no diretório de skills do seu agente por padrão (--copy cria cópias independentes), e -g instala para todos os projetos em vez do atual. Com uma única skill no repositório, --skill apk-reverse é redundante hoje; está escrito aqui porque é o que seleciona uma única skill quando uma segunda existir.

Uma vez instalada, o agente carrega SKILL.md quando uma tarefa corresponde à sua descrição, e puxa references/* apenas conforme necessário. Sem estado global, sem caminhos específicos da máquina e sem etapa de build.

Requisitos

Nada é obrigatório; cada script verifica o que precisa. skills/apk-reverse/scripts/doctor.py relata quais destes estão presentes aqui, quais scripts podem, portanto, ser executados e — de forma útil — quais ferramentas existem em algum lugar que não o PATH.

Se seu toolchain estiver fora do PATH (um diretório tools/ local do projeto, uma pasta de SDK versionada, um .jar executável em vez de um comando), defina APKREV_TOOLS para um ou mais diretórios e o doctor.py os encontrará:``` set APKREV_TOOLS=

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

root@kitploit:~
Os próprios scripts são `python3` puro e destinam-se a funcionar de forma idêntica em Windows, macOS e
Linux; quando um trecho é apenas POSIX, isso é indicado. Nada aqui pressupõe um shell Unix.

| Ferramenta | Utilizada para |
|---|---|
| Python 3.9+ | todos os scripts |
| **`droidasc`** (ASC) (**opcional mas fortemente recomendado — instale isto primeiro**) | índice de referência cruzada de todo o APK: `findrefs` / `listclass` / `getclass` / `getmanifest`. Um `pip install droidasc`, sem JVM, sem SDK, sem construção de índice. Transforma "qual de N mil classes menciona esta string" numa consulta inferior a um segundo, e é a única via para uma classe cujo nome o R8 mutilou. **Esta é a ferramenta a que um agente deve recorrer antes de qualquer descompilação completa** — ver `skills/apk-reverse/references/toolchain.md` §droidasc (ASC) — perguntar a um APK "quem referencia isto?", numa única consulta |
| `ddc` (opcional mas fortemente recomendado) | descompilador dex→Java num único binário com subcomandos de consulta (`info`, `findrefs`, `strings --with-locations`, descompilação por classe). Sem JVM. **Lê** o que o ASC **localiza**; também reporta a identidade do pacote de forma fiável — ver `skills/apk-reverse/references/toolchain.md` §ddc — dex-to-Java com subcomandos de consulta (vale a pena adotar) |
| jars `baksmali` / `smali` + `dexlib2` | desmontagem, montagem, aplicação cirúrgica de patches |
| JDK (`javac`, `java`) | compilar/executar o patcher dexlib2; também fornece `keytool`/`jarsigner` |
| Android SDK build-tools (`aapt`, `zipalign`, `apksigner`) | informação do manifest, alinhamento, assinatura. **`apksigner` é o assinador a usar** — o `jarsigner` reescreve o arquivo e quebra o alinhamento exigido pelo Android R+ |
| `uber-apk-signer` (opcional) | alinhamento + assinatura num só passo |
| ADB | trabalho no dispositivo |
| Frida (pacote no host + servidor correspondente no dispositivo) | análise dinâmica |
| um dispositivo com root ou emulador | qualquer coisa além de análise estática |

Nenhuma destas precisa de estar no `PATH`: cada script aceita um caminho explícito para as
ferramentas que invoca, e `skills/apk-reverse/references/toolchain.md` aborda como encontrar
uma instalação que o `PATH` não conhece (o caso comum para `apksigner` e
`keytool`).

## Leia isto primeiro

**Este projeto é publicado apenas para aprendizagem, investigação e testes de segurança autorizados.** Não inclui
nenhum payload de exploração, nenhum dado de alvo e nenhum binário de terceiros — é um método, um conjunto de scripts
e um registo de evidências. É da sua responsabilidade ter o direito de analisar aquilo para que o aponta;
ver **Disclaimer** no final deste ficheiro.

`skills/apk-reverse/references/pitfalls.md`. É o ficheiro mais valioso aqui — cada entrada é uma
falha que produziu um artefacto quebrado enquanto parecia completamente saudável.

As quatro que mais doem:

1. Remover todo o `META-INF/` durante um repack elimina os registos do ServiceLoader
   e a app morre no arranque com um erro que nomeia uma biblioteca não relacionada.
2. Aplicar patch a uma string ao nível do byte sem preservar a ordenação de `string_ids` faz com que todo o
   dex seja rejeitado, enquanto os checksums e as assinaturas verificam perfeitamente.
3. Reconstruir um dex com um round-trip smali de toda a árvore danifica a saída do R8 de forma invisível —
   as tabelas de classes comparam limpas, e só rebenta em runtime.
4. Neutralizar um caminho de terminação nativo fazendo com que **não retorne**. Um stub em ciclo não
   suprime a verificação; congela o chamador e todas as threads atrás dele. A app fica pendurada com *nenhum
   registo de crash*, e a morte eventual é atribuída àquilo que quer que tenha matado o processo congelado.

## Âmbito

Construído para trabalhar nas suas próprias aplicações, em amostras que está autorizado a analisar,
e em sandboxes de CTF/competição. Não contém binários de terceiros vendorizados nem
dados específicos de alvos.

O que cobre, e o que deliberadamente não cobre, está declarado no topo de `SKILL.md`
em **Coverage**. A versão curta: apenas Android (sem iOS), e aprofundado nas camadas
que foram trabalhadas a sério — patching de dex, repacking, packers e loaders personalizados,
resposta nativa a adulteração, e Flutter/Dart AOT. Uma passagem de extensão acrescentou um segundo
nível de rotas documentadas: **entrega pelo lado do módulo** quando um repack está bloqueado,
**recuperação de extraction-shell** e a sua fronteira VMP, **emulação e RPC ao vivo** para
chamar em vez de ler, **tracing ao nível da instrução** contra OLLVM, **reversão de protocolos**
para além de REST, o mapa da **rota pelo lado do kernel** para quando o hooking em userspace está
provadamente fora de alcance, e **ferramentas no dispositivo**. Uma **passagem de benchmark** colocou então alvos
públicos sob essas rotas (`tests/benchmark.md`): acrescentou **discriminação Java2C** (o
diagnóstico errado que envia um agente à caça de um DEX desencriptado que nunca existe), **tratamento de split APK /
App Bundle**, **descodificação de protobuf sem schema**, um harness **diferencial Dex-VMP**,
e **templates de módulos de kernel com os seus gates de versão** — e corrigiu duas afirmações anteriores
cujas medições discordavam delas. Recuperação de lógica Unity/IL2CPP,
internos de bytecode React Native/Hermes, e derrotar uma autoridade do lado do servidor **não** são
cobertos, e a skill está escrita para o dizer e parar em vez de aplicar o procedimento documentado
mais próximo a um alvo para o qual não foi escrita.

Quatro qualificações que a secção Coverage declara na íntegra e que também pertencem aqui:

- **A análise Flutter/Dart AOT tem uma dependência.** O fluxo de trabalho começa numa listagem de pool
  (saída da classe `pp.txt`). Produzi-la requer um descompilador de descodificação de snapshot — aotopsy (um binário
  estático, sem toolchain) ou blutter (compilado a partir do código-fonte, ~80 s) — e este repositório não contém
  nenhum. É nomeado como pré-requisito em vez de deixado implícito.
- **Nem todas as afirmações neste repositório têm uma execução por trás.** `docs/tool-verification/` regista
  o que foi realmente medido, em que alvo, e com que verificação cruzada independente; tudo o que não está
  aí coberto é documentado a partir da experiência e deve ser lido como *inferido*, segundo a própria
  escada de afirmações desta skill.
- **A passagem de extensão é registada separadamente e é maioritariamente *inferida*.** As suas evidências vivem em
  `docs/tool-verification/EXTENSION-*.md`, um ficheiro por tópico, com a sua própria nota de robustez. A
  forma comum aí é *a ferramenta foi medida, a rota não* — por isso leia esses ficheiros antes de
  tratar qualquer um dos documentos mais recentes como um caminho verificado.
- **A passagem de benchmark é registada por linha, com a robustez própria dessa linha.** `tests/benchmark.md`
  nomeia cada alvo público, os scripts que a linha exercita, o que realmente aconteceu (incluindo as
  linhas que falharam e as linhas que ninguém executou), e quão forte é a evidência. As linhas marcadas
  `unverified` são afirmações sobre a evidência neste repositório, não sobre o mecanismo.

## Manutenção do repositório

Quatro ferramentas vivem na raiz e não fazem parte da skill instalada:```
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)

A consistência tem uma contra-pressão natural — um caminho quebrado falha ruidosamente, e alguém o conserta. O inchaço não tem nenhuma, e é por isso que a terceira ferramenta existe: cada passagem adiciona uma referência, uma linha de índice e uma alegação de cobertura, e sem uma medição nada no repositório percebe.

tests/benchmark.md contém a matriz de regressão: dimensão -> alvo público -> os scripts que a linha exercita -> resultado medido -> rótulo de força. É a lista de verificação a ser reexecutada antes de confiar em qualquer alegação sob docs/tool-verification/. As amostras são baixadas para tools/_work/ e nunca são versionadas, então cada linha nomeia sua fonte pública e registra o hash contra o qual foi executada.

docs/tool-verification/ também não faz parte da skill instalada. É o registro de evidências de uma passagem de medição contra um alvo real: o que cada script realmente fez, qual método independente o confirmou, quais defeitos foram encontrados e quais cenários o alvo não pôde exercitar. Ele existe para que as alegações de Coverage em SKILL.md possam ser verificadas contra execuções em vez de confiadas, e para que as lacunas sejam registradas onde a próxima pessoa as encontrará.


Orgulhosamente apoiado pela comunidade LINUX DO.

Disclaimer

Apenas para aprendizado, pesquisa e testes de segurança autorizados. Cada script, referência e resultado registrado neste repositório existe para explicar como a análise de aplicações Android funciona, para que profissionais possam raciocinar sobre as ferramentas que já possuem. Nada aqui é um serviço, um produto ou um endosso de qualquer uso específico.

  • Apenas alvos autorizados. Use isto em aplicações que você possui ou para as quais recebeu permissão explícita de analisar, em material público de CTF/desafio, ou em um sandbox que você controla. Analisar software sobre o qual você não tem direito de analisar pode ser ilegal onde você vive, e essa determinação é sua, não deste repositório.
  • Sem garantia, sem adequação a qualquer propósito. O material é fornecido como está, sem garantia de qualquer tipo. Os resultados são registrados conforme foram medidos em uma máquina em um momento; nada aqui promete que uma rota funcionará no seu alvo, seu dispositivo, sua toolchain ou na versão atual do app.
  • Verifique antes de confiar; faça backup antes de agir. Vários scripts modificam artefatos (dex, APK, .so, dados armazenados do app) e alguns operam em um dispositivo com root. Mantenha suas próprias cópias, trabalhe em duplicatas e leia os gates do SKILL.md antes de executar qualquer coisa contra algo com que você se importa.
  • Seu uso é sua responsabilidade. Os autores e contribuidores não aceitam qualquer responsabilidade por qualquer perda, dano, consequência legal ou interrupção de serviço decorrente do uso ou mau uso deste repositório, e não são afiliados, endossados ou agem em nome de qualquer aplicação, fornecedor ou plataforma que ele possa ser usado para examinar.
  • Dados de teste não são distribuídos aqui. Amostras, dumps e artefatos de dispositivo estão deliberadamente ausentes da árvore (.gitignore os exclui) e vivem apenas em um workspace local e ignorado. Qualquer coisa que você obtenha para acompanhar é sua responsabilidade manter segura e excluir quando terminar — siga suas regras locais e os termos que acompanham a amostra. O que este repositório de fato publica é o método e a evidência, com toda a identidade do alvo removida.
  • Sem afiliação. Nomes de ferramentas, bibliotecas, produtos de hardening e alvos públicos de desafio aparecem apenas para tornar o material reutilizável; eles pertencem aos seus respectivos proprietários e este projeto não está conectado a eles.
Baixar ferramenta
  • Manter uma tarefa longa honesta: um registro ao vivo, conclusões graduadas, timeouts calibrados e esperas limitadas, para que o progresso não se perca e o mesmo erro não seja cometido duas vezes.
  • Evitar os erros específicos que produzem um APK que compila perfeitamente e morre em tempo de execução.
  • Decidir qual deve ser o entregável quando um APK não é uma opção — um reempacotamento recusado por várias verificações independentes está bloqueado, não é caro, e a escada de fallback é um módulo em nível de sistema, um serviço RPC local, ou um relatório honesto com um limite declarado.
  • Distinguir um dump de memória real de um esqueleto de extraction-shell, e saber qual rota de recuperação se aplica — incluindo o dump do lado do root para quando o próprio frida é recusado. O que a medição pode e não pode ver está em skills/apk-reverse/references/advanced-unpacking.md.
  • Chamar uma rotina em vez de revertê-la quando reverter custa mais do que invocar: execução emulada no host, ou uma função viva transformada em serviço via Frida RPC.
  • Ler evidência de execução em nível de instrução quando uma função nativa foi achatada em uma máquina de estados por OLLVM — incluindo as duas formas pelas quais o Stalker foi medido a morder de volta em um dispositivo real.
  • Reconhecer quando o hooking em espaço de usuário não consegue alcançar a verificação de forma alguma (syscalls svc brutas, detecção precoce via init_array), o que a próxima camada acima e abaixo pode realmente fazer, e quando escalar é a resposta errada.
  • Trabalhar com protocolos que não são REST — protobuf sem schema, gRPC, QUIC/HTTP3 — e certificate pinning do lado nativo que ignora o armazenamento de confiança do sistema.
  • Trabalhar a partir do próprio telefone: o fluxo de edição/reempacotamento/assinatura do MT Manager e sua superfície APK MCP, o LSPosed Manager, e inspeção de dados no dispositivo, junto com a toolchain de PC em vez de em vez dela.
  • Distinguir Java2C de um extraction shell antes de passar horas caçando um DEX descriptografado que não existe em nenhum momento do tempo de vida do processo — o código foi compilado em um .so.
  • Lidar com uma build que chega como um conjunto de split APK / App Bundle: ler o conjunto de um dispositivo, assinar cada membro com um keystore para pm install-multiple, ou mesclar membros de código/nativos em um APK autônomo quando isso é legal.
  • Trabalhar com um Dex VMP real com o diferencial de texto claro conhecido — quais links podem ser automatizados e quais não podem, o que um fixture compilado pode e não pode alcançar, e como provar uma tabela de opcode privado derivada em vez de afirmar uma.
  • Publicar o que aprende sem publicar o alvo — um scanner que reporta formas de identidade com seu contexto, uma lista explícita do que não deve ser redigido (ferramentas, bibliotecas, campos de protocolo, CVEs, produtos de proteção, crackmes públicos) porque redigir esses destrói a parte reutilizável, e códigos de saída que fazem gate de um commit.
  • Ler um precedente antes de repetir trabalho com o qual este repositório já convergiu: a metade positiva do registro, com a rota incluindo seus becos sem saída, uma nota em cada afirmação, e os arquivos que o caso diz para escrever de volta.
  • 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