Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
apk-reverse — Habilidad de agente para ingeniería inversa de APK de Android: parcheo de dex, desempaquetado, reempaquetado, eliminación de anuncios y paywalls, análisis de .so nativos e instrumentación en tiempo de ejecución con Frida. | Kitploit
Herramientas/GitHubGitHub/newliver666/apk-reverse
Seguridad AndroidAnálisis EstáticoAnálisis Dinámico (Sandboxing)Análisis de CódigoPentesting de Apps MóvilesIngeniería InversaScripting y AutomatizaciónAnálisis de MalwareSeguridad MóvilAnálisis de BinariosAprendizaje y Educación
1.4k3792hace 1 díaAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
GitHubnewliver666/apk-reverse

apk-reverse

Habilidad de agente para ingeniería inversa de APK de Android: parcheo de dex, desempaquetado, reempaquetado, eliminación de anuncios y paywalls, análisis de .so nativos e instrumentación en tiempo de ejecución con Frida.

Ver Repositorio

apk-reverse

English · 简体中文

stars forks license python android ci

Capacidades · Estructura · Instalación · Requisitos · Catálogo de fallos · Alcance · Mantenimiento · Aviso legal

apk-reverse

Una Agent Skill para ingeniería inversa de APK de Android, debloating, eliminación de anuncios, parcheo quirúrgico de dex, reempaquetado y análisis en tiempo de ejecución/servidor.

Es una skill, no un tutorial: está escrita para ser cargada por un agente (Claude Code, Codex, o cualquier harness que soporte el formato Agent Skills) mientras trabaja, por lo que está organizada para divulgación progresiva — un SKILL.md corto orientado a decisiones, referencias detalladas cargadas solo cuando un paso las necesita, y scripts parametrizados que puedes ejecutar directamente.

Cómo se espera que un agente consuma esto

SKILL.md está escrito deliberadamente como un procedimiento con puertas en lugar de como consejos, porque el modo de fallo observado no es la ignorancia — es un modelo que lee todo, está de acuerdo con ello, y luego razona desde primeros principios de todos modos.

Así que hay cuatro cosas en el cuerpo que están destinadas a ser actuadas, no leídas:

  • Cuatro reglas de anulación (R1–R4). Cuando entran en conflicto con el plan actual, ganan hasta que la evidencia las anule.
  • Un índice de síntomas. Cada fila es un fallo que ya se ha pagado. Una fila coincidente es una señal de parada: carga ese archivo antes de ejecutar otro comando, en lugar de después de unos cuantos intentos más. Razonar más allá de un síntoma conocido es cómo se gastan las mismas horas dos veces.
  • Cuatro puertas (G1–G4), cada una una acción con un criterio de aprobación. "Entiendo la idea" no supera una puerta. Existen para que la clasificación, la verdad del entorno y una compilación de control ocurran antes del primer parche, no después del tercer fallo.
  • Una regla de dos intentos y condiciones de parada. Dos fallos de la misma forma significan que el modelo está equivocado, no los parámetros. La tercera variante de una hipótesis que ya falló dos veces es donde las rondas van a morir.

Y una cosa al final que está destinada a ser retenida: "hecho" tiene una definición (seis elementos). Un log limpio no es uno de ellos. Cualquier cosa que no cumpla los seis es un checkpoint, y debe reportarse como un checkpoint con lo que queda.

Si eres un agente leyendo esto: el primer comando más barato posible es python skills/apk-reverse/scripts/doctor.py. Te dice cuáles de estas herramientas existen aquí, qué scripts pueden ejecutarse realmente, y si algo en el entorno ya está envenenando tus mediciones.

