rea-agents 6.0.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -18
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +205 -51
- package/bridge/hopper_bridge.py +314 -127
- package/bridge/mitmproxy/capture.py +0 -2
- package/bridge/native/rea_lldb_tracer.py +630 -94
- package/bridge/process/ProcessRunTokenReader.swift +39 -5
- package/bridge/pwntools/recorded_crash_impl.py +4 -0
- package/dist/android/JadxConfiguration.js +274 -31
- package/dist/android/JadxMcpTransport.js +18 -2
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +76 -37
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +48 -11
- package/dist/application/ClientConfigurationDocument.js +917 -8
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +56 -51
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +19 -21
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +64 -17
- package/dist/application/EvidenceBundleFiles.js +30 -13
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +11 -2
- package/dist/application/JsonFiles.js +83 -28
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +21 -17
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +21 -29
- package/dist/application/SetupPlan.js +11 -9
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +82 -29
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +57 -36
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCaptureService.js +4 -2
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +32 -6
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WorkflowEvidence.js +105 -0
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
- package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
- package/dist/application/binary/BinarySession.js +161 -93
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +4 -4
- package/dist/application/binary/BinarySessionRecords.js +26 -4
- package/dist/application/binary/BinarySessionStatus.js +18 -7
- package/dist/application/binary/CompositeProvider.js +16 -17
- package/dist/application/binary/LazyAnalysisProvider.js +8 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
- package/dist/application/evm/EvmInterfaceService.js +4 -2
- package/dist/application/homebrew.js +48 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
- package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
- package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/process/ProcessCli.js +25 -17
- package/dist/application/process/ProcessEvidence.js +4 -4
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +48 -13
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
- package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
- package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +59 -38
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +78 -15
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +25 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +41 -1
- package/dist/browser/history/CaptureRelease.js +5 -0
- package/dist/browser/history/HarCaptureAdapter.js +3 -3
- package/dist/browser/history/HarJson.js +3 -2
- package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +100 -37
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +10 -9
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +7 -3
- package/dist/cli/jsonOutput.js +4 -99
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +3 -5
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +18 -9
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -1
- package/dist/cliJsonInput.js +24 -5
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraStartupTimeout.js +12 -0
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +30 -0
- package/dist/config/parseConfig.js +8 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +7 -5
- package/dist/contracts/enhancedToolContracts.js +7 -6
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +7 -14
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +5 -3
- package/dist/contracts/officialToolContracts.js +16 -16
- package/dist/contracts/promptContracts.js +5 -5
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +3 -7
- package/dist/contracts/sessionStatusContract.js +2 -4
- package/dist/contracts/sessionToolContracts.js +18 -8
- package/dist/contracts/sessionToolSchemas.js +3 -19
- package/dist/contracts/toolContractExamples.js +0 -1
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -1
- package/dist/contracts/toolOutputSchemaGroups.js +160 -115
- package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
- package/dist/contracts/toolSchemaMetadata.js +41 -33
- package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +8 -3
- package/dist/domain/analysisErrorCore.js +6 -1
- package/dist/domain/analysisErrorPresentation.js +90 -20
- package/dist/domain/analysisErrorProjection.js +130 -32
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +18 -10
- package/dist/domain/apple/appleApplication.js +42 -15
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dylibResolution.js +130 -12
- package/dist/domain/apple/dylibResolutionFindings.js +9 -7
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +35 -3
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +28 -40
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +5 -10
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +13 -1
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +65 -36
- package/dist/domain/evidenceBundle.js +47 -8
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/explicitSensitiveFailure.js +17 -1
- package/dist/domain/firmware/firmwareAnalysis.js +6 -7
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +47 -64
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
- package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +90 -6
- package/dist/domain/localPath.js +6 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -11
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +37 -13
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +21 -16
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +79 -26
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +35 -12
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +3 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +4 -3
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +8 -45
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +19 -7
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
- package/dist/ghidra/GhidraClient.js +126 -34
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +13 -12
- package/dist/ghidra/GhidraInstallation.js +58 -33
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +66 -0
- package/dist/ghidra/GhidraLauncher.js +47 -22
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
- package/dist/ghidra/GhidraProviderClient.js +36 -15
- package/dist/ghidra/GhidraSessionError.js +13 -7
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +65 -56
- package/dist/hopper/HopperAnalysisProfile.js +65 -12
- package/dist/hopper/HopperCleanup.js +63 -22
- package/dist/hopper/HopperClient.js +288 -59
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +197 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +71 -19
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +134 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +133 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
- package/dist/inspector/V8InspectorProvider.js +82 -36
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +48 -22
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +87 -88
- package/dist/native/LldbCallTracer.js +372 -103
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +62 -3
- package/dist/native/NativeMacOSProvider.js +122 -31
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
- package/dist/process/DarwinProcessRunTokenReader.js +23 -10
- package/dist/process/ExecFileOutput.js +108 -6
- package/dist/process/OwnedCommand.js +7 -2
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +204 -57
- package/dist/process/ProcessOwnershipObservation.js +60 -9
- package/dist/process/ProviderProcess.js +39 -10
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +15 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +157 -0
- package/dist/server/createServer.js +61 -41
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -5
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +13 -10
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
- package/dist/server/registerBrowserScenarioTool.js +3 -6
- package/dist/server/registerBrowserTools.js +13 -18
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +9 -20
- package/dist/server/registerElectronTools.js +10 -15
- package/dist/server/registerEnhancedTools.js +36 -77
- package/dist/server/registerEvidenceTools.js +3 -6
- package/dist/server/registerEvmTools.js +2 -5
- package/dist/server/registerFirmwareTools.js +2 -5
- package/dist/server/registerFunctionComparisonTool.js +15 -12
- package/dist/server/registerInvestigationTools.js +16 -17
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
- package/dist/server/registerOfficialTools.js +4 -21
- package/dist/server/registerProcessComparisonTool.js +74 -48
- package/dist/server/registerRecordedCrashTools.js +2 -5
- package/dist/server/registerSessionRecordTools.js +19 -24
- package/dist/server/registerSessionStatusTool.js +19 -6
- package/dist/server/registerSessionTools.js +20 -18
- package/dist/server/registerWebModuleTool.js +2 -5
- package/dist/server/registerWebNetworkCaptureTool.js +2 -5
- package/dist/server/registerWebRuntimeTools.js +4 -9
- package/dist/server/registerWebScriptTool.js +2 -5
- package/dist/server/registerWebSourceLocationTool.js +2 -5
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +0 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +75 -51
- package/dist/server/toolResultEncoding.js +34 -0
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/install.sh +1 -1
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +44 -30
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +12 -3
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/ghidra/GhidraDefaults.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
|
|
1
2
|
import { spawnSync } from "node:child_process";
|
|
2
3
|
import { constants } from "node:fs";
|
|
3
4
|
import { accessSync, readFileSync } from "node:fs";
|
|
4
5
|
import { posix, win32 } from "node:path";
|
|
5
6
|
import { ghidraApplicationProperties, ghidraJavaMajorAccepted, ghidraJavaRangeLabel, ghidraJavaRequirement, ghidraReleaseAccepted, ghidraReleaseCompatibility, ghidraReleaseLine, ghidraVersionDetail, SUPPORTED_GHIDRA_JAVA_MAJOR, SUPPORTED_GHIDRA_VERSION, } from "./GhidraInstallationPolicy.js";
|
|
6
|
-
|
|
7
|
+
const NATIVE_PLATFORMS = {
|
|
8
|
+
linux: { x64: "linux_x86_64", arm64: "linux_arm_64" },
|
|
9
|
+
darwin: { x64: "mac_x86_64", arm64: "mac_arm_64" },
|
|
10
|
+
win32: { x64: "win_x86_64" },
|
|
11
|
+
};
|
|
7
12
|
/** Inspect an installation without importing a target or modifying Ghidra. */
|
|
8
13
|
export const inspectGhidraInstallation = (options, host = systemGhidraInstallationHost()) => {
|
|
9
14
|
const platform = options.platform ?? process.platform;
|
|
@@ -67,16 +72,13 @@ const installationCoordinates = (options, platform, architecture, host) => {
|
|
|
67
72
|
const analyzeHeadlessPath = installDir === null
|
|
68
73
|
? null
|
|
69
74
|
: path.join(installDir, "support", platform === "win32" ? "analyzeHeadless.bat" : "analyzeHeadless");
|
|
70
|
-
const decompilerPlatform = platform
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
: "mac_x86_64"
|
|
74
|
-
: null;
|
|
75
|
-
const nativeDecompilerPath = installDir === null || decompilerPlatform === null
|
|
75
|
+
const decompilerPlatform = NATIVE_PLATFORMS[platform]?.[architecture];
|
|
76
|
+
const decompilerExecutable = platform === "win32" ? "decompile.exe" : "decompile";
|
|
77
|
+
const nativeDecompilerPath = installDir === null || decompilerPlatform === undefined
|
|
76
78
|
? null
|
|
77
79
|
: ([
|
|
78
|
-
path.join(installDir, "Ghidra", "Features", "Decompiler", "os", decompilerPlatform,
|
|
79
|
-
path.join(installDir, "Ghidra", "Features", "Decompiler", "build", "os", decompilerPlatform,
|
|
80
|
+
path.join(installDir, "Ghidra", "Features", "Decompiler", "os", decompilerPlatform, decompilerExecutable),
|
|
81
|
+
path.join(installDir, "Ghidra", "Features", "Decompiler", "build", "os", decompilerPlatform, decompilerExecutable),
|
|
80
82
|
].find((candidate) => host.executable(candidate)) ?? null);
|
|
81
83
|
const properties = applicationPropertiesPath === null
|
|
82
84
|
? undefined
|
|
@@ -95,33 +97,28 @@ const installationCoordinates = (options, platform, architecture, host) => {
|
|
|
95
97
|
? undefined
|
|
96
98
|
: ghidraApplicationProperties(properties),
|
|
97
99
|
javaCommand,
|
|
98
|
-
|
|
100
|
+
// The configuration check rejects a relative JAVA_HOME. Probing it would
|
|
101
|
+
// run whatever `bin/java` the current directory holds.
|
|
102
|
+
java: options.javaHome === undefined || path.isAbsolute(options.javaHome)
|
|
103
|
+
? host.probeJava(javaCommand, ghidraJavaEnvironment(options.javaHome, options.environment, platform))
|
|
104
|
+
: undefined,
|
|
99
105
|
};
|
|
100
106
|
};
|
|
101
107
|
const installationChecks = ({ coordinates, platform, architecture, javaHome, host, }) => [
|
|
102
|
-
|
|
103
|
-
name: "configuration",
|
|
104
|
-
passed: coordinates.installDir !== null,
|
|
105
|
-
code: "not_configured",
|
|
106
|
-
detail: coordinates.installDir ?? "GHIDRA_INSTALL_DIR is not set",
|
|
107
|
-
remediation: `Set GHIDRA_INSTALL_DIR to an extracted Ghidra ${ghidraReleaseLine()} release directory.`,
|
|
108
|
-
}),
|
|
108
|
+
configurationCheck(coordinates.installDir, javaHome, platform),
|
|
109
109
|
installationCheck({
|
|
110
110
|
name: "platform",
|
|
111
|
-
passed: platform
|
|
111
|
+
passed: NATIVE_PLATFORMS[platform] !== undefined,
|
|
112
112
|
code: "unsupported_host",
|
|
113
113
|
detail: platform,
|
|
114
|
-
remediation: "Use Linux or
|
|
114
|
+
remediation: "Use Linux or macOS x64/arm64, or Windows x64 with matching native Ghidra tools.",
|
|
115
115
|
}),
|
|
116
116
|
installationCheck({
|
|
117
117
|
name: "architecture",
|
|
118
|
-
passed:
|
|
119
|
-
architecture === "x64") ||
|
|
120
|
-
(platform === "darwin" &&
|
|
121
|
-
(architecture === "x64" || architecture === "arm64")),
|
|
118
|
+
passed: NATIVE_PLATFORMS[platform]?.[architecture] !== undefined,
|
|
122
119
|
code: "unsupported_host",
|
|
123
120
|
detail: architecture,
|
|
124
|
-
remediation: "Use x64 on Linux or
|
|
121
|
+
remediation: "Use x64/arm64 on Linux or macOS, or x64 on Windows.",
|
|
125
122
|
}),
|
|
126
123
|
installationCheck({
|
|
127
124
|
name: "installation",
|
|
@@ -142,16 +139,43 @@ const installationChecks = ({ coordinates, platform, architecture, javaHome, hos
|
|
|
142
139
|
}),
|
|
143
140
|
installationCheck({
|
|
144
141
|
name: "native_decompiler",
|
|
145
|
-
passed:
|
|
142
|
+
passed: coordinates.nativeDecompilerPath !== null,
|
|
146
143
|
code: "executable_missing",
|
|
147
|
-
detail:
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
"matching macOS native decompiler was not found"),
|
|
151
|
-
remediation: "REA does not build native tools. Build Ghidra's native components for this macOS architecture or provide an installation containing Ghidra/Features/Decompiler/os/<platform>/decompile.",
|
|
144
|
+
detail: coordinates.nativeDecompilerPath ??
|
|
145
|
+
`Matching native decompiler for ${platform}/${architecture} was not found`,
|
|
146
|
+
remediation: `Provide an executable Ghidra/Features/Decompiler/os/${NATIVE_PLATFORMS[platform]?.[architecture] ?? "<platform>"}/${platform === "win32" ? "decompile.exe" : "decompile"}, or its build/os equivalent. REA does not build or install native tools.`,
|
|
152
147
|
}),
|
|
153
148
|
javaCheck(coordinates.java, coordinates.javaCommand, javaHome, coordinates.properties),
|
|
154
149
|
];
|
|
150
|
+
/**
|
|
151
|
+
* REA's configuration parser, and so the MCP server and analysis, accept only
|
|
152
|
+
* absolute paths; a relative one that happens to resolve here must not pass.
|
|
153
|
+
*/
|
|
154
|
+
const configurationCheck = (installDir, javaHome, platform) => {
|
|
155
|
+
const { isAbsolute } = platform === "win32" ? win32 : posix;
|
|
156
|
+
const relative = [
|
|
157
|
+
...(installDir !== null && !isAbsolute(installDir)
|
|
158
|
+
? ["GHIDRA_INSTALL_DIR"]
|
|
159
|
+
: []),
|
|
160
|
+
...(javaHome !== undefined && !isAbsolute(javaHome) ? ["JAVA_HOME"] : []),
|
|
161
|
+
];
|
|
162
|
+
if (installDir === null || relative.length === 0)
|
|
163
|
+
return installationCheck({
|
|
164
|
+
name: "configuration",
|
|
165
|
+
passed: installDir !== null,
|
|
166
|
+
code: "not_configured",
|
|
167
|
+
detail: installDir ?? "GHIDRA_INSTALL_DIR is not set",
|
|
168
|
+
remediation: `Set GHIDRA_INSTALL_DIR to an extracted Ghidra ${ghidraReleaseLine()} release directory.`,
|
|
169
|
+
});
|
|
170
|
+
const settings = relative.join(" and ");
|
|
171
|
+
return installationCheck({
|
|
172
|
+
name: "configuration",
|
|
173
|
+
passed: false,
|
|
174
|
+
code: "not_configured",
|
|
175
|
+
detail: `${settings} must be absolute`,
|
|
176
|
+
remediation: `Set ${settings} to ${relative.length === 1 ? "an absolute path" : "absolute paths"}. REA's analysis and MCP server reject relative paths even when they resolve from the current directory.`,
|
|
177
|
+
});
|
|
178
|
+
};
|
|
155
179
|
/** Project an installation probe into caller-visible, secret-free diagnostics. */
|
|
156
180
|
export const ghidraInstallationDiagnostics = (inspection) => ({
|
|
157
181
|
install_dir: inspection.installDir,
|
|
@@ -172,9 +196,10 @@ export const ghidraInstallationDiagnostics = (inspection) => ({
|
|
|
172
196
|
})),
|
|
173
197
|
});
|
|
174
198
|
/** Environment that makes an explicitly selected JDK win over PATH discovery. */
|
|
175
|
-
export const ghidraJavaEnvironment = (javaHome, environment
|
|
199
|
+
export const ghidraJavaEnvironment = (javaHome, environment, platform = process.platform) => {
|
|
200
|
+
const selectedEnvironment = snapshotEnvironment(environment, platform);
|
|
176
201
|
const boundedEnvironment = {
|
|
177
|
-
...
|
|
202
|
+
...selectedEnvironment,
|
|
178
203
|
_JAVA_OPTIONS: "",
|
|
179
204
|
JAVA_TOOL_OPTIONS: "",
|
|
180
205
|
JDK_JAVA_OPTIONS: "",
|
|
@@ -185,7 +210,7 @@ export const ghidraJavaEnvironment = (javaHome, environment = process.env, platf
|
|
|
185
210
|
: {
|
|
186
211
|
...boundedEnvironment,
|
|
187
212
|
JAVA_HOME: javaHome,
|
|
188
|
-
PATH: `${(platform === "win32" ? win32 : posix).join(javaHome, "bin")}${platform === "win32" ? win32.delimiter : posix.delimiter}${
|
|
213
|
+
PATH: `${(platform === "win32" ? win32 : posix).join(javaHome, "bin")}${platform === "win32" ? win32.delimiter : posix.delimiter}${selectedEnvironment.PATH ?? ""}`,
|
|
189
214
|
};
|
|
190
215
|
};
|
|
191
216
|
const installationCheck = (options) => options.passed
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { nativeLoadImageObservationSchema } from "../domain/native/nativeLoadImage.js";
|
|
3
|
-
import {
|
|
3
|
+
import { AnalysisOutputError, } from "../domain/analysisErrorCore.js";
|
|
4
4
|
import { functionBodySchema, functionBodyEntryAgrees, } from "../domain/hopperValues.js";
|
|
5
5
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
6
6
|
import { err, ok } from "../domain/result.js";
|
|
7
|
+
import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
|
|
7
8
|
/** Read-only direct inventory operations admitted by the Ghidra adapter. */
|
|
8
9
|
export const GHIDRA_INVENTORY_OPERATIONS = [
|
|
9
10
|
"inspect_native_load_image",
|
|
@@ -26,7 +27,11 @@ export const isGhidraInventoryOperation = (operation) => operationSet.has(operat
|
|
|
26
27
|
export const ghidraIdentifierSchema = z.string().min(1);
|
|
27
28
|
const identifier = ghidraIdentifierSchema;
|
|
28
29
|
const document = identifier.nullable().default(null);
|
|
29
|
-
|
|
30
|
+
/** Caller address spelling; the bridge resolves its space and emits canonical output. */
|
|
31
|
+
export const ghidraInputAddressSchema = z
|
|
32
|
+
.string()
|
|
33
|
+
.regex(/^(?:(?:0[xX])?[0-9a-fA-F]+|(?:[A-Za-z0-9._~-]|%[0-9a-fA-F]{2})+:0[xX][0-9a-fA-F]+)$/u, "Use hexadecimal digits, optionally prefixed with 0x, or an encoded address-space name followed by :0x and hexadecimal digits");
|
|
34
|
+
const explicitAddress = ghidraInputAddressSchema;
|
|
30
35
|
const filteredAddress = explicitAddress.nullable().default(null);
|
|
31
36
|
const searchInput = {
|
|
32
37
|
pattern: z.string().min(1),
|
|
@@ -62,7 +67,9 @@ const inputSchemas = {
|
|
|
62
67
|
export const parseGhidraInventoryInput = (operation, value) => {
|
|
63
68
|
const parsed = inputSchemas[operation].safeParse(value);
|
|
64
69
|
if (!parsed.success)
|
|
65
|
-
return err(
|
|
70
|
+
return err(analysisInputErrorFromIssues(operation, parsed.error.issues, value, {
|
|
71
|
+
cause: parsed.error,
|
|
72
|
+
}));
|
|
66
73
|
return ok(parsed.data);
|
|
67
74
|
};
|
|
68
75
|
export const ghidraCanonicalAddressSchema = z
|
|
@@ -171,7 +178,10 @@ const containingProcedure = z.discriminatedUnion("found", [
|
|
|
171
178
|
.strict()
|
|
172
179
|
.superRefine((value, context) => {
|
|
173
180
|
const body = value.procedure.body;
|
|
174
|
-
|
|
181
|
+
const exactExternalEntry = value.procedure.classification.external &&
|
|
182
|
+
value.query_address === value.procedure.address;
|
|
183
|
+
if (!exactExternalEntry &&
|
|
184
|
+
body.available &&
|
|
175
185
|
!functionBodyEntryAgrees({ ...body, contains_entry: true }, value.query_address))
|
|
176
186
|
context.addIssue({
|
|
177
187
|
code: "custom",
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { execFileOutput } from "../process/ExecFileOutput.js";
|
|
4
|
+
/** Launch coordinates obtained from Ghidra's own release configuration helper. */
|
|
5
|
+
export const ghidraJavaLaunch = async (options) => {
|
|
6
|
+
const supportRoot = dirname(options.analyzeHeadlessPath);
|
|
7
|
+
const installRoot = dirname(supportRoot);
|
|
8
|
+
const command = join(options.javaHome, "bin", "java");
|
|
9
|
+
const isolatedProperties = [
|
|
10
|
+
`-Duser.home=${options.homeRoot}`,
|
|
11
|
+
`-Djava.io.tmpdir=${options.tempRoot}`,
|
|
12
|
+
];
|
|
13
|
+
const supportArguments = [
|
|
14
|
+
...isolatedProperties,
|
|
15
|
+
"-cp",
|
|
16
|
+
join(supportRoot, "LaunchSupport.jar"),
|
|
17
|
+
"LaunchSupport",
|
|
18
|
+
installRoot,
|
|
19
|
+
];
|
|
20
|
+
const environment = {
|
|
21
|
+
...snapshotEnvironment(options.environment, options.platform),
|
|
22
|
+
};
|
|
23
|
+
const configuredEnvironment = await execFileOutput(command, [...supportArguments, "-envvars"], {
|
|
24
|
+
env: environment,
|
|
25
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
26
|
+
});
|
|
27
|
+
for (const line of configuredEnvironment.stdout.split(/\r?\n/u)) {
|
|
28
|
+
if (line === "")
|
|
29
|
+
continue;
|
|
30
|
+
const separator = line.indexOf("=");
|
|
31
|
+
const sourceKey = line.slice(0, separator);
|
|
32
|
+
const key = options.platform === "win32" ? sourceKey.toUpperCase() : sourceKey;
|
|
33
|
+
if (separator < 1 || !/^[A-Za-z_][A-Za-z0-9_]*$/u.test(key))
|
|
34
|
+
throw new Error(`Invalid Ghidra LaunchSupport environment entry: ${line}`);
|
|
35
|
+
if ((environment[key] ?? "") === "")
|
|
36
|
+
environment[key] = line.slice(separator + 1);
|
|
37
|
+
}
|
|
38
|
+
const configuredArguments = await execFileOutput(command, [...supportArguments, "-vmargs"], {
|
|
39
|
+
env: environment,
|
|
40
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
41
|
+
});
|
|
42
|
+
const vmArguments = configuredArguments.stdout
|
|
43
|
+
.split(/\r?\n/u)
|
|
44
|
+
.filter((line) => line !== "");
|
|
45
|
+
if (vmArguments.some((argument) => !argument.startsWith("-") || argument.includes("\0")))
|
|
46
|
+
throw new Error("Invalid Ghidra LaunchSupport JVM argument");
|
|
47
|
+
return {
|
|
48
|
+
command,
|
|
49
|
+
environment,
|
|
50
|
+
arguments: [
|
|
51
|
+
...vmArguments,
|
|
52
|
+
...(options.platform === "darwin" ? ["-Xdock:name=Ghidra-Headless"] : []),
|
|
53
|
+
`-Xmx${environment.GHIDRA_HEADLESS_MAXMEM || environment.GHIDRA_MAXMEM || "2G"}`,
|
|
54
|
+
"-XX:ParallelGCThreads=2",
|
|
55
|
+
"-XX:CICompilerCount=2",
|
|
56
|
+
"-Djava.awt.headless=true",
|
|
57
|
+
...isolatedProperties,
|
|
58
|
+
"-showversion",
|
|
59
|
+
"-cp",
|
|
60
|
+
join(installRoot, "Ghidra", "Framework", "Utility", "lib", "Utility.jar"),
|
|
61
|
+
"ghidra.Ghidra",
|
|
62
|
+
"ghidra.app.util.headless.AnalyzeHeadless",
|
|
63
|
+
...options.arguments,
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
|
|
1
2
|
import { mkdir } from "node:fs/promises";
|
|
2
3
|
import { basename, dirname, join, win32 } from "node:path";
|
|
3
4
|
import writeFileAtomic from "write-file-atomic";
|
|
@@ -7,6 +8,7 @@ import { err, ok } from "../domain/result.js";
|
|
|
7
8
|
import { cleanupOwnedProcessGroup, cleanupWindowsProcessTree, } from "../process/ProcessOwnership.js";
|
|
8
9
|
import { spawnOwnedProviderProcess, } from "../process/ProviderProcess.js";
|
|
9
10
|
import { ghidraJavaEnvironment } from "./GhidraInstallation.js";
|
|
11
|
+
import { ghidraJavaLaunch } from "./GhidraJavaLaunch.js";
|
|
10
12
|
import { snapshotGhidraExtensions, } from "./extensions/GhidraExtensions.js";
|
|
11
13
|
/** Local launch failure retained as the cause of a provider-neutral error. */
|
|
12
14
|
export class GhidraLaunchError extends Error {
|
|
@@ -19,7 +21,10 @@ export class GhidraLaunchError extends Error {
|
|
|
19
21
|
export class GhidraHeadlessLauncher {
|
|
20
22
|
options;
|
|
21
23
|
constructor(options) {
|
|
22
|
-
this.options =
|
|
24
|
+
this.options = {
|
|
25
|
+
...options,
|
|
26
|
+
environment: snapshotEnvironment(options.environment, options.platform),
|
|
27
|
+
};
|
|
23
28
|
}
|
|
24
29
|
async launch(session, options = {}) {
|
|
25
30
|
if (isAborted(options.signal))
|
|
@@ -58,7 +63,8 @@ export class GhidraHeadlessLauncher {
|
|
|
58
63
|
? {}
|
|
59
64
|
: { dosMz: this.options.dosMz }),
|
|
60
65
|
});
|
|
61
|
-
const
|
|
66
|
+
const scriptCommand = ghidraHeadlessCommand({
|
|
67
|
+
environment: this.options.environment,
|
|
62
68
|
platform,
|
|
63
69
|
analyzeHeadlessPath: this.options.analyzeHeadlessPath,
|
|
64
70
|
arguments: headlessArguments,
|
|
@@ -66,25 +72,46 @@ export class GhidraHeadlessLauncher {
|
|
|
66
72
|
? {}
|
|
67
73
|
: { comSpec: this.options.comSpec }),
|
|
68
74
|
});
|
|
75
|
+
const environment = ghidraLaunchEnvironment(paths, this.options.javaHome, platform, scriptCommand.command, this.options.environment);
|
|
76
|
+
if (platform !== "win32" && this.options.javaHome === undefined)
|
|
77
|
+
throw new GhidraLaunchError("POSIX Ghidra requires its inspected JDK home");
|
|
78
|
+
const command = platform !== "win32" && this.options.javaHome !== undefined
|
|
79
|
+
? await ghidraJavaLaunch({
|
|
80
|
+
platform,
|
|
81
|
+
analyzeHeadlessPath: this.options.analyzeHeadlessPath,
|
|
82
|
+
javaHome: this.options.javaHome,
|
|
83
|
+
homeRoot: paths.homeRoot,
|
|
84
|
+
tempRoot: paths.tempRoot,
|
|
85
|
+
arguments: headlessArguments,
|
|
86
|
+
environment,
|
|
87
|
+
...(options.signal === undefined
|
|
88
|
+
? {}
|
|
89
|
+
: { signal: options.signal }),
|
|
90
|
+
})
|
|
91
|
+
: { ...scriptCommand, environment };
|
|
69
92
|
started = await spawnOwnedProviderProcess({
|
|
70
93
|
command: command.command,
|
|
71
94
|
arguments: command.arguments,
|
|
72
95
|
runId: session.runId,
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
expectedCommand: null,
|
|
96
|
+
// POSIX launches the inspected JVM directly; script wrappers cannot
|
|
97
|
+
// preserve JVM property paths containing spaces as single arguments.
|
|
98
|
+
expectedCommand: platform !== "win32" ? command.command : null,
|
|
76
99
|
windowsVerbatimArguments: platform === "win32",
|
|
77
100
|
platform,
|
|
78
|
-
env:
|
|
101
|
+
env: command.environment,
|
|
102
|
+
hostEnvironment: {},
|
|
79
103
|
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
80
104
|
});
|
|
81
105
|
await writeGhidraRuntimeFile(paths.ownershipPath, `${JSON.stringify({
|
|
82
106
|
run_id: session.runId,
|
|
107
|
+
transport: session.transport,
|
|
108
|
+
endpoint_path: session.endpointPath,
|
|
83
109
|
pid: started.ownership.leaderPid,
|
|
84
110
|
process_group_id: started.ownership.processGroupId,
|
|
85
111
|
parent_pid: process.pid,
|
|
86
112
|
ownership_kind: platform === "win32" ? "windows-job-object" : "posix-process-group",
|
|
87
|
-
launcher:
|
|
113
|
+
launcher: command.command,
|
|
114
|
+
headless_script: this.options.analyzeHeadlessPath,
|
|
88
115
|
created_at: new Date().toISOString(),
|
|
89
116
|
})}\n`, platform);
|
|
90
117
|
if (isAborted(options.signal)) {
|
|
@@ -124,11 +151,13 @@ export const ghidraHeadlessCommand = (options) => {
|
|
|
124
151
|
command: options.analyzeHeadlessPath,
|
|
125
152
|
arguments: [...options.arguments],
|
|
126
153
|
};
|
|
154
|
+
const environment = snapshotEnvironment(options.environment, options.platform);
|
|
155
|
+
const systemRoot = environment.SYSTEMROOT;
|
|
127
156
|
const comSpec = options.comSpec ??
|
|
128
|
-
|
|
129
|
-
(
|
|
157
|
+
environment.COMSPEC ??
|
|
158
|
+
(systemRoot === undefined
|
|
130
159
|
? "C:\\Windows\\System32\\cmd.exe"
|
|
131
|
-
: win32.join(
|
|
160
|
+
: win32.join(systemRoot, "System32", "cmd.exe"));
|
|
132
161
|
if (!win32.isAbsolute(comSpec) ||
|
|
133
162
|
win32.basename(comSpec).toLowerCase() !== "cmd.exe")
|
|
134
163
|
throw new GhidraLaunchError("Windows ComSpec must be an absolute cmd.exe path");
|
|
@@ -244,9 +273,9 @@ const writeGhidraRuntimeFile = async (path, content, platform) => {
|
|
|
244
273
|
}
|
|
245
274
|
await writeFileAtomic(path, content, { encoding: "utf8", mode: 0o600 });
|
|
246
275
|
};
|
|
247
|
-
const ghidraLaunchEnvironment = (paths, javaHome, platform, executable) => {
|
|
276
|
+
const ghidraLaunchEnvironment = (paths, javaHome, platform, executable, selectedEnvironment) => {
|
|
248
277
|
return {
|
|
249
|
-
...ghidraJavaEnvironment(javaHome,
|
|
278
|
+
...ghidraJavaEnvironment(javaHome, selectedEnvironment, platform),
|
|
250
279
|
...ghidraHeadlessJavaOptions(paths.homeRoot, paths.tempRoot, platform),
|
|
251
280
|
HOME: paths.homeRoot,
|
|
252
281
|
TMPDIR: paths.tempRoot,
|
|
@@ -267,22 +296,18 @@ const ghidraLaunchEnvironment = (paths, javaHome, platform, executable) => {
|
|
|
267
296
|
XDG_DATA_HOME: paths.dataRoot,
|
|
268
297
|
};
|
|
269
298
|
};
|
|
270
|
-
/** Encode provider-owned JVM paths for the
|
|
299
|
+
/** Encode provider-owned JVM paths for the platform launcher that consumes them. */
|
|
271
300
|
export const ghidraHeadlessJavaOptions = (homeRoot, tempRoot, platform) => {
|
|
272
301
|
const options = [`-Duser.home=${homeRoot}`, `-Djava.io.tmpdir=${tempRoot}`];
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
// JDK_JAVA_OPTIONS is parsed by Java itself, outside that batch expansion.
|
|
276
|
-
return platform === "win32"
|
|
277
|
-
? {
|
|
302
|
+
if (platform === "win32")
|
|
303
|
+
return {
|
|
278
304
|
JDK_JAVA_OPTIONS: [...options, "-XX:-UsePerfData"]
|
|
279
305
|
.map(quoteWindowsBatchToken)
|
|
280
306
|
.join(" "),
|
|
281
307
|
GHIDRA_HEADLESS_JAVA_OPTIONS: "",
|
|
282
|
-
}
|
|
283
|
-
: {
|
|
284
|
-
JDK_JAVA_OPTIONS: "",
|
|
285
|
-
GHIDRA_HEADLESS_JAVA_OPTIONS: options.join(" "),
|
|
286
308
|
};
|
|
309
|
+
// POSIX launches the JVM directly, so these properties travel as separate
|
|
310
|
+
// argv items instead of the shell-split analyzeHeadless option list.
|
|
311
|
+
return { JDK_JAVA_OPTIONS: "", GHIDRA_HEADLESS_JAVA_OPTIONS: "" };
|
|
287
312
|
};
|
|
288
313
|
const isAborted = (signal) => signal?.aborted === true;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
|
|
1
2
|
import {} from "../application/AnalysisProvider.js";
|
|
2
3
|
import { createAnalysisProfile, } from "../domain/analysisProfile.js";
|
|
3
4
|
import { jsonObjectSchema, jsonValueSchema, } from "../domain/jsonValue.js";
|
|
@@ -9,7 +10,6 @@ import { resolveGhidraExtensions } from "./extensions/GhidraExtensions.js";
|
|
|
9
10
|
import { CAPABILITIES, windowsP0Capabilities, GHIDRA_PROVIDER_IDENTITY, GHIDRA_OPERATIONS, } from "./GhidraProviderCapabilities.js";
|
|
10
11
|
import { createGhidraProviderClient, } from "./GhidraProviderClient.js";
|
|
11
12
|
import { windowsNativeAuthorityUnavailableReason, hasWindowsNativeAuthority, windowsNativeCapabilities, } from "../process/WindowsAuthority.js";
|
|
12
|
-
export { GHIDRA_PROVIDER_IDENTITY, GHIDRA_OPERATIONS };
|
|
13
13
|
const SUPPORTED_ARCHITECTURES = new Set(["x86", "x86_64", "arm", "arm64"]);
|
|
14
14
|
/** Ghidra candidate backed by an isolated ephemeral headless import. */
|
|
15
15
|
export class GhidraProvider {
|
|
@@ -18,11 +18,13 @@ export class GhidraProvider {
|
|
|
18
18
|
installationHost;
|
|
19
19
|
clientFactory;
|
|
20
20
|
#installation;
|
|
21
|
-
|
|
21
|
+
environment;
|
|
22
|
+
constructor(config, logger, environment, installationHost, clientFactory = (options) => new GhidraClient(options)) {
|
|
22
23
|
this.config = config;
|
|
23
24
|
this.logger = logger;
|
|
24
25
|
this.installationHost = installationHost;
|
|
25
26
|
this.clientFactory = clientFactory;
|
|
27
|
+
this.environment = snapshotEnvironment(environment, installationHost?.platform);
|
|
26
28
|
}
|
|
27
29
|
identity() {
|
|
28
30
|
return GHIDRA_PROVIDER_IDENTITY;
|
|
@@ -125,6 +127,7 @@ export class GhidraProvider {
|
|
|
125
127
|
createClient(target, profile, context) {
|
|
126
128
|
return createGhidraProviderClient({
|
|
127
129
|
config: this.config,
|
|
130
|
+
environment: this.environment,
|
|
128
131
|
logger: this.logger,
|
|
129
132
|
clientFactory: this.clientFactory,
|
|
130
133
|
target,
|
|
@@ -135,6 +138,7 @@ export class GhidraProvider {
|
|
|
135
138
|
}
|
|
136
139
|
#inspectInstallation() {
|
|
137
140
|
const options = {
|
|
141
|
+
environment: this.environment,
|
|
138
142
|
...(this.config.ghidraInstallDir === undefined
|
|
139
143
|
? {}
|
|
140
144
|
: { installDir: this.config.ghidraInstallDir }),
|
|
@@ -16,6 +16,7 @@ export const GHIDRA_OPERATIONS = Object.freeze([
|
|
|
16
16
|
export const healthLimitations = Object.freeze([
|
|
17
17
|
"The session serves operations only after Ghidra reports default auto-analysis complete; incomplete analysis does not expose partial results.",
|
|
18
18
|
"The imported Program and temporary project are ephemeral and deleted on close. Annotation operations edit session database metadata; original executable bytes are never written.",
|
|
19
|
+
"Cancelling an active Ghidra request terminates its ephemeral database and discards session annotations. The selected target remains open; the next provider query imports the original artifact again.",
|
|
19
20
|
]);
|
|
20
21
|
/** Additional limitations applied to the experimental Windows x64 P0 boundary. */
|
|
21
22
|
export const windowsP0Limitations = Object.freeze([
|
|
@@ -33,7 +34,8 @@ export const limitationsFor = (operation) => {
|
|
|
33
34
|
case "annotate_native_function":
|
|
34
35
|
return [
|
|
35
36
|
...common,
|
|
36
|
-
"Names use Ghidra USER_DEFINED source. Name writes
|
|
37
|
+
"Names use Ghidra USER_DEFINED source. Name writes accept a leaf name or a fully qualified name within the existing namespace; readback uses the fully qualified name and can be reused without adding namespace prefixes. Edits retain the current namespace; other namespace-like text remains literal leaf-name text. Regular comments map to PRE and inline comments to EOL at the exact function entry. Changes commit together after readback and refreshed analysis; failure rolls them all back.",
|
|
38
|
+
"Annotation text rejects NUL and unpaired Unicode surrogates before mutation, with the field and UTF-16 index in the error. Supported Unicode and line endings are preserved.",
|
|
37
39
|
"Metadata edits invalidate immutable analysis snapshots and are discarded on close. CLI returns the updated dossier before session cleanup; this is not a saved Ghidra project.",
|
|
38
40
|
];
|
|
39
41
|
case "inspect_native_load_image":
|
|
@@ -72,6 +74,11 @@ export const limitationsFor = (operation) => {
|
|
|
72
74
|
...common,
|
|
73
75
|
"Only Ghidra-defined string Data is observed; charset is reported, while a non-missing terminator cannot distinguish a present terminator from a fixed or Pascal layout.",
|
|
74
76
|
];
|
|
77
|
+
case "resolve_containing_procedure":
|
|
78
|
+
return [
|
|
79
|
+
...common,
|
|
80
|
+
"An exact external entry resolves to its observed function identity even when its body is empty. This does not establish mapped executable bytes or containment of nearby external addresses.",
|
|
81
|
+
];
|
|
75
82
|
case "list_segments":
|
|
76
83
|
return [
|
|
77
84
|
...common,
|
|
@@ -79,7 +86,10 @@ export const limitationsFor = (operation) => {
|
|
|
79
86
|
];
|
|
80
87
|
case "search_procedures":
|
|
81
88
|
case "search_strings":
|
|
82
|
-
return
|
|
89
|
+
return [
|
|
90
|
+
...common,
|
|
91
|
+
"Regex mode uses Java Pattern semantics. Matcher or compiler stack exhaustion returns a resource constraint without closing the session; literal mode avoids regex recursion and returns complete matching values.",
|
|
92
|
+
];
|
|
83
93
|
case "procedure_pseudo_code":
|
|
84
94
|
return [
|
|
85
95
|
...common,
|
|
@@ -112,12 +122,14 @@ export const limitationsFor = (operation) => {
|
|
|
112
122
|
case "procedure_references":
|
|
113
123
|
return [
|
|
114
124
|
...common,
|
|
125
|
+
"References cover the complete Ghidra function-body AddressSet and exact entry, including instruction-interior destinations and embedded-data sources; an enclosing address span does not establish function ownership.",
|
|
115
126
|
"Reference kinds are direct Ghidra ReferenceManager observations; unresolved computed flows without a target are absent and remain unknown.",
|
|
116
127
|
"Synthetic Ghidra entry-point references without actionable memory sources are omitted.",
|
|
117
128
|
];
|
|
118
129
|
case "analyze_function":
|
|
119
130
|
return [
|
|
120
131
|
...common,
|
|
132
|
+
"References cover the complete Ghidra function-body AddressSet and exact entry. Dossier incoming edges omit sources owned by that function; procedure_references also retains those internal edges.",
|
|
121
133
|
"The dossier combines Ghidra FunctionManager, Listing, ReferenceManager, BasicBlockModel, and decompiler observations; provider-specific pseudocode and assembly are not cross-provider text invariants.",
|
|
122
134
|
"Resolved reference metadata identifies computed, indirect, external, call, jump, and data edges; unresolved targetless flows remain unknown, and function classifications distinguish thunks and externals.",
|
|
123
135
|
"Synthetic Ghidra entry-point references without actionable memory sources are omitted.",
|
|
@@ -134,6 +146,12 @@ export const CAPABILITIES = Object.freeze(GHIDRA_OPERATIONS.map((operation) => {
|
|
|
134
146
|
operation,
|
|
135
147
|
available: true,
|
|
136
148
|
reason: null,
|
|
149
|
+
// Project writes are private import machinery. Analysis reads are bound
|
|
150
|
+
// to the artifact/profile; session annotations disable snapshot replay.
|
|
151
|
+
...(operation === "annotate_native_function" ||
|
|
152
|
+
operation === "list_documents"
|
|
153
|
+
? {}
|
|
154
|
+
: { cachePolicy: "snapshot" }),
|
|
137
155
|
effects: Object.freeze({
|
|
138
156
|
mutatesArtifact: operation === "annotate_native_function",
|
|
139
157
|
launchesProcess: true,
|