mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #8177] [Design] Investigate Kuna decompilation inside a Ghidra analysis session #6464
Open
opened 2026-11-01 21:11:20 +00:00 by bsakaguchi
·
2 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#6464
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 @morluto on GitHub (Oct 30, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/8177
Before submitting
Decision needed
Is an opt-in Ghidra analysis session using Kuna's Ghidra-protocol decompiler backend worth investigating as a distinct analysis profile, and what evidence and authority would be needed before any integration?
Context and evidence
The upstream Kuna 1.986 release ships an extension and
kuna_ghidrabackend built for Ghidra 12.1.2. Its README describes swapping Ghidra's decompiler process through a private, JVM-wide factory field; it states symbol/type resolution is incomplete and other Ghidra versions are unverified.On macOS arm64, I used Ghidra 12.1.4
analyzeHeadlesswith a self-owned Java post-script and a locally built Mach-O. The script opened a stockDecompInterface, decompiled two functions, closed it, switched that factory field in the temporary process to the extension's official 1.986 macOS backend, and opened a fresh interface. Both backends reported the two functions complete. The Kuna output identified itself as 1.986 and used Ghidra's struct type, field names, global and callee names; stock output also had those. The original file was not executed or modified, the import was discarded, and the script restored the factory field. The first script attempt failed to compile due to a mistaken result class name; the corrected attempt produced these results.This was not an REA provider test, an installed GUI plugin, or proof of compatibility on Ghidra 12.1.4 beyond these two functions. REA's current Kuna provider analyzes directly with the Kuna CLI; its Ghidra provider uses Ghidra's own decompiler. The hybrid could let an analyst use one program's analysis with a different engine, but correctness, high-p-code semantics, operation compatibility, and practical value remain unknown.
Expected interaction with targets
Read an explicitly selected local binary and invoke caller-supplied Ghidra and Kuna executables in an owned headless session. The experiment did not modify the executable or a user-owned project. Exact process, workspace, and analysis-state effects for an integration require review; there is no proposal to control a GUI or change a Ghidra installation.
Boundary details (optional)
Do not silently replace the Ghidra core or equate this hybrid with the independent Kuna provider. Bind both engine identities, versions, backend executable identity, selected target, applied analysis state, protocol compatibility and unknown coverage in the analysis profile and cache. The private static switch affects future decompiler spawns across the JVM, and already-open interfaces retain their process. REA's persistent interface, timeout recovery and decompiler-derived value flow must remain correct, or be reported unavailable. Windows P0 and applicable scope decisions still apply.
Options and tradeoffs
Compare a dedicated exploratory verifier and opt-in profile, direct use of upstream's headless recipe, or deferring until upstream's symbol scope and protocol mature. Do not turn upstream's GUI extension into an implicit dependency; choose an analyst-visible operation and evidence semantics before designing controls.
Verification available so far
I have a prototype or observed results
Success criteria and open questions
Evaluate representative stripped and typed binaries, functions that use globals/calls/complex types, failures and provider timeouts, fresh process restart, cancellation and cleanup. Compare pseudocode, p-code/dossier facets and honest partial-coverage reporting against independent provider evidence, without treating textual agreement as semantic proof. Verify exact Ghidra/Kuna pairs and supported hosts before making any supported-release claim.
References
Kuna 1.986 release: https://github.com/Noelo-Lab/kuna/releases/tag/v1.986
Ghidra integration documentation: https://github.com/Noelo-Lab/kuna/blob/v1.986/docs/ghidra-integration.md
Related type-hypothesis discussion: https://github.com/morluto/rea/issues/8166
A follow-up in the same headless setup inspected
HighFunctionp-code: foradjust, both backends returned four operations including one return; forevaluate, stock returned 14 operations and Kuna 15, each including one call, two loads and one return. This confirms those facets were present on the fixture, not that operations, def-use graphs, semantics, or REA's dossier projections are equivalent.Upstream documentation correction
The extension zip's README describes Phase 2 and missing global/type resolution, but the v1.986 integration guide says Phase 3 lazy symbol/type providers and Phase 4 output work have shipped, with specific remaining gaps (including function-definition type prototypes and some injection handling). The release docs therefore disagree; do not treat the extension README's Phase 2 status as a current exhaustive capability statement. The two-function observation above independently confirms named fields and globals on that fixture, but does not verify the upstream claims at scale. The guide describes callbacks into Ghidra and cache flushing after each function; any REA design must verify those semantics with the exact version rather than assuming direct CLI behavior.
Released Kuna 1.989 headless backend control
Using the macOS arm64
kuna_ghidrabinary from the official v1.989 extension release, I reran a disposable Ghidra 12.1.4analyzeHeadlessimport of an owned arm64 Mach-O. A test-only Java script opened a stockDecompInterface, decompiledaudit_leafandaudit_caller, disposed it, temporarily changedDecompileProcessFactory.exepathin that headless JVM, then opened a fresh interface using the Kuna backend and restored the prior field afterward. Both backends reported both functions complete. Kuna's text identified version 1.989 and retained the namedaudit_globalandaudit_leafcall in these outputs. Ghidra emitted DWARF import errors for some frame/register expressions, so this is not a clean full-debug-information test. The target was not executed, its SHA-256510a23fc3c152175b9977130b3b1711d580e47d22a085cdee6a4e0c9dea2c51astayed unchanged, and the temporary imported project was deleted.The release labels the extension for Ghidra 12.1.2 and says other 12.x versions have unverified compatibility. This is a direct backend control on two functions, not installation of the GUI extension, an REA provider integration, semantic equivalence, high-p-code validation, timeout recovery, or a general 12.1.4 compatibility claim. The v1.989 integration guide describes the child-process protocol; any future REA work still needs explicit dual-engine identity, cancellation/restart, and project-state semantics.
High-p-code and existing REA workflow control on 1.989
On the same unexecuted Mach-O, a fresh disposable Ghidra 12.1.4 headless import with the released Kuna 1.989 backend returned a non-null
HighFunctionfor each function. The stock and Kuna backends each exposedCOPY=2, INT_ADD=1, RETURN=1for_audit_leaf, andCALL=1, COPY=1, INT_ADD=1, RETURN=1for_audit_caller. The Ghidra import again reported unrecoverable DWARF frame/register expressions. Equal opcode counts do not establish equal operations, varnodes, def-use, calling conventions, or semantic results; these are two small sampled functions.Separately, real one-shot REA
trace-native-values _audit_calleron the same file using Ghidra 12.1.4 returned a two-procedure graph with 10 nodes, 10 edges, no reported unknowns andtruncated: false. REA's independent Kuna 1.989 provider returned no graph nodes or edges and explicitly reportedProvider has no native def-use model. These are different provider workflows: this test did not connect the hybrid HighFunction to REA, and no runtime execution or general graph completeness is implied. The target SHA-256 remained510a23fc3c152175b9977130b3b1711d580e47d22a085cdee6a4e0c9dea2c51a. This is an analyst-facing reason to evaluate whether a separately identified hybrid value-flow operation is useful, not a reason to silently claim that the existing Kuna provider supplies Ghidra's def-use semantics.Typed dSYM control and input identity
A separate unexecuted arm64 Mach-O used
struct Sample { int count; int scale; }and a function computingr->count * r->scale + audit_bias. With its compiler-produced dSYM adjacent, Ghidra 12.1.4 headless imported three DWARF types; both its stock decompiler and Kuna 1.989 backend producedSample *and the namedcountandscalefields. Ghidra also reported unrecoverable frame/register DWARF expressions. REA's independent Ghidra and Kuna providers on the same target returned integer-pointer pseudocode without those field names.To distinguish engine behavior from selected input, I copied the executable unchanged into a separate directory without its dSYM and reimported it into a fresh disposable headless project. Both direct Ghidra decompilers then produced integer-pointer pseudocode without those field names, matching the REA result at that level. Both executable copies had SHA-256
c244f7d7d9fa9b7f4cfcb1f69d69cc1f83ad98fe38b0293b223b3ca7d9076363; neither ran. The first headless no-sidecar script used only the DWARF-derived unprefixed function name and failed to locate it; the corrected script also accepted the Mach-O_audit_recordsymbol.This supports an input-selection explanation for this fixture, not a general engine quality comparison. #1193 separately tracks explicit matching dSYM selection and its provenance. Any hybrid design must bind the chosen debug companion and analysis state as well as both engine identities; automatically using ambient neighboring debug files would change the analyzed inputs. No REA hybrid integration was tested.
@morluto commented on GitHub (Oct 30, 2026):
A related direct-CLI comparison on the owned arm64
_evaluatefixture: Kuna 1.986decompile --raw --regionsprinted pseudocode followed by p-code-like block/operation text and a nested region report. It rejected either--raw --jsonor--regions --jsonon the tested release. In a real REA/Ghidra MCP session,trace_native_valuesfor the same function returned 19 structured nodes and 17 edges under the chosen limits, including one argument binding and one return binding; REA/Kuna returned no nodes with an explicitProvider has no native def-use modelunknown.This is a potential analyst question—recovering value dependencies—not evidence that the textual upstream output has stable, complete or equivalent semantics. It does not justify parsing console lines as interchangeable with Ghidra HighFunction, or prove that the hybrid backend yields correct REA value traces. If a structured source or hybrid is evaluated, require operation/variable identity, block membership, deadness, call/argument binding, coverage and timeout/cleanup checks for exact version pairs.
@morluto commented on GitHub (Oct 31, 2026):
Looping in @gensokyo-dev @kaoru0822-kitauji @N0zoM1z0 for visibility on the Ghidra, Kuna, and REA tool-design investigation.