Para qué es bueno

  • Decidir rápidamente si una solicitud es siquiera alcanzable del lado del cliente, en lugar de quemar horas en un paywall que está impuesto por un servidor.
  • Decidir qué forma debe tomar el entregable antes de que empiece cualquier trabajo — un artefacto autónomo y sin root es un problema diferente de "hacerlo funcionar en esta máquina", y confundir los dos es la deriva más costosa en este dominio.
  • Elegir la capa de parcheo más segura para un cambio dado, y evitar las capas que rompen la app.
  • Detectar el fallo de reempaquetado que parece un éxito: una app que se instala, se lanza y se renderiza perfectamente mientras cada solicitud firmada es rechazada, porque el cliente deriva su clave de firma de solicitudes de su propio certificado de firma.
  • Separar tus propios errores de los problemas de la app o del servidor — un fallo con alcance de característica (login, registro, pago) es a menudo un problema de TLS/certificado en una ruta de código, no una consecuencia del parche que acabas de construir. El estado del dispositivo, un servidor de dispositivo muerto y la deriva del reloj se disfrazan de la misma manera.
  • Establecer qué arquitectura y qué biblioteca se están ejecutando realmente, en lugar de confiar en lo que envía el manifiesto o lo que afirma el dispositivo.
  • Trabajar a través de objetivos empaquetados/endurecidos: identificar el packer, desempaquetar, y convertir un volcado de memoria de vuelta en un APK parcheado e instalable.
  • Manejar una biblioteca endurecida que termina el proceso a propósito — incluyendo la forma de crash deliberado (fault addr 0x4) que se ve exactamente como un bug ordinario de desreferencia nula, y la regla de "neutralízalo, pero nunca haciéndolo no retornar" que decide si el arreglo funciona o congela toda la app de una manera que no se parece en nada a la causa.
  • Saber a qué herramientas recurrir y dónde miente cada una — incluyendo las que solo existen como GUI, para que pidas un humano en lugar de sustituir silenciosamente un método más débil.
  • Hacer que una compilación parcheada permanezca parcheada: neutralizar comprobaciones de versión, diálogos de actualización forzada e instaladores de autoactualización para que el trabajo no pueda desactivarse remotamente — y reconocer el canal de hot-update/remote-config que puede deshacerlo silenciosamente sin ningún cambio de versión.
  • Separar una puerta de inicio de sesión del lado del cliente (parcheable) de un (vacío porque el servidor no tiene nada con qué responder), y saber que forjar una sesión produce un estado peor que estar desconectado.

Estructura

SKILL.md, references/ y scripts/ están todos dentro del directorio de la skill, skills/apk-reverse/. Todo lo que está en la raíz del repositorio es herramienta de mantenimiento compartida entre skills, no parte de una 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:~
El repositorio también incluye una capa de pruebas **ejecutables**, que es algo distinto del
registro de evidencia: `tests/` verifica lo que hacen los scripts (unitarias, contrato de CLI, integración
sin dispositivo) y `tests/benchmark.md` registra lo que hizo una ruta sobre un objetivo real. `tests/README.md`
establece la separación, y `.github/workflows/ci.yml` ejecuta las compuertas más la suite.

## Instalación

Este repositorio es un **repositorio de skills**: la skill vive en `skills/apk-reverse/`, que es la
disposición que resuelve la CLI de `skills`, y se instala por nombre en lugar de copiando un directorio:```
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

El CLI enlaza simbólicamente la skill en el directorio de skills de tu agente por defecto (--copy crea copias independientes en su lugar), y -g instala para todos los proyectos en lugar del actual. Con una sola skill en el repositorio, --skill apk-reverse es redundante hoy; se escribe aquí porque es lo que selecciona una única skill una vez que exista una segunda.

Una vez instalada, el agente carga SKILL.md cuando una tarea coincide con su descripción, y recurre a references/* solo cuando es necesario. Sin estado global, sin rutas específicas de la máquina y sin paso de compilación.

Requisitos

Nada es obligatorio; cada script comprueba lo que necesita. skills/apk-reverse/scripts/doctor.py informa de cuáles de estos están presentes aquí, qué scripts pueden por tanto ejecutarse y — de forma útil — qué herramientas existen en algún lugar distinto de PATH.

Si tu toolchain vive fuera de PATH (un directorio tools/ local del proyecto, una carpeta de SDK versionada, un .jar ejecutable en lugar de un comando), establece APKREV_TOOLS a uno o más directorios y doctor.py los encontrará:``` set APKREV_TOOLS=

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

