Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
apk-reverse — Навык агента для обратного проектирования Android APK: патчинг dex, распаковка, перепаковка, удаление рекламы и пейволов, анализ нативных .so и инструментирование во время выполнения с помощью Frida. | Kitploit
Инструменты/GitHubGitHub/newliver666/apk-reverse
Безопасность AndroidСтатический анализДинамический анализ (песочница)Анализ КодаПентестинг мобильных приложенийОбратная инженерияСкриптинг и автоматизацияАнализ вредоносных программМобильная безопасностьАнализ Бинарных ФайловОбучение и Образование
1.4k37921 день назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
GitHubnewliver666/apk-reverse

apk-reverse

Навык агента для обратного проектирования Android APK: патчинг dex, распаковка, перепаковка, удаление рекламы и пейволов, анализ нативных .so и инструментирование во время выполнения с помощью Frida.

Репозиторий

apk-reverse

English · 简体中文

stars forks license python android ci

Возможности · Структура · Установка · Требования · Каталог ошибок · Область применения · Обслуживание · Отказ от ответственности

apk-reverse

Agent Skill для обратной разработки Android APK, удаления лишнего, удаления рекламы, точечного патчинга dex, переупаковки и анализа во время выполнения/на стороне сервера.

Это навык, а не руководство: он написан так, чтобы загружаться агентом (Claude Code, Codex или любым харнессом, поддерживающим формат Agent Skills) во время работы, поэтому он организован для постепенного раскрытия — короткий SKILL.md, ориентированный на принятие решений, подробные справочники, загружаемые только когда они нужны на конкретном шаге, и параметризованные скрипты, которые можно запускать напрямую.

Как агент должен это использовать

SKILL.md намеренно написан как процедура с воротами, а не как совет, потому что наблюдаемый режим отказа — это не незнание, а модель, которая читает всё целиком, соглашается с этим, а затем всё равно рассуждает с нуля.

Поэтому в теле есть четыре вещи, которые предназначены для того, чтобы действовать по ним, а не просто читать:

  • Четыре правила переопределения (R1–R4). Там, где они конфликтуют с текущим планом, они побеждают, пока доказательства их не переопределят.
  • Индекс симптомов. Каждая строка — это ошибка, за которую уже заплачено. Совпадающая строка — это стоп-сигнал: загрузите этот файл, прежде чем запускать следующую команду, а не после ещё нескольких попыток. Рассуждения в обход известного симптома — это то, как одни и те же часы тратятся дважды.
  • Четыре ворот (G1–G4), каждые — действие с критерием прохождения. «Я понимаю идею» не проходит ворота. Они существуют для того, чтобы классификация, истина об окружении и контрольная сборка произошли до первого патча, а не после третьей неудачи.
  • Правило двух ударов и условия остановки. Две неудачи одной формы означают, что модель ошибается, а не параметры. Третий вариант гипотезы, которая уже дважды провалилась, — это то место, где раунды умирают.

И одна вещь в конце, которая предназначена для того, чтобы её придержать: у «готово» есть определение (шесть пунктов). Чистый лог — не один из них. Всё, что меньше всех шести, — это контрольная точка, и о ней следует сообщать как о контрольной точке с указанием того, что осталось.

Если вы агент, читающий это: самая дешёвая возможная первая команда — python skills/apk-reverse/scripts/doctor.py. Она сообщает вам, какие из этих инструментов здесь есть, какие скрипты действительно могут запуститься и не отравляет ли что-то в окружении ваши измерения уже сейчас.

