mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[PR #4285] feat(native): decode Delphi/C++Builder TPF0 form payloads in PE resources #6157
Open
opened 2026-10-31 01:12:18 +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#6157
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/4285
Author: @Henglie
Created: 10/15/2026
Status: 🔄 Open
Base:
main← Head:feat/delphi-tpf0-forms📝 Commits (9)
73996a6feat(native): decode Delphi/C++Builder TPF0 form payloads in PE resourcesa8afb88fix(native): bound Delphi form decoding and report its real limitsec63efdfix(contracts): advertise the recursive form projections nonrecursively1ba5decfix(native): keep form fields discoverable and decode gaps explicit23c156bMerge remote-tracking branch 'origin/main' into feat/delphi-tpf0-forms9acd7c9Merge remote-tracking branch 'upstream/main' into feat/delphi-tpf0-forms7d4d724fix(native): keep partial collections and advertised child fields7cc298dfix(native): bound form recursion and keep partial decode evidence2ac1a91test(native): validate a decoded Delphi form against the SDK-converted schema📊 Changes
12 files changed (+2792 additions, -41 deletions)
View changed files
📝
docs/binary-diagnostics.md(+16 -1)📝
src/application/binaryDiagnostics/PeResourcesService.test.ts(+125 -0)📝
src/application/binaryDiagnostics/PeResourcesService.ts(+138 -38)📝
src/contracts/native/binaryDiagnosticsToolContracts.ts(+1 -1)➕
src/domain/native/delphiForm.test.ts(+124 -0)➕
src/domain/native/delphiForm.ts(+356 -0)📝
src/domain/native/peResources.ts(+2 -0)➕
src/native/pe/DelphiForm.fixture.ts(+156 -0)➕
src/native/pe/DelphiFormStream.test.ts(+766 -0)➕
src/native/pe/DelphiFormStream.ts(+932 -0)📝
src/native/pe/PeResourceParser.test.ts(+98 -0)📝
src/native/pe/PeResourceParser.ts(+78 -1)📄 Description
Summary
inspect_pe_resourcesreturned a complete PE32/PE32+ resource inventory anddecoded
RT_GROUP_ICON, but every other payload stayed an opaque byte rangewith a hash. Delphi/C++Builder VCL forms (
TPF0RCDATA) were thereforeunreadable without an external tool, which is what #2810 asks for.
This adds a static, provider-free decoder for the Object Pascal filer stream
over the resource payload that
inspect_pe_resourceshas already located,reported as a new
delphi_formsarray next toicon_groups.Refs #2810.
Problem and expected behavior
For a Delphi target, each form lives in an
RT_RCDATAresource whose payloadstarts with the filer signature
TPF0(orTPF1) followed by a component tree:class name, component name, filer flags, properties with declared value types,
and nested components. Before this change the tool reported the payload's RVA,
file range and SHA-256 and nothing else, and the first
limitationsentry saidpayloads other than
RT_GROUP_ICONremain opaque.After the change a caller gets the decoded component tree with byte offsets back
into the payload for every object, property and value, with the original value
bytes retained next to each decode.
Change and scope
src/native/pe/DelphiFormStream.ts(new): boundedTPF0reader. Signaturedetection within a 16-byte window (bytes before the signature are kept
verbatim, not interpreted),
BeginComponentfiler flags with child position,ReadStrshort strings, and theTValueTypepayloads fromclassesh.inc/reader.inc:vaInt8/16/32/64,vaQWord,vaSingle,vaDouble,vaExtended(ten-byte x87 reduced to a double, with theprecision loss stated),
vaCurrency,vaDate,vaString,vaIdent,vaLString,vaUTF8String,vaWString,vaUString,vaBinary,vaList,vaSetandvaCollection.src/domain/native/delphiForm.ts(new): the result types and their zodschemas, recursive through
z.lazy.src/domain/native/peResources.ts:delphi_formsadded to the schema.src/native/pe/PeResourceParser.ts:readDelphiForms(), shaped afterreadIconGroups()— same 8 MiB metadata accounting (ensureCapacitybeforeallocating,
accountper form), same synchronous pass over resources withtype id 10. The first
limitationsentry is updated and the decoder's ownlimitations are reported with it.
src/contracts/native/binaryDiagnosticsToolContracts.tsanddocs/binary-diagnostics.md: tool description and owning doc updated.Intentionally not included: no text projection equivalent to
ObjectBinaryToText, noinspect_delphi_formsoperation, no class semantics orevent-handler binding, and no runtime or provider involvement. The decoder reads
bytes already located by the resource inventory and never executes or mutates
anything, so it stays inside the documented "format inspection" boundary.
Scope question for maintainers: #2810 offers (A) decoding RCDATA payloads inside
inspect_pe_resourcesand (B) a separate operation. This implements (A) becauseit matches how
icon_groupsalready decodes one resource type's payload. If (B)is preferred, the decoder and its tests move unchanged; only the wiring and the
contract change.
Contract and boundary impact
inspect_pe_resources; the changestarts at payload decoding, after the resource tree is complete.
inspection; scope decision requested in #2810 and left pending in this draft.
peResourcesSchemagains adelphi_formsarray. It is additive, always present, and empty when the imagehas no payload with a filer signature, so existing callers parsing a
strictObjectcontinue to validate. The tooldescriptionis updated; noinput contract, tool name, or effect metadata changes.
portable; no Ghidra, Windows SDK, or engine installation.
object, property and value carries
{offset, bytes}into the resource payload,and the payload SHA-256 is already reported per resource, so a decoded claim
can be traced to bytes and their hash.
applicable; no process, no instrumentation, no writes.
skills/changes, so the generatedcatalogs are unaffected;
docs/binary-diagnostics.mdis the owning authoreddoc and is updated.
Expected effects:
Evidence and regression coverage
tests), src/native/pe/PeResourceParser.test.ts (+3 tests, 24 to 27) and
src/application/binaryDiagnostics/PeResourcesService.test.ts (one rejection
case for a value range outside the payload).
TPF0bytes written from the filer layout insrc/native/pe/DelphiForm.fixture.ts, independent of the decoder, so adecoder regression cannot hide behind the fixture. Coverage includes each
value type, nested components, filer flags with child position, cp1252 and
cp1251 decodes with raw bytes retained, hex capping, and the failure surface:
unsupported value type, truncated payload, payload ending mid-value, and a
child position that is not an integer value type.
signature_location.offsetequals the payload offset,root.location.offsetequals payload offset + 4, the declared code page is used when the resource
declares one (
code_page_source: "resource") and recorded as a default when itdoes not (
"default"), and non-form RCDATA payloads are left out. The resultis parsed with
peResourcesSchema.parse, so the schema and the decoder arechecked against each other rather than only in isolation.
delphi_formsabsent and the limitation "payloads other than RT_GROUP_ICONremain opaque"; the new tests fail there with a missing field rather than a
wrong value.
public sample from #2810 is on FTP, so coverage uses self-owned synthetic
payloads. The acceptance suite through the compiled CLI and stdio MCP was not
run in this environment (see Validation performed).
For evidence-bearing changes:
Validation performed
npm run test:local -- src/native/pe/DelphiFormStream.test.ts src/application/binaryDiagnostics/PeResourcesService.test.ts-> 68 passed.npm run lint-> no errors (existing function-length and complexity warnings remain inreadValue/readObject).npm run typecheck-> no errors in the changed files. Unrelated pre-existing errors remain in browser test fixtures in this environment.npx oxfmtwas applied by the pre-commit hook;git diff --checkis clean.PeResourceParser.test.ts27 passed.Not run, and not claimed as passing:
npm run check:fast(itsdeps:checkpre-step fails in this environment),
npm run test:acceptance(requires abuild), and
npm run docs:check. These are expected to be covered by CI.Compatibility, safety, and release
portable Node and provider-free.
read of bytes already in the artifact snapshot. It never executes the target,
never resolves classes against a process, and never writes. Decode budgets
(1024 objects, 8192 properties, 32768 values, 8 MiB decoded text per payload) and the existing
8 MiB metadata budget bound the output; exhausting a budget is reported as an
unknown rather than returning partial data.
Author readiness
Human owner: @Henglie
Before merge
type(scope): outcome.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.