root@kitploit:~
Los propios scripts son `python3` puro y están pensados para funcionar de forma idéntica en Windows, macOS y
Linux; cuando un fragmento es solo para POSIX, se etiqueta como tal. Nada aquí asume un shell de Unix.

| Herramienta | Para qué se usa |
|---|---|
| Python 3.9+ | todos los scripts |
| **`droidasc`** (ASC) (**opcional pero muy recomendado — instálalo primero**) | índice de referencias cruzadas de todo el APK: `findrefs` / `listclass` / `getclass` / `getmanifest`. Un `pip install droidasc`, sin JVM, sin SDK, sin construir índice. Convierte "cuál de N mil clases menciona esta cadena" en una consulta de menos de un segundo, y es la única ruta hacia una clase cuyo nombre R8 destrozó. **Esta es la herramienta a la que un agente debería recurrir antes de cualquier descompilación completa** — véase `skills/apk-reverse/references/toolchain.md` §droidasc (ASC) — preguntarle a un APK "¿quién referencia esto?", en una sola consulta |
| `ddc` (opcional pero muy recomendado) | descompilador dex→Java de un solo binario con subcomandos de consulta (`info`, `findrefs`, `strings --with-locations`, descompilación por clase). Sin JVM. **Lee** lo que ASC **localiza**; también informa la identidad del paquete de forma fiable — véase `skills/apk-reverse/references/toolchain.md` §ddc — dex-a-Java con subcomandos de consulta (vale la pena adoptarlo) |
| jars de `baksmali` / `smali` + `dexlib2` | desensamblado, ensamblado, parcheo quirúrgico |
| JDK (`javac`, `java`) | compilar/ejecutar el parcheador dexlib2; también proporciona `keytool`/`jarsigner` |
| build-tools del SDK de Android (`aapt`, `zipalign`, `apksigner`) | información del manifiesto, alineación, firma. **`apksigner` es el firmador que hay que usar** — `jarsigner` reescribe el archivo y rompe la alineación que Android R+ requiere |
| `uber-apk-signer` (opcional) | alineación + firma en un solo paso |
| ADB | trabajo con dispositivos |
| Frida (paquete en el host + servidor en el dispositivo compatible) | análisis dinámico |
| un dispositivo rooteado o emulador | cualquier cosa más allá del análisis estático |

Ninguna de estas necesita estar en `PATH`: cada script acepta una ruta explícita para las
herramientas que invoca, y `skills/apk-reverse/references/toolchain.md` cubre cómo encontrar
una instalación que `PATH` no conoce (el caso habitual de `apksigner` y
`keytool`).

## Lee esto primero

**Este proyecto se publica únicamente para aprendizaje, investigación y pruebas de seguridad autorizadas.** No incluye
ningún payload de exploit, ni datos de objetivos, ni binarios de terceros — es un método, un conjunto de scripts
y un registro de evidencias. Eres responsable de tener el derecho a analizar aquello a lo que lo apuntes;
véase el **Descargo de responsabilidad** al final de este archivo.

`skills/apk-reverse/references/pitfalls.md`. Es el archivo más valioso de aquí — cada entrada es un
fallo que produjo un artefacto roto mientras parecía completamente sano.

Los cuatro que más duelen:

1. Eliminar todo el `META-INF/` durante un reempaquetado borra los registros de ServiceLoader
   y la app muere al arrancar con un error que nombra una biblioteca no relacionada.
