mirror of
https://codeberg.org/reverse-skill-lab/apk-reverse
synced 2026-11-15 20:44:22 +08:00
Structure: sink the evidence record out of SKILL.md, and gate the budget
SKILL.md was 658 lines against the Anthropic Agent Skills guidance of keeping the body under 500, and the growth sat where it costs most: the Coverage section had accumulated the evidence for every claim plus a per-pass verification history (153 lines / 11.8 KB), and Hand-off had grown two knowledge tables. Both now load on demand, with SKILL.md keeping the decision-level statement and a pointer. Coverage 153 -> 68 lines new references/coverage-and-limits.md Hand-off 51 -> 19 lines new references/handoff-boundaries.md SKILL.md 658 -> 543 lines (404 narrative + 139 index) index rows 24.0 KB -> ~19 KB descriptions now say when to load, not what is inside check_budget.py is the substance of this pass. check_repo.py proves consistency, and consistency has a natural counter-pressure: a broken path fails loudly and someone fixes it. Bloat has none -- every pass adds a reference, an index row and a coverage claim, and nothing in the repository notices. The new gate measures narrative lines separately from index lines, because 139 of SKILL.md's lines are the discoverability tax for 86 bundled files and counting them against a prose budget would push the skill to drop files it needs. Conclusions restated beyond the benchmark matrix, the evidence record and the coverage statement are reported as notes. No measured content changed in this pass: every claim, strength label and negative result is where it was, and the two new references carry the moved text verbatim plus the corrections the benchmark pass produced.
This commit is contained in:
@@ -77,11 +77,9 @@ measurements.
|
||||
- Deciding **what the deliverable should be when an APK is not an option** — a repack refused by
|
||||
several independent checks is *blocked*, not expensive, and the fallback ladder is a system-level
|
||||
module, a local RPC service, or an honest report with a stated boundary.
|
||||
- Telling a **real memory dump from an extraction-shell skeleton** — and knowing that the
|
||||
trivial-body ratio is *bimodal rather than a threshold*: it reads ~100% for a bare `return-void`
|
||||
skeleton, but is blind to nop-cleared bodies, throw stubs and partial extraction, which are the
|
||||
shapes real shells actually use. Then knowing which recovery route applies, including the root-side
|
||||
dump for when `frida` itself is refused by the target.
|
||||
- Telling a **real memory dump from an extraction-shell skeleton**, and knowing which recovery route
|
||||
applies — including the root-side dump for when `frida` itself is refused. What the measurement can
|
||||
and cannot see is in `skills/apk-reverse/references/advanced-unpacking.md`.
|
||||
- **Calling a routine instead of reversing it** when reversing costs more than invoking: emulated
|
||||
execution on the host, or a live function service-ified over Frida RPC.
|
||||
- Reading **instruction-level execution evidence** when a native function has been flattened into a
|
||||
@@ -94,8 +92,7 @@ measurements.
|
||||
- Working **from the phone itself**: MT Manager's edit/repack/sign flow and its APK MCP surface,
|
||||
LSPosed Manager, and on-device data inspection, alongside the PC toolchain rather than instead of it.
|
||||
- Telling **Java2C apart from an extraction shell** before spending hours hunting a decrypted DEX that
|
||||
does not exist at any point in the process lifetime — the code was compiled into a `.so`, and the
|
||||
shapes are separated by a measured native-density difference of roughly 2000x, not by intuition.
|
||||
does not exist at any point in the process lifetime — the code was compiled into a `.so`.
|
||||
- Handling a build that arrives as a **split APK / App Bundle set**: reading the set off a device,
|
||||
signing every member with one keystore for `pm install-multiple`, or merging code/native members
|
||||
into a standalone APK when that is legal.
|
||||
@@ -426,14 +423,13 @@ provably out of reach, and **on-device tooling**. A **benchmark pass** then put
|
||||
targets under those routes (`tests/benchmark.md`): it added **Java2C discrimination** (the
|
||||
misdiagnosis that sends an agent hunting a decrypted DEX that never exists), **split APK /
|
||||
App Bundle handling**, **schema-free protobuf decoding**, a **Dex-VMP differential** harness,
|
||||
and **kernel-module templates with their version gates** — and it corrected two earlier
|
||||
claims, replacing the trivial-body *threshold* with a measured bimodal result and reopening
|
||||
a VMP verdict that a hand-written opcode table had got wrong. Unity/IL2CPP logic recovery,
|
||||
and **kernel-module templates with their version gates** — and it corrected two earlier claims
|
||||
whose measurements disagreed with them. Unity/IL2CPP logic recovery,
|
||||
React Native/Hermes bytecode internals, and defeating a server-side authority are **not**
|
||||
covered, and the skill is written to say so and stop rather than apply the nearest
|
||||
documented procedure to a target it was not written for.
|
||||
|
||||
Three qualifications that the Coverage section states in full and that belong here too:
|
||||
Four qualifications that the Coverage section states in full and that belong here too:
|
||||
|
||||
- **Flutter/Dart AOT analysis has a dependency.** The workflow begins at a pool listing
|
||||
(`pp.txt`-class output). Producing that needs a snapshot-decoding decompiler — aotopsy (a static
|
||||
@@ -454,16 +450,24 @@ Three qualifications that the Coverage section states in full and that belong he
|
||||
|
||||
## Repository maintenance
|
||||
|
||||
Three tools live at the root and are not part of the installed skill:
|
||||
Four tools live at the root and are not part of the installed skill:
|
||||
|
||||
```
|
||||
check_repo.py every skill discovered, frontmatter valid, scripts runnable,
|
||||
documented paths resolve, README paths explicit and existing
|
||||
check_refs.py every cross-reference that names a section of another
|
||||
document reaches a real heading in that document
|
||||
check_budget.py keep the always-loaded part from creeping: narrative lines in
|
||||
SKILL.md (index lines counted separately, because one line per
|
||||
bundled file is the price of discoverability), index-row length,
|
||||
and conclusions restated outside their legitimate homes
|
||||
build_scripts.py audit for machine-specific leftovers (absolute paths, credentials)
|
||||
```
|
||||
|
||||
Consistency has a natural counter-pressure -- a broken path fails loudly, and someone fixes it.
|
||||
Bloat has none, which is why the third tool exists: every pass adds a reference, an index row and
|
||||
a coverage claim, and without a measurement nothing in the repository notices.
|
||||
|
||||
`tests/benchmark.md` holds the **regression matrix**: dimension -> public target -> the scripts the
|
||||
row exercises -> measured result -> strength label. It is the checklist to re-run before trusting
|
||||
any claim under `docs/tool-verification/`. Samples are downloaded into `tools/_work/` and are never
|
||||
|
||||
Reference in New Issue
Block a user