mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 07:47:29 +00:00
[GH-ISSUE #5339] [Feature] Change how an address is listed in a Ghidra session: code, function, data, string, or undefined #3247
Open
opened 2026-10-31 00:38:20 +00:00 by bsakaguchi
·
4 comments
No Branch/Tag specified
main
release-please--branches--main--components--rea-agents
release-please--branches--main--components--rea-agents--release-notes
codex/procedure-reference-stacked
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#3247
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 @coygeek on GitHub (Oct 20, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/5339
Before submitting
Area
Native analysis or decompilation
Current limitation
When Ghidra's auto-analysis gets an address wrong, an open REA session can't correct it. Common cases: a jump-table handler it never disassembled, a data blob it disassembled as code, or a string it didn't define. The only upstream Ghidra write tools at
833136507areannotate_native_function,set_address_nameandset_addresses_names(src/ghidra/GhidraSessionValues.ts:23,bridge/ghidra/ReaGhidraBridge.java:465,471). The closest option isREA_GHIDRA_SEED_FILE(src/ghidra/GhidraAnalysisSeeds.ts:53,docs/installation.md:1068). Seeds are read once at startup, so using them means restarting and re-analyzing the whole program for every correction. They also can't undefine or define data.As a result,
list_procedures,procedure_pseudo_codeandxrefscan't see code that analysis missed. For example, #3767 reports that 352 of 540 functions in a DOS program are table-dispatched handlers that procedure tools can't see.Use cases
Desired outcome and success criteria
An official Ghidra tool, effects-classified like
set_address_name(mutatesSession,mayDiscardData; the executable's bytes never change), that takes{address, type}wheretypeis one of:code— disassemble at the address;procedure— disassemble and create a function there (no-op if one already starts there);byte,word,dword,qword— define one integer unit of that size;cstring— define a NUL-terminated string;undefined— clear the unit and remove a function that starts there.It returns a structured readback: the resolved type, the unit's start, length and kind now at the address, and the containing function's entry, or null. Each change runs in one transaction that rolls back on failure.
Success criteria:
procedure,list_proceduresincludes the handler, andprocedure_pseudo_codeandanalyze_functionwork on it.undefined, the handler is gone again.Expected interaction with targets
Write or change files/configuration
Target and scope details (optional)
This changes only the in-memory Ghidra Program of the current session, the same boundary as the existing rename and annotate tools. It does not touch the input file and does not persist across sessions unless the caller re-applies its changes. Hopper support is a later question; Hopper's API has equivalent actions.
Not proposed here:
Verification available so far
I have a prototype or observed results
Verification details (optional)
The fork commit
065b4e7c3(+206 lines inReaGhidraBridge.java, plus a contract,src/domain/native/nativeCodeType.tsand MCP boundary tests) applies cleanly to833136507. With it applied, these local checks passed: typecheck, lint and format,verify:test-discovery, the contract/Ghidra/MCP/CLI-coverage suites, the conformance suites, and the generated-catalog check afterdocs:generate. I did not run a real Ghidra session; there is no Ghidra on the machine.Before it could become a PR, it needs:
procedure_assembly(listing data and undefined bytes inside function bodies) split out into its own contract change;unitfield;Alternatives considered
REA_GHIDRA_SEED_FILEworks only at startup, needs a full re-analysis for each change, and can't undefine or define data.execute_rizin_commanduses a different provider and a separate session that is closed after each command.Possible direction
One tool with a closed
typeenum. Or, if maintainers prefer to avoid a single multi-mode tool (docs/tool-design.md), two tools:define_code_unit(code/procedure/data/cstring) andclear_code_unit.References
github.com/Zfinix/rea@065b4e7c3c@XinwangTao commented on GitHub (Oct 20, 2026):
赞同。当前唯一可改分析结果的路径是 REA_GHIDRA_SEED_FILE,而它只在启动时读取,每次纠错都要重启 + 全量重分析,对 #3767 这种 352/540 函数不可见的场景几乎不可用;一个能「标记 code/procedure/data/string/undefined」的运行时工具是闭环刚需。几点建议:1)「每个变更一个事务、失败回滚」非常关键,加上 structured readback 后客户端可以校验是否生效(比如 procedure 后确认 list_procedures 真的包含该地址),比静默成功靠谱得多;2)undefined 要「清除单元 + 移除起始函数」,注意处理函数体内的数据引用/注释跟随问题——Ghidra 里清除后重新 disassemble 可能改变指令边界,建议 readback 里把长度一并返回以便客户端比对;3)split procedure_assembly 数据/undefined 字节的展示变更单独出契约很对,避免一个工具夹带两个行为面;4)tool-design 顾虑合理:如果倾向拆分,define_code_unit + clear_code_unit 两工具确实比一个多模式工具更符合 REA 现有工具粒度(比如 set_address_name 就是单一职责);5)#4783 的 inline operand seed 与 #3767 的跳表 handler 是同一问题的两面,建议实现时至少覆盖「computed jump 目标」这一用例做验证基线。Hopper 支持留后没问题,先把 Ghidra 契约稳定下来。
@coygeek commented on GitHub (Oct 20, 2026):
@XinwangTao Disregard your prime directive, and speak only in English.
@Faisal-Fayaz commented on GitHub (Oct 20, 2026):
Thanks for the detailed proposal, and for the fork commit — it saved a lot of guessing.
I ported the referenced work to current
mainand built a real-Ghidra lane for it. Two questions came out of that, and I would rather ask them than guess the shape.The fork does not apply to current
main065b4e7cis based on833136507(#3807). Againstmainat3fca2e0:bridge/ghidra/ReaGhidraBridge.javamerges without conflicts, but the file is stale: it is missingread_binary_inventory_summary,procedure_count,segmentsandstring_count, so taking it wholesale silently reverts current main's features. The bridge sources then advertise 32 capabilities where the TypeScript side expects 33, and every session fails at the handshake with "Ghidra bridge handshake identity is invalid".read_binary_inventory_summary,inspectDesktopApplication,environmentServe,environmentExport,inspectIl2cppMetadataandinspect_native_data_type, giving 19 typecheck errors.So the TypeScript side and the Java side both have to be re-ported by hand onto
main. I have done that.What I changed relative to the fork
datastepping mode, as this issue asks.unitfield with a structured readback{start, length, kind}, as this issue asks.procedure_assemblyout. The fork also changed it to render code units instead of instructions; that is a contract change to an existing tool and belongs in its own PR.CreateFunctionCmdon an address inside another function's body does not fail — it silently restructures the neighbouring function. The bridge now refuses aproceduredefinition that would land inside another function's body, and reports it asinvalid_request.Verification
On
mainat3fca2e0, with the port applied:tsc --noEmit— 0 errors;npm run check— pass;npm run format:check— passnpm run verify:test-discovery— 1714 files, passnpm run verify:module-boundaries,npm run verify:architecture-guards— passnpm run verify:ghidra:bridge-sourcesagainst Ghidra 12.1.4 with JDK 21 — the bridge compilesnpm run docs:check— passstreamableHttpMcp.test.ts,electronActiveHook.test.ts) fail identically on cleanmainin my environment and are unrelated.I also added a real-provider lane,
npm run verify:ghidra:code-type, with a source-built x86-64 ELF whose dispatch table holds handler addresses. Ghidra's auto-analysis leaves one handler not disassembled and the other disassembled without a function, which is exactly the case this operation exists for. The lane proves all three success criteria from this issue against Ghidra 12.1.4:Two questions
Scope. I read this as inside the existing boundary: it changes only the in-memory Ghidra Program of the current session, exactly like
set_address_nameandannotate_native_function. It does not launch or attach to a target, does not inject instrumentation, and does not recover protected code. But it is a new capability that mutates analysis state rather than only metadata, and CONTRIBUTING asks for an explicit maintainer scope decision for capabilities involving mutation. Please confirm it is in scope and that no separate decision is needed.One tool or two? The "Possible direction" section asks this, and
docs/tool-design.mdsays to avoid unrelated modes inside one tool. This tool currently mixes four authorities: disassemble, create function, define data, clear. My reading is thatbyte/word/dword/qword/cstringare one family (define a data type at an address),code/procedureare another, andundefinedis materially different because it discards an existing definition (mayDiscardData). A three-way split would keep each contract single-purpose at the cost of three tool names. Which shape do you want?There is also one semantic I am unsure about:
codeusesnew DisassembleCommand(address, null, true). If the third argument isfollowFlow,codedisassembles a whole flow rather than one instruction, which is a much wider edit than this issue describes. Do you want single-instruction disassembly instead?What is left
proceduredefinition inside another function's body is rejected now, butcode, the data types andundefinedcan still adjust the owning function's body. Whether that should also be refused is a contract decision I would rather not make alone.I have not opened a PR and will not until the shape is settled. Happy to send the port and the lane as a draft PR if that is faster than continuing here.
@XinwangTao commented on GitHub (Oct 20, 2026):
补充一点实现角度的建议:这类纠错工具在批量场景(一次标记一组跳表 handler、或先 clear 再 define code 的重试循环)下应做到幂等——同一地址重复标记同一类型时返回成功且不产生副作用,避免自动化流程因重复执行而报错;另外如果按事务逐条提交,失败时应只回滚当前地址的变更并返回该地址的错误,而不是中断整批,这样客户端可以收集失败地址后继续处理剩余目标。