2. Parchear una cadena a nivel de byte sin preservar el orden de `string_ids` hace que se rechace
   todo el dex, mientras que las sumas de verificación y las firmas se validan perfectamente.
3. Reconstruir un dex con una ida y vuelta completa de smali sobre todo el árbol daña la salida de R8 de forma invisible —
   las tablas de clases se comparan limpias, y solo explota en tiempo de ejecución.
4. Neutralizar una ruta de terminación nativa haciendo que **no retorne**. Un stub que gira no
   suprime la comprobación; congela al llamador y a todos los hilos detrás de él. La app se cuelga con *ningún
   registro de fallo en absoluto*, y la muerte final se achaca a lo que sea que mató al proceso congelado.

## Alcance

Construido para trabajar sobre tus propias aplicaciones, sobre muestras que estás autorizado a analizar,
y en sandboxes de CTF/competición. No contiene binarios de terceros incorporados ni
datos específicos de objetivos.

Lo que cubre, y lo que deliberadamente no cubre, se indica al principio de `SKILL.md`
bajo **Cobertura**. La versión corta: solo Android (no iOS), y en profundidad en las capas
que se han trabajado de verdad — parcheo de dex, reempaquetado, empaquetadores y cargadores personalizados,
respuesta nativa a la manipulación, y Flutter/Dart AOT. Una pasada de extensión añadió un segundo
nivel de rutas documentadas: **entrega por el lado del módulo** cuando un reempaquetado está bloqueado,
**recuperación de shell de extracción** y su frontera VMP, **emulación y RPC en vivo** para
llamar en lugar de leer, **trazado a nivel de instrucción** contra OLLVM, **reversión de protocolos**
más allá de REST, el mapa de la **ruta del lado del kernel** para cuando el hooking en espacio de usuario está
demostrablemente fuera de alcance, y **herramientas en el dispositivo**. Una **pasada de benchmark** puso después objetivos públicos
bajo esas rutas (`tests/benchmark.md`): añadió **discriminación de Java2C** (el
diagnóstico erróneo que envía a un agente a cazar un DEX descifrado que nunca existe), **manejo de APK dividido /
App Bundle**, **decodificación de protobuf sin esquema**, un arnés **diferencial Dex-VMP**,
y **plantillas de módulos de kernel con sus puertas de versión** — y corrigió dos afirmaciones anteriores
cuyas mediciones no concordaban con ellas. La recuperación de lógica de Unity/IL2CPP,
los internos del bytecode de React Native/Hermes, y derrotar a una autoridad del lado del servidor **no** están
cubiertos, y la skill está escrita para decirlo y detenerse en lugar de aplicar el procedimiento
documentado más cercano a un objetivo para el que no fue escrita.

Cuatro matices que la sección de Cobertura expone en su totalidad y que también corresponden aquí:

- **El análisis de Flutter/Dart AOT tiene una dependencia.** El flujo de trabajo comienza en un listado de pool
  (salida del tipo `pp.txt`). Producir eso requiere un descompilador de decodificación de snapshots — aotopsy (un binario
  estático, sin toolchain) o blutter (compilado desde el código fuente, ~80 s) — y este repositorio no contiene
  ninguno. Se nombra como requisito previo en lugar de dejarlo implícito.
- **No todas las afirmaciones de este repositorio tienen una ejecución detrás.** `docs/tool-verification/` registra
  lo que se midió realmente, sobre qué objetivo, y con qué verificación cruzada independiente; cualquier cosa no
  cubierta allí está documentada a partir de la experiencia y debe leerse como *inferida*, según la propia
  escala de afirmaciones de esta skill.
- **La pasada de extensión se registra por separado y es en su mayoría *inferida*.** Su evidencia vive en
  `docs/tool-verification/EXTENSION-*.md`, un archivo por tema, con su propia nota de solidez. La
  forma común allí es *se midió la herramienta, no la ruta* — así que lee esos archivos antes de
  tratar cualquiera de los documentos más nuevos como una ruta verificada.
