mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #717] [Feature] Integrate APK analysis tools into REA: research and roadmap #317
Open
opened 2026-10-15 18:23:49 +00:00 by bsakaguchi
·
3 comments
No Branch/Tag specified
main
codex/procedure-reference-stacked
release-please--branches--main--components--rea-agents
release-please--branches--main--components--rea-agents--release-notes
codex/kuna-independent-retry
codex/byte-search-overlay-coverage
codex/open-failure-target-receipt
codex/kuna-xref-evidence
codex/ghidra-ambiguous-procedure-recovery
codex/function-source-bundle
codex/trace-function-integration-prototype
codex/snapshot-source-closure
codex/recorded-evidence-array-pages
codex/evidence-recovery-redesign
codex/trace-feature-address-scope
codex/call-discovery-scope
codex/ghidra-literal-candidate-evidence
codex/decompile-directory-independent-retry
codex/retry-provenance-base
codex/value-flow-capability-experiment
codex/ghidra-containing-instruction
cursor/readme-discord-button-ef9f
dependabot/github_actions/actions/setup-node-7.1.0
dependabot/github_actions/actions/upload-artifact-7.0.2
dependabot/npm_and_yarn/npm-minor-and-patch-d8d97ce6df
codex/kuna-1989
fix/8559-native-ui-fixture-ownership
fix/8555-go-verifier-mcp-ownership
codex/provider-capability-recovery
fix/8642-rizin-target-stdin
codex/ghidra-memory-effect-scope
codex/ghidra-annotation-entry-selector
codex/ghidra-readonly-recovery
codex/ghidra-regex-verifier-recovery
codex/evidence-discovery-view-guidance
fix/8545-bulk-append-overflow
fix/8428-navigation-refusal-alternatives
codex/address-context-recovery
codex/matching-member-limitations
codex/unknown-scope-contract
codex/evidence-view-guidance
feat/8373-native-trace-views
codex/ghidra-snapshot-verifier-binding
codex/elf-export-visibility
codex/evidence-view-recovery
codex/native-reference-cli-help
codex/provider-candidate-observation-scope
codex/kuna-session-verification
codex/ghidra-switch-lifetime-guidance
codex/pseudocode-paging-discovery
codex/clarify-evidence-view-support
codex/kuna-xrefs-selector-recovery
codex/context-capacity-recovery
codex/evidence-closure-large-links
codex/same-function-evidence-identity
codex/ghidra-verifier-inspected-jdk
codex/audit-guided-workflows
codex/crash-prompt-retained-dossiers
codex/analysis-view-error-recovery
codex/kuna-verifier-target-selection
codex/ghidra-selected-project-call-coverage
codex/docs-native-analysis-scope
codex/ghidra-java-socket-boundary
codex/ghidra-retained-snapshot-verifier
codex/ghidra-search-inventory-facts
fix/8284-zero-argument-parameter-bindings
fix/8198-ui-action-handler-offset
fix/8257-elf-entry-label-identity
fix/8304-deferred-output-schema-projection
fix/8277-call-path-computed-target-uncertainty
fix/pr-8089-conflicts
fix/ci-static-duplicate-export
dependabot/npm_and_yarn/lint-staged-17.6.0
dependabot/github_actions/actions/download-artifact-8.0.2
dependabot/npm_and_yarn/write-file-atomic-8.0.0
dependabot/npm_and_yarn/canonicalize-5.1.0
dependabot/github_actions/actions/cache/restore-6.1.0
dependabot/npm_and_yarn/toon-format/toon-4.4.0
dependabot/github_actions/actions/deploy-pages-5.0.1
codex/review-fixes-pr-2403
codex/review-fixes-pr-2400
codex/process-terminal-width
codex/test-brittleness-cleanup
verify/7167-browser-connect-macos
fix/7167-browser-connect
feat/native-matching-allowance-setting
feat/browser-scenario-dry-run
test/managed-caller-parameters-20261024
codex/parser-fortythird-boundaries
fix/6926-pinvoke-platform-decorations-20261023
fix/6889-har-body-encoding-20261023
fix/6888-sqlite-schema-budget-20261023
fix/dependency-security-gates-6708
cursor/evidence-overwrite-rebase-b4ac
feat/4057-verify-native-exports
fix/windows-acl-observer-overhead-20261022
cursor/erlang-beam-restack-4476
cursor/pe-certificate-review-bf32
fix/6116-javascript-application-fs-errors
fix/6061-unmapped-runtime-script-unknown
feat/browser-scenario-summary
fix/pe-certificates
codex/verify-3407
cursor/rebase-5699
cursor/rebase-5352
cursor/rebase-5600
cursor/fix-cli-schema-omission-10a8
codex/audit-hopper-shutdown-reasons-20261021
fix/demangle-swift-omitted-record
fix/nib-boolean-value-types
cursor/cancellation-partial-observation-a5ac
fix/ib-object-limit-reasons
fix/electron-fuse-limit-advice
fix/kuna-doctor-dangling-cache
fix/fixed-budget-refusal-advice
fix/js-ipc-listener-dedup
fix/js-return-member-provenance
fix/dmg-integrity-retry-advice
fix/ida-doctor-readiness
fix/kuna-version-probe-output-drain
fix/legacy-swift-runtime-name-matching
fix/dylib-lazy-load-commands
fix/browser-scenario-startup-cancel
fix/swift-nested-punycode-classification
fix/compare-unselected-scopes
fix/objc-method-budget-coverage
fix/dmg-mounted-root-observations
audit/ci-tests-20261019-round2
release/6.7.0
fix/wabt-cleanup-retry-resolution
fix/electron-fuse-elf-pe-architecture
fix/native-plist-descriptor-ownership
fix/kuna-caller-cleanup-ownership
experiment/atomic-codemode-20261016
review/first-contributor-3776
fix/call-resolution-full-read-cycles
fix/member-mutation-selection-repeat
experiment/atomic-re-tools-20261015
perf/member-mutation-lazy-origins
perf/static-network-mutation-index
fix/hopper-startup-lifecycle
audit/3050-windows-proof-20261015
feat/windows-window-capture-2183
audit/3049-windows-proof-20261015
audit/3735-macos-fixtures-20261015
fix/batch-decompile-null-pseudocode
fix/kuna-inventory-honors-jobs
experiment/browser-codemode-tool-design-20261015
fix/hopper-clean-runtime-argv
codex/review-2049-27f1b367
review-fixes/pr-2787-routing
fix/3360-scoped-this-emitters
fix/3367-replaced-global-effects
fix/3838-compact-any-value-items
test/hopper-download-probe-20261015
codex/windows-runtime-creation-red-green-20261015
codex/windows-readonly-root-red-green-20261015
codex/windows-root-share-red-green-20261015
codex/exp-1685-win-mcp-startup
codex/bug-sweep-20261015
investigate/2190-windows-package-phases
investigate/3543-macos-cli-deadline
perf/3281-reverse-tools-feedback-quality
fix/3406-hopper-doctor-fixture
fix/3341-wrapper-require-test-context
fix/3301-owned-uninstall-fixtures
fix/3164-compiler-input-ownership
fix/pcap-cleanup-stdout-newline-20261014
perf/interface-builder-summary
codex/review-fixes-pr-1977
fix/ghidra-effective-jvm-platform
fix/docs-turkish-rust-link-20261013
fix/main-maintenance-ci-20261010
fix/recover-binary-session-process-effects
codex/review-fixes-pr-2457
codex/ci-required-cancellation-gate
fix/main-format-baseline-20261013
fix/setup-preserve-entry-fields
cursor/restore-main-checks-1ffc
fix/ghidra-bridge-hashmap-import
codex/shared-ci-jadx-json-default-20261013
codex/shared-ci-ghidra-test-groups-20261013
codex/shared-ci-java-fixture-format-20261013
codex/fix-intrinsic-invocation-boundaries
test/release-preflight-reusable-jobs
test/js-parameter-provenance-expectation
fix/linux-hopper-verification-current
test/2419-ghidra-elf-probe-size
followup/pr-1544-native-ida
codex/fold-pr-2230-contribution
docs/readme-responsible-use
fix/issue-2064
fix/issue-2050
fix/issue-2053
fix/issue-1968
fix/issue-1945
experiment/codemode-bridge-20261011
fix/tool-effects-negative-wording-1904-20261012
fix/1842-electron-interop-provenance
feat/recover-javascript-multi-input
refactor/website-i18n-prep
fix/nativeaot-pe-virtual-extent
fix/browser-verifier-ci-hang
fix/pe-resources-input-selection
docs/beginner-friendly-guides
docs/beginner-setup-guide
fix/javascript-analysis-worker-1563
fix/1649-ghidra-duplicate-names
fix/javascript-export-keys-integration-1369
test/maintenance-boundary-contracts-20261011
review/javascript-export-keys-1369
review/process-live-progress-1483
test/javascript-1495-growth-ratio
fix/ci-escape-timing
docs/normalized-terminal-geometry-1450
release/6.3.0
archive/release-6.3.0-pr1381
release/6.2.0
fix/electron-preload-dynamic-override
fix/javascript-self-referential-bundler-edges
release/6.1.0
cursor/grok-client-cherry-pick-0b56
feat/signature-posture
feat/dyld-shared-cache
feat/artifact-integrity-policy
feat/pkg-inventory
release/6.0.0
chore/sync-release-5.0.0
release/5.0.0
cursor/cloud-agent-node-787e
fix/javascript-xhr-open-endpoints
review/pr-711-realpath-fallback-wording
cleanup/replay-confinement
codex/test-suite-performance
codex/issue-foundations
codex/address-open-issues-2026-07-20
agent/javascript-vite-rollup-esbuild-adapters
agent/process-cleanup
agent/triage-integration
agent/unknown-commands-registry
feat/mcp-identity-metadata
morlvps/issue_cleanup
codex/installer-redesign
morl/roadmap-investigation-core
morl/roadmap-investigation-docs
release-please--branches--main--components--rea
rea-agents-6.8.0
rea-agents-6.7.0
rea-agents-6.6.0
experiment/atomic-codemode-wait-runtime-20261016
rea-agents-6.5.0
rea-agents-6.4.0
rea-agents-6.3.0
rea-agents-6.2.0
rea-agents-6.1.0
rea-agents-6.0.0
rea-agents-5.0.0
rea-agents-4.1.0
rea-agents-4.0.1
rea-agents-4.0.0
rea-agents-3.2.1
rea-agents-3.2.0
rea-agents-3.1.0
rea-agents-3.0.0
rea-agents-2.7.0
rea-agents-2.6.0
rea-agents-2.5.1
rea-agents-2.5.0
rea-agents-2.4.0
rea-agents-2.3.0
rea-agents-2.2.0
rea-agents-2.1.0
rea-agents-2.0.0
rea-agents-1.7.0
rea-agents-1.6.0
rea-agents-1.5.0
rea-agents-1.4.0
rea-agents-1.3.0
rea-agents-1.2.0
rea-agents-1.1.0
rea-agents-1.0.0
rea-agents-0.5.0
rea-agents-0.4.0
rea-agents-0.3.0
rea-0.2.1
rea-0.2.0
Labels
Clear labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
Mirrored from GitHub Pull Request
question
roadmap
triage
No labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
question
roadmap
triage
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
morluto/rea#317
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @N0zoM1z0 on GitHub (Oct 6, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/717
Goal
Extend REA's positioning — One MCP for reverse engineering across binaries, applications, and runtime behavior — to Android applications by integrating established tools and returning evidence that agents can use directly.
This issue records the research and a staged roadmap. REA should own target identity, thin adapters, normalized results, and lifecycle management. Mature upstream tools should provide decompilation, resource decoding, signing, and instrumentation.
Related roadmap: #32.
Current baseline
Research snapshot: 2026-10-06, REA main
af48fe879161..sofiles should reuse existing native analysis/Ghidra.Relevant sources: target resolver, ZIP reader.
Recommended integrations
Research observed JADX
v1.5.6, Apktoolv3.0.3, and Androguardv4.1.4as GitHub latest releases. Androguard's v5 default branch is a different architecture and must not be advertised as stable-package coverage. Bind adapters to actual installed versions and representative producer data. JADX JSON output is not automatically a complete inventory/xref protocol.Existing MCP implementations worth studying
MaxRAMPercentage=60; response truncation happens after class materialization. Verify actual cancellation before adopting its timeout behavior.Choose between a reusable headless provider and a small jadx-core bridge through a focused experiment. Avoid rewriting the engine or copying an entire upstream MCP catalog into REA.
Staged work
Result and operational requirements
NOASSERTIONis not an absence of licensing.Acceptance for the initial milestones
Research status: official documentation, selected upstream source, version/license metadata reviewed; tools and APK workflows have not yet been executed. Implement in small independently useful PRs.
@JackLee992 commented on GitHub (Oct 9, 2026):
I'd like to pick up the two parts of the First milestone that need no SDK installation and can be verified deterministically on the host, since they give the later JADX/apksigner lanes their Android semantics: native ABI inventory and APK signature-scheme evidence. Both stay execution-free and reuse the existing ZIP/inventory pipeline, as the issue asks.
Slice 1 — native ABI inventory (pure projection; no new IO or interface change). Today
projectAndroidApplication(src/domain/android/androidApplication.ts) classifieslib/<abi>/<name>.sointo a flatcomponents.native_librarieslist, but the<abi>path segment is never captured, so there is no per-ABI inventory. I'd add a structurednative_abi_inventory: the set of ABIs present (normalized toarmeabi-v7a,arm64-v8a,x86,x86_64,riscv64; unrecognizedlib/<dir>entries reported explicitly rather than guessed), the libraries under each ABI with their digests, and path-level cross-ABI presence differences, plus a limitation that ABI is read from the ZIP path and is not yet confirmed from ELF machine/flags (that confirmation belongs to the native provider). Deterministic projection tests via source-built inventory fixtures only — no private APKs.Slice 2 — APK Signing Block v2/v3 evidence (needs a small reader capability). The current
signingcomponents only cover v1 JAR files underMETA-INF/. The v2/v3 APK Signing Block sits just before the central directory and is not a ZIP entry, so it is currently invisible.ZipArtifactReaderalready has a bounded random byte read internally (NodeFileReader.readUint8Array(index, length)), but theArtifactReaderinterface exposes onlyentries/open. I'd parse EOCD → central-directory offset → signing block (magic, size, pair IDs0x7109871av2 /0xf05368c0v3 /0x1b93ad61v3.1) and report which schemes are present, their byte ranges, and truncated/modified structure, covered by source-built fixtures. This layer reports structural evidence only — no cryptographic verification, certificate chain, or trust decision; actual verification stays with a bring-your-own apksigner lane ("report the schemes and bytes actually verified"; certificate subjects do not establish trusted developer identity).Questions before I start:
native_abi_inventorylive undercomponentsor as a top-level projection field?readRange(offset, length)onArtifactReader, or a narrow ZIP/APK-specific tail (signing-block) reader? Any hard length cap you'd mandate?riscv64now, and how should non-standardlib/<dir>directories be surfaced?I'll keep both as small independently useful PRs with source-built fixtures, explicit unknowns/limitations, no auto-installed SDK/JDK, and no private binaries. Happy to open focused implementation issues for the two slices if you'd rather track them that way.
@Han-Shen-math commented on GitHub (Oct 13, 2026):
I'd like to contribute a focused first slice of the resource/smali edits and rebuild follow-up in this roadmap: resource and manifest edits for a single APK, producing a new artifact while preserving the source. Smali/code editing would remain a separate follow-up.
The current Apktool operation is intentionally inspection-only (
d --no-src) and removes its decoded workspace. I propose keeping that contract unchanged and adding a separate, explicitly mutating edit/rebuild workflow after scope agreement. Inputs would include the selected APK and explicit edits with expected previous values; output evidence would identify the source/result digests, exact edits, provider/version/options, validation results, and remaining unknowns.I have prepared a small local, unregistered fixture-only prototype, without changing production
src, CLI/MCP registration, or the package allowlist. On macOS arm64 with Apktool 3.0.3 it passed baseline build → decode → string/manifest-metadata edits → rebuild. AAPT2 read back both changes, original APK and fixture hashes stayed unchanged, the preserved asset digest matched, and workspace cleanup completed. Three boundary tests cover refusing arbitrary APK/raw-flag inputs, preserving existing output, and cancelling a simulated builder.These results are deliberately limited: the fixture has no executable code; AAPT2 comes from the same toolchain; no APK was signed, installed, or run; no cryptographic signature verification or real companion-app compatibility was established. The prototype is not a general APK editor or production lifecycle implementation.
For the first integration I propose caller-supplied tools, owned workspaces/framework caches, new-output-only publication, and reuse of REA's existing process, immutable-input and safe-output primitives. It would execute local build tools and write copied/new files, with no signing, device operations, raw-command passthrough, or protection/integrity bypass. Splits/AABs and code editing are out of this initial scope. Code-bearing inputs would require additional fixtures proving preservation of unedited DEX, native libraries and assets.
Before substantial implementation intended for integration, could a maintainer confirm whether this scope fits #717, whether edits/build should be one bounded operation or an explicitly owned persistent workspace, and what minimum signature-state and real-provider checks the first PR should require? I can share the small experiment as a draft PR to support that decision.
@arielfikru commented on GitHub (Oct 21, 2026):
Real-lane data point for the Android/JADX lane: a ProGuard-obfuscated, pure-Java game APK on macOS.
Setup: macOS (Darwin 25.6.0), Node 24.18.0, OpenJDK 21.0.12.1, REA from upstream main, jadx-headless-mcp 0.7.1 JAR (pinned SHA-256 verified). APK: a small commercial Java game (v1.0.9, ProGuard names, single dex).
Problem it solved: the JADX text of class
b.a.fhas two overloads,a(int, int)(integer power) anda(long, long)(percent). JADX prints call sites asb.a.f.a(x, y)with int arguments and hides theint-to-longwidening. Reading the Java alone, the call looks like the power overload. We had this marked as unresolved for days while porting the game logic.What I ran:
inspect-android-class b.a.f,trace-android-references b.a.f awithoverload_index1 and 6, andinspect-android-methodon the two disputed callers. Every call exited 0 and took about 4-5 s.Result:
inspect-android-classlistsdex_descriptorper overload ((II)I= overload 1,(JJ)I= overload 6). The reference trace per overload shows both disputed callers under(JJ)I, so they call the percent overload. Across the dex,(JJ)Ihas 52 invoke sites in 42 methods and(II)Ihas 2 sites in 1 class. An independent DEX scan (a small stdlib parser overclasses.dex) matched REA exactly. It showedint-to-longon both arguments right before eachinvoke-static.So
dex_descriptor+overload_indexresolved an ambiguity that the plain JADX text hides. That is a good argument for keeping descriptors first-class in the lane.Gaps hit:
inspect-android-methodreturns smali only as a fallback when there is no Java body. With a Java body, the widening (the actual evidence) is not visible through REA. An opt-ininclude_smali(or a bytecode view of a call site) would close that.totalin the trace counts calling methods (42), not invoke records (52). It is documented in docs/android-analysis.md, but easy to misread when counting call sites.