В чём он хорош

  • Быстро решать, достижим ли запрос вообще на стороне клиента, вместо того чтобы сжигать часы на пейволле, который обеспечивается сервером.
  • Решать, какую форму должен принять результат, прежде чем начнётся какая-либо работа — не требующий root, самодостаточный артефакт — это другая задача, чем «заставить это работать на этой машине», и путаница между ними — самый дорогой дрейф в этой области.
  • Выбирать самый безопасный слой патча для данного изменения и избегать слоёв, которые ломают приложение.
  • Ловить ошибку переупаковки, которая выглядит как успех: приложение, которое устанавливается, запускается и отрисовывается идеально, пока каждый подписанный запрос отклоняется, потому что клиент выводит свой ключ подписи запросов из собственного сертификата подписи.
  • Отделять ваши собственные ошибки от проблем приложения или сервера — сбой, ограниченный функцией (вход, регистрация, оплата), часто является проблемой TLS/сертификата на одном пути кода, а не следствием только что собранного патча. Состояние устройства, мёртвый сервер устройства и дрейф часов маскируются так же.
  • Устанавливать, какая архитектура и какая библиотека действительно исполняются, а не доверять тому, что поставляется в манифесте или что заявляет устройство.
  • Прорабатывать упакованные/защищённые цели: определять упаковщик, распаковывать и превращать дамп памяти обратно в пропатченный, устанавливаемый APK.
  • Обрабатывать защищённую библиотеку, которая намеренно завершает процесс — включая форму намеренного краха (fault addr 0x4), которая выглядит точно как обычная ошибка разыменования null, и правило «нейтрализовать её, но никогда не делая так, чтобы она не возвращалась», которое решает, будет ли исправление работать или заморозит всё приложение так, что это совсем не похоже на причину.
  • Знать, к каким инструментам обращаться и где каждый из них лжёт — включая те, которые существуют только как GUI, так что вы просите человека вместо того, чтобы молча подставить более слабый метод.
  • Делать так, чтобы пропатченная сборка оставалась пропатченной: нейтрализовать проверки версии, диалоги принудительного обновления и самообновляющиеся установщики, чтобы работу нельзя было отключить удалённо — и распознавать канал горячего обновления/удалённой конфигурации, который может тихо отменить её без какого-либо изменения версии.
  • Отделять шлюз входа на стороне клиента (патчится) от ресурса, привязанного к аккаунту (пустого, потому что серверу нечем ответить), и знать, что подделка сессии создаёт состояние хуже, чем выход из системы.

Структура

SKILL.md, references/ и scripts/ находятся внутри каталога навыка, skills/apk-reverse/. Всё в корне репозитория — это инструментарий обслуживания, общий для навыков, а не часть установленного навыка.``` 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:~
Репозиторий также содержит **исполняемый** слой тестов, который отличается от
записи доказательств: `tests/` проверяет, что делают скрипты (модульные тесты, контракт CLI,
интеграция без устройства), а `tests/benchmark.md` фиксирует, что делал маршрут на реальной цели. `tests/README.md`
описывает это разделение, а `.github/workflows/ci.yml` запускает проверки и набор тестов.

## Установка

Этот репозиторий является **репозиторием навыков**: навык находится в `skills/apk-reverse/`, что соответствует
структуре, которую разрешает CLI `skills`, и устанавливается по имени, а не путём копирования каталога:```
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

CLI по умолчанию создаёт символическую ссылку на навык в каталоге навыков вашего агента (--copy вместо этого создаёт независимые копии), а -g устанавливает его для всех проектов, а не только для текущего. При наличии одного навыка в репозитории --skill apk-reverse сегодня избыточен; он указан здесь потому, что именно он выбирает один навык, как только появится второй.