- **La pasada de benchmark se registra por fila, con la solidez propia de esa fila.** `tests/benchmark.md`
  nombra cada objetivo público, los scripts que ejercita la fila, lo que realmente ocurrió (incluidas las
  filas que fallaron y las filas que nadie ejecutó), y cuán fuerte es la evidencia. Las filas marcadas
  como `unverified` son afirmaciones sobre la evidencia en este repositorio, no sobre el mecanismo.

## Mantenimiento del repositorio

Cuatro herramientas viven en la raíz y no forman parte de la 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)

La consistencia tiene una contrapresión natural: una ruta rota falla de forma ruidosa, y alguien la arregla. La hinchazón no tiene ninguna, y por eso existe la tercera herramienta: cada pasada añade una referencia, una fila de índice y una afirmación de cobertura, y sin una medición nada en el repositorio lo nota.

tests/benchmark.md contiene la matriz de regresión: dimensión -> objetivo público -> los scripts que la fila ejercita -> resultado medido -> etiqueta de fortaleza. Es la lista de verificación que hay que volver a ejecutar antes de confiar en cualquier afirmación bajo docs/tool-verification/. Las muestras se descargan en tools/_work/ y nunca se confirman en el repositorio, por lo que cada fila nombra su fuente pública y registra el hash contra el que se ejecutó.

docs/tool-verification/ tampoco forma parte de la skill instalada. Es el registro de evidencia de una pasada de medición contra un objetivo real: qué hizo realmente cada script, qué método independiente lo confirmó, qué defectos se encontraron y qué escenarios el objetivo no pudo ejercitar. Existe para que las afirmaciones de Coverage en SKILL.md puedan comprobarse contra ejecuciones en lugar de confiarse, y para que las lagunas queden escritas donde la siguiente persona las encuentre.


Con el orgulloso apoyo de la comunidad LINUX DO.

Aviso legal

Solo para aprendizaje, investigación y pruebas de seguridad autorizadas. Cada script, referencia y resultado registrado en este repositorio existe para explicar cómo funciona el análisis de aplicaciones Android, de modo que los profesionales puedan razonar sobre las herramientas que ya poseen. Nada de lo aquí presente es un servicio, un producto ni un respaldo de ningún uso concreto.

  • Solo objetivos autorizados. Úsalo en aplicaciones que poseas o para las que tengas permiso explícito de analizar, en material público de CTF/desafíos, o en un sandbox que controles. Analizar software que no tienes derecho a analizar puede ser ilegal donde vives, y esa determinación es tuya, no de este repositorio.
  • Sin garantía, sin idoneidad para ningún propósito. El material se proporciona tal cual, sin garantía de ningún tipo. Los resultados se registran tal como se midieron en una máquina en un momento dado; nada aquí promete que una ruta funcione en tu objetivo, tu dispositivo, tu toolchain o la versión actual de la app.
  • Verifica antes de confiar; haz copia de seguridad antes de actuar. Varios scripts modifican artefactos (dex, APK, .so, datos de app almacenados) y algunos operan sobre un dispositivo rooteado. Conserva tus propias copias, trabaja sobre duplicados y lee las puertas de SKILL.md antes de ejecutar cualquier cosa contra algo que te importe.
  • Tu uso es tu responsabilidad. Los autores y colaboradores no aceptan ninguna responsabilidad por cualquier pérdida, daño, consecuencia legal o interrupción del servicio derivada del uso o mal uso de este repositorio, y no están afiliados, respaldados ni actúan en nombre de ninguna aplicación, proveedor o plataforma que pueda usarse para examinar.
  • Los datos de prueba no se distribuyen aquí. Las muestras, volcados y artefactos de dispositivos están deliberadamente ausentes del árbol (.gitignore los excluye) y viven solo en un espacio de trabajo local ignorado. Cualquier cosa que obtengas para seguir el material es tuya para mantenerla segura y eliminarla cuando termines con ella — sigue tus reglas locales y los términos que acompañaban a la muestra. Lo que este repositorio sí publica es el método y la evidencia, con toda identidad del objetivo eliminada.
  • Sin afiliación. Los nombres de herramientas, bibliotecas, productos de hardening y objetivos públicos de desafíos aparecen solo para hacer reutilizable el material; pertenecen a sus respectivos propietarios y este proyecto no está conectado con ellos.
