mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[PR #6278] [MERGED] feat(native): inspect PE and ELF export tables without an engine #7252
Closed
opened 2026-11-01 21:46:30 +00:00 by bsakaguchi
·
0 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#7252
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?
📋 Pull Request Information
Original PR: https://github.com/morluto/rea/pull/6278
Author: @kaoru0822-kitauji
Created: 10/22/2026
Status: ✅ Merged
Merged: 10/22/2026
Merged by: @kaoru0822-kitauji
Base:
main← Head:feat/4057-native-export-inventory📝 Commits (5)
2dee400feat(native): read PE and ELF export tables0c7e8a6feat(native): inspect native export tables through CLI and MCPacc2940docs(native): describe portable PE and ELF export inventories65a3128Merge origin/main into feat/4057-native-export-inventory8716138fix(native): bound export inventories and read header-backed PE tables📊 Changes
29 files changed (+2006 additions, -4 deletions)
View changed files
📝
.agents/skills/reverse-engineer-anything/SKILL.md(+2 -0)📝
.agents/skills/reverse-engineer-anything/references/native-and-artifacts.md(+10 -0)📝
docs/binary-diagnostics.md(+49 -0)📝
scripts/lib/catalog-builders.mjs(+7 -0)📝
src/application/CapabilityInventory.ts(+1 -1)📝
src/application/InvestigationProviders.ts(+7 -0)➕
src/application/binaryDiagnostics/NativeExportsPort.ts(+20 -0)➕
src/application/binaryDiagnostics/NativeExportsService.ts(+79 -0)📝
src/cli/binaryDiagnosticsCommands.ts(+33 -0)📝
src/cliCommandNames.ts(+1 -0)📝
src/composition/binaryDiagnostics.ts(+5 -0)📝
src/contracts/native/binaryDiagnosticsToolContracts.ts(+19 -0)📝
src/contracts/toolEffects.test.ts(+1 -0)📝
src/contracts/toolEffects.ts(+1 -0)➕
src/domain/native/nativeExports.ts(+128 -0)➕
src/native/exports/NativeExportParser.test.ts(+367 -0)➕
src/native/exports/NativeExportParser.ts(+502 -0)➕
src/native/exports/NativeExportsProvider.ts(+212 -0)📝
src/native/metadata/BinaryContainer.ts(+10 -0)📝
src/native/metadata/ElfImage.ts(+1 -1)...and 9 more files
📄 Description
Summary
Part of #4057, the producer half of the proposal posted on the issue. A follow-up after this merges will make
verify_managed_native_boundariesaccept this Evidence, which closes #4057. CI only runs on PRs that targetmain, so I didn't stack that half here, where it would get no CI.Problem and expected behavior
The analyst question is "which entry points does this native library export?", asked on any host and for any of a package's
runtimes/*/nativebuilds. The answer needs to be one call, no engine, and must not flatten format-specific distinctions.{name|null, ordinal, address|null, forwarder|null}, plus the export directory's DLL name, ordinal base and timestamp.name: null. Forwarders keep their"DLL.Func"text and have no address. Unused slots are not exports..dynsymsymbols with global, weak or GNU-unique binding and default or protected visibility.{name, value, size, type, binding, version}.versionisnull(unversioned),{index, name, hidden}from.gnu.version_d, or"unknown"when the version table can't be read. A hidden version is not the default thatdlsymselects.valueisst_valueas stored; on 32-bit ARM, bit 0 marks Thumb code.issues(one per unresolved version index), and coverage becomespartial.unsupported; enumerating symbols from the dynamic segment is not implemented.unsupported_targetthat points toinspect_macho.Change and scope
The change is three commits, one per layer:
read PE and ELF export tablesadds the parser on the sharedsrc/native/metadatacontainer layer.readPeImage(the owner of PE header parsing) now also exposes its data directories, rather than the parser reparsing the optional header. ELF reads the raw section directory forsh_link/sh_info/sh_entsize.inspect native export tables through CLI and MCPadds the provider, service, contract, CLI and MCP registration. It mirrorsinspect_pe_resources: one stable digest-checked read with a caller-selectedmax_file_bytes(default 256 MiB, max 512 MiB), and typed failures for malformed, unsupported, oversized, symlinked, missing and cancelled inputs.docs/binary-diagnostics.md, plus the authored skill and reference.The diff is about 1,790 lines. About 660 of those are tests and fixtures, and about 480 are the parser (after
oxfmt).Not included:
Remaining cleanup: the read-failure translation follows the same pattern Go, Rust and IL2CPP each duplicate. Extracting a shared helper would touch those providers, so I left it out of this PR.
Contract and boundary impact
Semantic owner and earliest changed stage:
src/native/metadata(PE data directories) and the newsrc/native/exportsreader.Contribution scope fit and linked maintainer decision: static read of a caller-selected file, the same authority as
inspect_pe_resources. The proposal is on #4057 and the direction was endorsed in the thread.CLI and MCP/tool-catalog contract: one new tool,
inspect_native_exports(kind: native-provider, effectsevidence, always available). No existing contract changes.Provider, bridge, target-format, or platform compatibility: portable. PE32/PE32+ and ELF32/64 in both byte orders.
Evidence, artifact, provenance, or reconstruction contract: observed Evidence with the subject
{path, sha256, format: pe|elf}.Generated metadata: the catalog builder maps the tool to its own provider identity (
rea-native-exports). Nothing generated is committed.Read existing files or captured data.
Evidence and regression coverage
src/native/exports/NativeExportParser.test.ts(13 tests), using synthetic PE32/PE32+ and ELF64-LE/ELF32-BE images. It covers:"unknown"); weak, IFUNC, object and protected rows; hidden, local, undefined andVER_NDX_LOCALexclusions; an unreadable name; no.dynsymversus no section headerstests/boundary/filesystem/nativeExports.test.tsruns the real provider over temp files. It checks Evidence binding for PE and ELF, plus typed symlink, malformed, missing, Mach-O, budget and cancellation failures.tests/boundary/mcp/binaryDiagnosticsMcp.test.tsruns the public MCP workflow: advertised schemas validate, a relative path is refused, and Evidence is recorded in the session.absoluteLocalPathSchema,localToolContracts.libgit2sharp.0.31.0.nupkg(02fbec03…c890) andlibgit2sharp.nativebinaries.2.0.323.nupkg(d2a16ac8…eeb1). Thelinux-x64.so(b1891c25…e020) andwin-x64.dll(44d849a1…ede5) match the issue.nm -D --defined-only(ELF, address and name) andllvm-objdump -p(PE, ordinal and name). All matched exactly on 9 libraries:linux-x64,linux-arm(Thumb bit cleared as nm does),linux-arm64,linux-musl-arm,linux-ppc64le,win-x64,win-x86andwin-arm64freeglut32.vc10.dllgit2-3f4182dP/Invokes:inspect-managed-native-boundaries LibGit2Sharp.dlllists 371 P/Invokes. All 369 that namegit2-3f4182dare present in both thelinux-x64ELF andwin-x64PE inventories. The other 2 targetlibdl/kernel32.Cost
Measured with
rea inspect-native-exports <lib> --format jsonon macOS arm64, 3 warm runs each:win-x64/git2-3f4182d.dlllinux-x64/libgit2-3f4182d.solinux-arm64/libgit2-3f4182d.soParsing alone takes 1–4 ms per library; the rest is CLI process start-up, which accounts for most of the RSS. For comparison, #4057 reports 88 s (ELF) and 146 s (PE) for a single
analyze_functionwith a fresh Ghidra import, and 369 of them are needed today. I did not rerun Ghidra; those numbers are quoted from the issue, not measured here.Remaining proof gaps:
Observed, derived, and inferred claims remain distinguishable.
Artifact identity, source provenance, and failed attempts remain preserved.
Unsupported, incomplete, unavailable, or uncertain outcomes remain visible.
Validation performed
npm run test:local -- src/native/exports/NativeExportParser.test.ts src/contracts/toolEffects.test.ts src/native/metadata/PeImage.test.ts: 24 passed.npm run test:focused -- tests/boundary/filesystem/nativeExports.test.ts tests/boundary/mcp/binaryDiagnosticsMcp.test.ts tests/boundary/mcp/absoluteLocalPathSchema.test.ts tests/acceptance/tools/localToolContracts.test.ts tests/boundary/mcp/toolSchemaValidity.test.ts tests/boundary/filesystem/peResources.test.ts: 31 passed, after rebasing ontoc8ed32853, which addedinspect_byte_entropyto the same files.Review follow-up (
871613860) fixes all seven Greptile findings:.gnu.versionkeeps exports as"unknown".dynsymwithout its null entry is rejectedThere are 5 new regression tests, and all 5 fail on the previous commit. After the follow-up: the parser suite passed 18 tests; the focused boundary, MCP and contract suites passed 31; the Go, Rust and IL2CPP container suites passed 24;
check:fast,format:checkanddocs:checkpassed; and the oracle still matches on 6 libgit2 libraries.npm run check:fast: passed.npm run format:check: passed.npm run docs:check: passed.npm run metadata:check: passed.Real-data oracle comparison and timing: see above.
Compatibility, safety, and release
Author readiness
Human owner: @kaoru0822-kitauji
Before merge
type(scope): outcome.🤖 Generated with Claude Code
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.