После установки агент загружает SKILL.md, когда задача соответствует его описанию, и подтягивает references/* только по мере необходимости. Никакого глобального состояния, никаких путей, специфичных для конкретной машины, и никакого этапа сборки.

Требования

Ничего не является обязательным; каждый скрипт проверяет то, что ему нужно. skills/apk-reverse/scripts/doctor.py сообщает, какие из этих компонентов присутствуют здесь, какие скрипты, следовательно, могут выполняться, и — что полезно — какие инструменты существуют где-то вне PATH.

Если ваш инструментарий находится вне PATH (локальный для проекта каталог tools/, папка версионированного SDK, исполняемый .jar вместо команды), задайте APKREV_TOOLS как один или несколько каталогов, и doctor.py найдёт их:``` set APKREV_TOOLS=

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

root@kitploit:~
Сами скрипты — это обычный `python3`, и предполагается, что они одинаково работают на Windows, macOS и
Linux; там, где фрагмент только для POSIX, это указано. Здесь ничто не предполагает наличия Unix-шелла.

| Инструмент | Для чего используется |
|---|---|
| Python 3.9+ | все скрипты |
| **`droidasc`** (ASC) (**необязательно, но настоятельно рекомендуется — установите его первым**) | индекс перекрёстных ссылок по всему APK: `findrefs` / `listclass` / `getclass` / `getmanifest`. Один `pip install droidasc`, без JVM, без SDK, без сборки индекса. Превращает вопрос «какой из N тысяч классов упоминает эту строку» в запрос, выполняемый за доли секунды, и это единственный путь к классу, чьё имя искалечил R8. **Это инструмент, к которому агенту следует обратиться до любого полного декомпилирования** — см. `skills/apk-reverse/references/toolchain.md` §droidasc (ASC) — спросить у APK «кто ссылается на это?» одним запросом |
| `ddc` (необязательно, но настоятельно рекомендуется) | однобинарный декомпилятор dex→Java с подкомандами-запросами (`info`, `findrefs`, `strings --with-locations`, декомпиляция отдельного класса). Без JVM. **Читает** то, что ASC **находит**; также надёжно сообщает идентичность пакета — см. `skills/apk-reverse/references/toolchain.md` §ddc — dex-to-Java с подкомандами-запросами (стоит взять на вооружение) |
| `baksmali` / `smali` + jar-файлы `dexlib2` | дизассемблирование, ассемблирование, точечное патчирование |
| JDK (`javac`, `java`) | сборка/запуск патчера dexlib2; также предоставляет `keytool`/`jarsigner` |
| Android SDK build-tools (`aapt`, `zipalign`, `apksigner`) | информация о манифесте, выравнивание, подпись. **`apksigner` — это тот инструмент подписи, который нужно использовать** — `jarsigner` перезаписывает архив и нарушает выравнивание, требуемое Android R+ |
| `uber-apk-signer` (необязательно) | выравнивание + подпись в один шаг |
| ADB | работа с устройством |
| Frida (хост-пакет + совпадающий сервер на устройстве) | динамический анализ |
| рутованное устройство или эмулятор | всё, что выходит за рамки статического анализа |

Ничто из этого не обязано быть в `PATH`: каждый скрипт принимает явный путь к
инструментам, которые он вызывает, а `skills/apk-reverse/references/toolchain.md` описывает, как найти
установку, о которой `PATH` не знает (обычный случай для `apksigner` и
`keytool`).

## Сначала прочитайте это

**Этот проект публикуется только для обучения, исследований и авторизованного тестирования безопасности.** Он не содержит
эксплойт-пейлоадов, данных о целях и сторонних бинарников — это метод, набор скриптов
и запись доказательств. Вы несёте ответственность за наличие права анализировать то, на что вы его направляете;
см. **Отказ от ответственности** в конце этого файла.

`skills/apk-reverse/references/pitfalls.md`. Это самый ценный файл здесь — каждая запись в нём — это
сбой, который породил сломанный артефакт, выглядя при этом совершенно здоровым.

Четыре самых болезненных:

1. Удаление всего `META-INF/` при перепаковке уничтожает регистрации ServiceLoader,
   и приложение умирает при запуске с ошибкой, называющей не связанную с этим библиотеку.
2. Патчинг строки на байтовом уровне без сохранения порядка `string_ids` приводит к тому, что весь
   dex отвергается, при этом контрольные суммы и подписи проверяются идеально.
3. Пересборка dex с полным круговым проходом smali по всему дереву незаметно повреждает вывод R8 —
   таблицы классов сравниваются чисто, и всё взрывается только во время выполнения.
4. Нейтрализация нативного пути завершения путём принудительного **невозврата** из него. Крутящаяся заглушка не
   подавляет проверку; она замораживает вызывающего и каждый поток за ним. Приложение зависает *без
   какой-либо записи о падении*, и итоговую смерть списывают на то, что убило замороженный процесс.

## Область применения

Создан для работы с вашими собственными приложениями, с образцами, которые вам разрешено анализировать,
и в песочницах CTF/соревнований. Он не содержит встроенных сторонних бинарников и никаких
данных, специфичных для целей.

Что он покрывает и что намеренно не покрывает, указано в начале `SKILL.md`
в разделе **Coverage**. Краткая версия: только Android (без iOS), и глубоко на тех слоях,
которые были реально проработаны — патчинг dex, перепаковка, упаковщики и кастомные
загрузчики, нативная реакция на вмешательство и Flutter/Dart AOT. Проход расширения добавил второй
уровень документированных маршрутов: **доставка на стороне модуля**, когда перепаковка заблокирована,
**восстановление извлекающей оболочки** и её граница VMP, **эмуляция и живой RPC** для
вызова, а не чтения, **трассировка на уровне инструкций** против OLLVM, **реверс протоколов**
за пределами REST, карта **маршрута на стороне ядра** для случаев, когда хукинг в пользовательском пространстве доказуемо недостижим,
и **инструментарий на устройстве**. Затем **проход бенчмарков** поставил публичные
цели под эти маршруты (`tests/benchmark.md`): он добавил **дискриминацию Java2C** (ошибочный диагноз,
который отправляет агента на охоту за расшифрованным DEX, которого никогда не существует), **обработку split APK /
App Bundle**, **декодирование protobuf без схемы**, дифференциальный стенд **Dex-VMP**
и **шаблоны модулей ядра с их версионными ограничениями** — и он исправил два более ранних утверждения,
измерения которых с ними не согласились. Восстановление логики Unity/IL2CPP,
внутренности байткода React Native/Hermes и победа над серверным авторитетом **не**
покрываются, и навык написан так, чтобы сказать об этом и остановиться, а не применять ближайшую
документированную процедуру к цели, для которой он не был написан.

Четыре оговорки, которые раздел Coverage излагает полностью и которые также уместны здесь:

- **Анализ Flutter/Dart AOT имеет зависимость.** Рабочий процесс начинается с листинга пула
  (вывод класса `pp.txt`). Чтобы его получить, нужен декомпилятор, декодирующий снапшот — aotopsy (статический
  бинарник, без тулчейна) или blutter (собирается из исходников, ~80 с) — и этот репозиторий не содержит
  его. Он назван как предварительное условие, а не оставлен неявным.
- **Не за каждым утверждением в этом репозитории стоит запуск.** `docs/tool-verification/` фиксирует,
  что было фактически измерено, на какой цели и с какой независимой перекрёстной проверкой; всё, что не
  покрыто там, документировано из опыта и должно читаться как *выведенное*, согласно собственной
  лестнице утверждений этого навыка.
- **Проход расширения записан отдельно и в основном является *выведенным*.** Его доказательства живут в
  `docs/tool-verification/EXTENSION-*.md`, по одному файлу на тему, с собственной заметкой о силе доказательств. Общая
  картина там такова: *инструмент был измерен, маршрут — нет* — поэтому прочитайте те файлы, прежде чем
  относиться к любому из более новых документов как к проверенному пути.
- **Проход бенчмарков записан построчно, с собственной силой доказательств для каждой строки.** `tests/benchmark.md`
  называет каждую публичную цель, скрипты, которые задействует строка, что фактически произошло (включая
  строки, которые провалились, и строки, которые никто не запускал), и насколько сильны доказательства. Строки, помеченные
  `unverified`, — это утверждения о доказательствах в этом репозитории, а не о механизме.

## Обслуживание репозитория

Четыре инструмента находятся в корне и не являются частью установленного навыка:```
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)

У согласованности есть естественное противодействие — сломанный путь громко падает, и кто-то его чинит. У раздутости такого нет, поэтому и существует третий инструмент: каждый проход добавляет ссылку, строку индекса и заявление о покрытии, и без измерения ничего в репозитории этого не замечает.

tests/benchmark.md содержит матрицу регрессии: измерение -> публичная цель -> скрипты, которые задействует строка -> измеренный результат -> метка силы. Это контрольный список для повторного запуска перед тем, как доверять любому утверждению в docs/tool-verification/. Образцы скачиваются в tools/_work/ и никогда не коммитятся, поэтому каждая строка называет свой публичный источник и записывает хеш, против которого она запускалась.

docs/tool-verification/ также не является частью установленного навыка. Это запись доказательств для одного прохода измерения против реальной цели: что на самом деле делал каждый скрипт, какой независимый метод это подтвердил, какие дефекты были найдены и какие сценарии цель не смогла задействовать. Он существует для того, чтобы утверждения о Coverage в SKILL.md можно было проверить по запускам, а не доверять им, и чтобы пробелы были записаны там, где их найдёт следующий человек.


При поддержке сообщества LINUX DO.

Отказ от ответственности

Только для обучения, исследований и авторизованного тестирования безопасности. Каждый скрипт, справочный материал и записанный результат в этом репозитории существует, чтобы объяснить, как работает анализ Android-приложений, чтобы практики могли рассуждать об инструментах, которые у них уже есть. Ничто здесь не является сервисом, продуктом или одобрением какого-либо конкретного использования.

  • Только авторизованные цели. Используйте это на приложениях, которыми вы владеете или на анализ которых у вас есть явное разрешение, на публичных материалах CTF/челленджей или в песочнице, которую вы контролируете. Анализ программного обеспечения, на который у вас нет права, может быть незаконным в вашей юрисдикции, и это определение — ваше, а не этого репозитория.
  • Никаких гарантий, никакой пригодности для какой-либо цели. Материал предоставляется как есть, без гарантий любого рода. Результаты записаны так, как они были измерены на одной машине в одно время; ничто здесь не обещает, что маршрут сработает на вашей цели, вашем устройстве, вашем инструментарии или сегодняшней версии приложения.
  • Проверяйте, прежде чем доверять; делайте резервные копии, прежде чем действовать. Несколько скриптов изменяют артефакты (dex, APK, .so, сохранённые данные приложения), а некоторые работают на рутованном устройстве. Храните свои копии, работайте на дубликатах и прочитайте раздел о шлюзах в SKILL.md, прежде чем запускать что-либо против того, что вам дорого.
  • Ваше использование — ваша ответственность. Авторы и участники не несут никакой ответственности за любые потери, ущерб, юридические последствия или перерыв в обслуживании, возникшие в результате использования или неправильного использования этого репозитория, и не связаны с каким-либо приложением, вендором или платформой, которые могут использоваться для его изучения, не одобрены ими и не действуют от их имени.
  • Тестовые данные здесь не распространяются. Образцы, дампы и артефакты устройств намеренно отсутствуют в дереве (.gitignore их исключает) и находятся только в локальном, игнорируемом рабочем пространстве. Всё, что вы получите, чтобы следовать за материалом, — ваше, и вы должны хранить это в безопасности и удалить, когда закончите, — следуйте вашим локальным правилам и условиям, которые прилагались к образцу. Этот репозиторий публикует метод и доказательства, со всей удалённой идентификацией цели.
  • Никакой аффилированности. Названия инструментов, библиотек, продуктов для усиления защиты и публичных целей челленджей появляются только для того, чтобы сделать материал многоразовым; они принадлежат их соответствующим владельцам, и этот проект не связан с ними.
Скачать инструмент
  • Поддерживать честность длительной задачи: живая запись, оценённые выводы, калиброванные тайм-ауты и ограниченные ожидания, чтобы прогресс не терялся и одна и та же ошибка не совершалась дважды.
  • Избегать конкретных ошибок, которые приводят к APK, который собирается идеально и умирает во время выполнения.
  • Решать, каким должен быть результат, когда APK не вариант — переупаковка, отклонённая несколькими независимыми проверками, заблокирована, а не дорога, и лестница запасных вариантов — это модуль системного уровня, локальный RPC-сервис или честный отчёт с указанной границей.
  • Отличать настоящий дамп памяти от скелета извлекающей оболочки и знать, какой маршрут восстановления применим — включая дамп со стороны root для случая, когда сам frida отклонён. Что измерение может и не может увидеть, описано в skills/apk-reverse/references/advanced-unpacking.md.
  • Вызывать процедуру вместо её реверса, когда реверс стоит дороже, чем вызов: эмулированное исполнение на хосте или живая функция, превращённая в сервис через Frida RPC.
  • Читать доказательства исполнения на уровне инструкций, когда нативная функция была сплющена в машину состояний с помощью OLLVM — включая два способа, которыми Stalker, как было измерено, даёт сдачи на реальном устройстве.
  • Распознавать, когда хукинг в пространстве пользователя вообще не может дотянуться до проверки (сырые svc-сисколлы, раннее обнаружение через init_array), что реально может сделать следующий слой выше и ниже и когда эскалация — неправильный ответ.
  • Работать с протоколами, которые не REST — protobuf без схемы, gRPC, QUIC/HTTP3 — и привязкой сертификатов на нативной стороне, которая игнорирует системное хранилище доверия.
  • Работать с самого телефона: поток редактирования/переупаковки/подписи в MT Manager и его поверхность APK MCP, LSPosed Manager и инспекция данных на устройстве — наряду с инструментарием для ПК, а не вместо него.
  • Отличать Java2C от извлекающей оболочки, прежде чем потратить часы на охоту за расшифрованным DEX, которого не существует ни в один момент жизненного цикла процесса — код был скомпилирован в .so.
  • Обрабатывать сборку, которая приходит как набор split APK / App Bundle: считывать набор с устройства, подписывать каждый элемент одним keystore для pm install-multiple или объединять элементы кода/нативных библиотек в автономный APK, когда это законно.
  • Работать с настоящим Dex VMP с помощью дифференциала по известному открытому тексту — какие связи можно автоматизировать, а какие нет, чего может и не может достичь скомпилированный фикстур и как доказать выведенную таблицу приватных опкодов вместо того, чтобы утверждать её.
  • Публиковать то, что он узнаёт, не публикуя цель — сканер, который сообщает формы идентичности с их контекстом, явный список того, что не должно быть отредактировано (инструменты, библиотеки, поля протокола, CVE, продукты защиты, публичные крякми), потому что редактирование этого уничтожает переиспользуемую часть, и коды выхода, которые управляют коммитом.
  • Читать прецедент, прежде чем повторять работу, к которой этот репозиторий уже пришёл: положительную половину записи, с маршрутом, включая его тупики, оценкой каждого утверждения и файлами, в которые, как говорит кейс, нужно записать обратно.
  • 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