Descargar herramienta
recurso con alcance de cuenta
  • Mantener una tarea larga honesta: un registro en vivo, conclusiones calificadas, tiempos de espera calibrados y esperas acotadas, para que el progreso no se pierda y el mismo error no se cometa dos veces.
  • Evitar los errores específicos que producen un APK que compila perfectamente y muere en tiempo de ejecución.
  • Decidir cuál debe ser el entregable cuando un APK no es una opción — un reempaquetado rechazado por varias comprobaciones independientes está bloqueado, no es caro, y la escalera de respaldo es un módulo a nivel de sistema, un servicio RPC local, o un informe honesto con un límite declarado.
  • Distinguir un volcado de memoria real de un esqueleto de shell de extracción, y saber qué ruta de recuperación aplica — incluyendo el volcado del lado root para cuando frida mismo es rechazado. Lo que la medición puede y no puede ver está en skills/apk-reverse/references/advanced-unpacking.md.
  • Llamar a una rutina en lugar de revertirla cuando revertir cuesta más que invocar: ejecución emulada en el host, o una función viva convertida en servicio sobre Frida RPC.
  • Leer evidencia de ejecución a nivel de instrucción cuando una función nativa ha sido aplanada en una máquina de estados por OLLVM — incluyendo las dos formas en que se midió que Stalker muerde de vuelta en un dispositivo real.
  • Reconocer cuándo el hooking en espacio de usuario no puede alcanzar la comprobación en absoluto (syscalls svc en crudo, detección temprana en init_array), qué puede hacer realmente la siguiente capa hacia arriba y hacia abajo, y cuándo escalar es la respuesta equivocada.
  • Trabajar protocolos que no son REST — protobuf sin esquema, gRPC, QUIC/HTTP3 — y el pinning de certificados del lado nativo que ignora el almacén de confianza del sistema.
  • Trabajar desde el propio teléfono: el flujo de edición/reempaquetado/firma de MT Manager y su superficie APK MCP, LSPosed Manager, e inspección de datos en el dispositivo, junto con la cadena de herramientas de PC en lugar de en su lugar.
  • Distinguir Java2C de un shell de extracción antes de pasar horas cazando un DEX descifrado que no existe en ningún punto del tiempo de vida del proceso — el código fue compilado en un .so.
  • Manejar una compilación que llega como un conjunto de split APK / App Bundle: leer el conjunto desde un dispositivo, firmar cada miembro con un keystore para pm install-multiple, o fusionar miembros de código/nativos en un APK autónomo cuando eso es legal.
  • Trabajar un Dex VMP real con el diferencial de texto plano conocido — qué enlaces pueden automatizarse y cuáles no, qué puede y no puede alcanzar un fixture compilado, y cómo probar una tabla de opcodes privados derivada en lugar de afirmar una.
  • Publicar lo que aprende sin publicar el objetivo — un escáner que reporta formas de identidad con su contexto, una lista explícita de lo que no debe redactarse (herramientas, bibliotecas, campos de protocolo, CVEs, productos de endurecimiento, crackmes públicos) porque redactar esos destruye la parte reutilizable, y códigos de salida que condicionan un commit.
  • Leer un precedente antes de repetir trabajo en el que este repositorio ya convergió: la mitad positiva del registro, con la ruta incluyendo sus callejones sin salida, una calificación en cada afirmación, y los archivos que el caso dice que hay que reescribir.
  • 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