rea-agents 3.0.0 → 3.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 +83 -108
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisContextQueries.js +21 -9
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/policy.js +17 -0
- package/dist/application/ArtifactInventory/reader.js +1 -4
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
- package/dist/application/ArtifactInventory/scanReader.js +76 -58
- package/dist/application/ArtifactInventory/types.js +1 -5
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +54 -28
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +24 -86
- package/dist/application/BinarySessionStatus.js +16 -21
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +39 -57
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityClientRequirements.js +26 -0
- package/dist/application/CapabilityInventory.js +143 -77
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +50 -0
- package/dist/application/ElectronActiveObservationPort.js +1 -0
- package/dist/application/ElectronActiveObservationService.js +78 -0
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +98 -64
- package/dist/application/EvidenceBundleCommands.js +16 -12
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +14 -42
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPermission.js +1 -1
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +29 -47
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +10 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +8 -17
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +60 -20
- package/dist/application/ProcessNormalization.js +2 -1
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -95
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +21 -47
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -88
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/application/WindowsCapabilities.js +5 -4
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +43 -67
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +21 -31
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +29 -51
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +18 -34
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +1 -18
- package/dist/browser/V8InspectorCaptureProjection.js +7 -7
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +12 -60
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +6 -271
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +44 -114
- package/dist/cliBrowserAdvancedCommands.js +12 -102
- package/dist/cliBrowserCommands.js +19 -124
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +5 -5
- package/dist/cliElectronCommands.js +49 -71
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +18 -92
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -92
- package/dist/cliPolicyCommands.js +2 -16
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +77 -0
- package/dist/config/electronAutomation.js +35 -0
- package/dist/config/environment.js +6 -9
- package/dist/config/javascriptReplay.js +41 -0
- package/dist/config/managedRuntime.js +25 -0
- package/dist/config/parseConfig.js +56 -232
- package/dist/config/parsers.js +16 -28
- package/dist/config/passiveObservation.js +87 -0
- package/dist/config/permissions.js +0 -7
- package/dist/config/processCapture.js +47 -0
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +58 -114
- package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +37 -91
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +10 -75
- package/dist/contracts/electronToolContracts.js +27 -98
- package/dist/contracts/enhancedInputs.js +31 -78
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +4 -5
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +10 -104
- package/dist/contracts/managedWorkflowExamples.js +77 -125
- package/dist/contracts/managedWorkflowToolContracts.js +51 -74
- package/dist/contracts/nativeToolContracts.js +9 -14
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +52 -0
- package/dist/contracts/toolContractExamples.js +11 -10
- package/dist/contracts/toolContractHelpers.js +19 -0
- package/dist/contracts/toolContracts.js +60 -143
- package/dist/contracts/toolEffects.js +16 -9
- package/dist/contracts/toolOutputSchemaGroups.js +47 -86
- package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
- package/dist/contracts/toolSchemaMetadata.js +117 -0
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/doctorRuntime.js +1 -1
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -52
- package/dist/domain/appleApplication.js +24 -65
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -219
- package/dist/domain/binaryTargetTypes.js +1 -0
- package/dist/domain/browserCaptureComparison.js +35 -60
- package/dist/domain/browserObservation.js +45 -197
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +53 -54
- package/dist/domain/callPath.js +50 -169
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +39 -11
- package/dist/domain/conformanceTrustGate.js +174 -30
- package/dist/domain/customProtocolCapture.js +4 -4
- package/dist/domain/electronActiveObservation.js +244 -0
- package/dist/domain/electronObservation.js +21 -83
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +14 -18
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +101 -90
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +8 -8
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -151
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +17 -141
- package/dist/domain/inputIssueProjection.js +4 -1
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +100 -101
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +43 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
- package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +17 -14
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +15 -18
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureReactiveValidation.js +8 -3
- package/dist/domain/processCaptureValidation.js +8 -10
- package/dist/domain/processComparison.js +12 -16
- package/dist/domain/processObservation.js +5 -6
- package/dist/domain/processReactiveMatching.js +32 -46
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +42 -21
- package/dist/domain/processScenario.js +62 -93
- package/dist/domain/processTraceComparison.js +0 -7
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +11 -9
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +66 -40
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +3 -7
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +46 -44
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +11 -87
- package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
- package/dist/domain/sourceToBundleSignals.js +11 -16
- package/dist/domain/staticRuntimeCorrelation.js +44 -54
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +48 -85
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +5 -13
- package/dist/ghidra/GhidraClientStartup.js +1 -1
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +67 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +18 -77
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +32 -31
- package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraSocketConnection.js +1 -1
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +19 -42
- package/dist/hopper/BridgeLauncher.js +115 -37
- package/dist/hopper/HopperAnalysisProfile.js +3 -5
- package/dist/hopper/HopperCleanup.js +11 -9
- package/dist/hopper/HopperClient.js +5 -8
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -30
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +1 -9
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -23
- package/dist/main/transport.js +27 -39
- package/dist/main.js +17 -15
- package/dist/mcpDoctor.js +27 -69
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/PrivateRuntimeRoot.js +17 -0
- package/dist/process/ProcessOwnership.js +67 -130
- package/dist/process/ProcessOwnershipIdentity.js +13 -0
- package/dist/process/ProcessOwnershipObservation.js +87 -0
- package/dist/process/ProcessOwnershipProcessTree.js +22 -0
- package/dist/process/ProviderDeadline.js +8 -12
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/process/WindowsAuthority.js +32 -0
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +95 -13
- package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
- package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +27 -18
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +33 -30
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +145 -119
- package/dist/server/mcpClientMetadata.js +32 -0
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +10 -21
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
- package/dist/server/registerApplicationTools/compareVersions.js +6 -16
- package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
- package/dist/server/registerApplicationTools/coverage.js +7 -78
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
- package/dist/server/registerApplicationTools/traceFeature.js +6 -15
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +27 -35
- package/dist/server/registerBrowserScenarioTool.js +3 -8
- package/dist/server/registerBrowserTools.js +36 -81
- package/dist/server/registerBundleComparisonTool.js +10 -16
- package/dist/server/registerCloseLifecycleTool.js +5 -27
- package/dist/server/registerElectronTools.js +29 -65
- package/dist/server/registerEnhancedTools.js +118 -127
- package/dist/server/registerEvidenceTools.js +19 -30
- package/dist/server/registerFunctionComparisonTool.js +35 -34
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +36 -148
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
- package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
- package/dist/server/registerOfficialTools.js +8 -51
- package/dist/server/registerProcessComparisonTool.js +43 -38
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerReplayMachineTool.js +4 -10
- package/dist/server/registerSessionRecordTools.js +36 -153
- package/dist/server/registerSessionStatusTool.js +18 -96
- package/dist/server/registerSessionTools.js +34 -91
- package/dist/server/sessionAvailabilityPolicy.js +2 -3
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +1 -13
- package/dist/server/toolRegistrationOptions.js +4 -192
- package/dist/server/toolResult.js +15 -67
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +27 -15
- package/scripts/electron-active-hook-boundaries.cjs +394 -0
- package/scripts/electron-active-hook.cjs +469 -0
- package/scripts/hopper-demo-x11.py +13 -32
- package/scripts/rea.mjs +1 -11
- package/skills/reverse-engineer-anything/SKILL.md +46 -11
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -128
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -346
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -21
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/DynamicToolAvailability.js +0 -70
- package/dist/server/LazyToolCatalog.js +0 -134
- package/dist/server/hydrateServerTools.js +0 -191
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -55
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
- package/dist/server/toolInputValidation.js +0 -77
- package/scripts/package-runner-bootstrap.mjs +0 -72
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { WINDOWS_NATIVE_AUTHORITY_UNAVAILABLE_REASON } from "../process/WindowsAuthority.js";
|
|
1
2
|
import { GENERATED_MCP_TOOL_CATALOG } from "../generatedMcpToolCatalog.js";
|
|
2
|
-
import { GHIDRA_DECOMPILE_REQUEST_TIMEOUT_MS, GHIDRA_MAX_LINE_BYTES, GHIDRA_REQUEST_TIMEOUT_MS, } from "./GhidraDefaults.js";
|
|
3
3
|
import { GHIDRA_FUNCTION_OPERATIONS } from "./GhidraFunctionValues.js";
|
|
4
4
|
import { GHIDRA_INVENTORY_OPERATIONS } from "./GhidraInventoryValues.js";
|
|
5
5
|
/** Public identity committed by every Ghidra-backed observation. */
|
|
@@ -16,34 +16,16 @@ export const GHIDRA_PROVIDER_TOOL_CONTRACTS = Object.freeze([...GHIDRA_INVENTORY
|
|
|
16
16
|
throw new TypeError(`Missing provider-neutral contract for ${operation}`);
|
|
17
17
|
return contract;
|
|
18
18
|
}));
|
|
19
|
-
const PAGINATED_OPERATIONS = new Set([
|
|
20
|
-
"list_names",
|
|
21
|
-
"list_procedures",
|
|
22
|
-
"list_strings",
|
|
23
|
-
"search_procedures",
|
|
24
|
-
"search_strings",
|
|
25
|
-
"procedure_references",
|
|
26
|
-
"read_function_instructions",
|
|
27
|
-
"analyze_function",
|
|
28
|
-
]);
|
|
29
|
-
const SEARCH_OPERATIONS = new Set([
|
|
30
|
-
"search_procedures",
|
|
31
|
-
"search_strings",
|
|
32
|
-
]);
|
|
33
|
-
const DECOMPILE_OPERATIONS = new Set([
|
|
34
|
-
"procedure_pseudo_code",
|
|
35
|
-
"analyze_function",
|
|
36
|
-
]);
|
|
37
19
|
/** Health limitations shared by every Ghidra-backed capability. */
|
|
38
20
|
export const healthLimitations = Object.freeze([
|
|
39
|
-
"The session serves operations only after default
|
|
21
|
+
"The session serves operations only after Ghidra reports default auto-analysis complete; incomplete analysis does not expose partial results.",
|
|
40
22
|
"The imported Program and temporary project are ephemeral, read-only to REA, and deleted on close.",
|
|
41
23
|
]);
|
|
42
24
|
/** Additional limitations applied to the experimental Windows x64 P0 boundary. */
|
|
43
25
|
export const windowsP0Limitations = Object.freeze([
|
|
44
26
|
"Windows Ghidra P0 accepts approved native x86-64 PE applications only; DLL, managed, hostile, sensitive, and mutable-path targets are unsupported.",
|
|
45
27
|
"The Windows bridge uses authenticated IPv4 loopback because Node path-based IPC does not expose Java AF_UNIX sockets; the endpoint file contains no bearer token.",
|
|
46
|
-
"Windows P0
|
|
28
|
+
"Windows P0 is not admitted until a native authority proves Job Object ownership, private DACL enforcement, and reparse-safe path admission; bounded taskkill cleanup and chmod(0700) do not prove those controls.",
|
|
47
29
|
]);
|
|
48
30
|
/** Limitation text for one admitted operation, including the common base. */
|
|
49
31
|
export const limitationsFor = (operation) => {
|
|
@@ -72,7 +54,6 @@ export const limitationsFor = (operation) => {
|
|
|
72
54
|
return [
|
|
73
55
|
...common,
|
|
74
56
|
"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.",
|
|
75
|
-
"Returned values are bounded to 1,024 Unicode code points and mark value_truncated instead of silently crossing the wire budget.",
|
|
76
57
|
];
|
|
77
58
|
case "list_segments":
|
|
78
59
|
return [
|
|
@@ -81,26 +62,23 @@ export const limitationsFor = (operation) => {
|
|
|
81
62
|
];
|
|
82
63
|
case "search_procedures":
|
|
83
64
|
case "search_strings":
|
|
84
|
-
return
|
|
85
|
-
...common,
|
|
86
|
-
"Literal search enforces 1,000,000 cumulative work units; regex mode also accepts only a conservative finite Java-regex subset with 10,000 static paths and 4,096 UTF-16 code units per candidate.",
|
|
87
|
-
];
|
|
65
|
+
return common;
|
|
88
66
|
case "procedure_pseudo_code":
|
|
89
67
|
return [
|
|
90
68
|
...common,
|
|
91
|
-
"Pseudocode is Ghidra decompiler output, not original source and not text-equivalent to Hopper output
|
|
69
|
+
"Pseudocode is Ghidra decompiler output, not original source and not text-equivalent to Hopper output.",
|
|
92
70
|
"External functions and functions without an analyzable body return null; other decompiler failures remain explicit.",
|
|
93
71
|
];
|
|
94
72
|
case "read_function_instructions":
|
|
95
73
|
return [
|
|
96
74
|
...common,
|
|
97
|
-
"This
|
|
75
|
+
"This fast path reads only the requested function and does not invoke the decompiler or whole-program string/name inventories.",
|
|
98
76
|
"Instruction text is Ghidra-specific and does not claim textual equivalence with Hopper output.",
|
|
99
77
|
];
|
|
100
78
|
case "procedure_assembly":
|
|
101
79
|
return [
|
|
102
80
|
...common,
|
|
103
|
-
"Assembly is Ghidra Listing text and
|
|
81
|
+
"Assembly is Ghidra Listing text and does not claim textual equivalence with Hopper output.",
|
|
104
82
|
];
|
|
105
83
|
case "procedure_callers":
|
|
106
84
|
case "procedure_callees":
|
|
@@ -119,7 +97,6 @@ export const limitationsFor = (operation) => {
|
|
|
119
97
|
...common,
|
|
120
98
|
"Reference kinds are direct Ghidra ReferenceManager observations; unresolved computed flows without a target are absent and remain unknown.",
|
|
121
99
|
"Synthetic Ghidra entry-point references without actionable memory sources are omitted.",
|
|
122
|
-
"Instruction scans stop at max_instructions; a truncated scan reports an unknown total and no false continuation.",
|
|
123
100
|
];
|
|
124
101
|
case "analyze_function":
|
|
125
102
|
return [
|
|
@@ -127,7 +104,7 @@ export const limitationsFor = (operation) => {
|
|
|
127
104
|
"The dossier combines Ghidra FunctionManager, Listing, ReferenceManager, BasicBlockModel, and decompiler observations; provider-specific pseudocode and assembly are not cross-provider text invariants.",
|
|
128
105
|
"Resolved reference metadata identifies computed, indirect, external, call, jump, and data edges; unresolved targetless flows remain unknown, and function classifications distinguish thunks and externals.",
|
|
129
106
|
"Synthetic Ghidra entry-point references without actionable memory sources are omitted.",
|
|
130
|
-
"The Java bridge serializes one function request per Program
|
|
107
|
+
"The Java bridge serializes one function request per Program and lets each decompilation run until it completes or the caller cancels.",
|
|
131
108
|
];
|
|
132
109
|
default:
|
|
133
110
|
return common;
|
|
@@ -141,14 +118,8 @@ export const CAPABILITIES = Object.freeze(GHIDRA_PROVIDER_TOOL_CONTRACTS.map((co
|
|
|
141
118
|
return Object.freeze({
|
|
142
119
|
provider: GHIDRA_PROVIDER_IDENTITY,
|
|
143
120
|
operation,
|
|
144
|
-
inputContractVersion: 1,
|
|
145
|
-
outputContractVersion: 1,
|
|
146
121
|
available: true,
|
|
147
122
|
reason: null,
|
|
148
|
-
pagination: PAGINATED_OPERATIONS.has(contract.name)
|
|
149
|
-
? "offset"
|
|
150
|
-
: "none",
|
|
151
|
-
exhaustive: !PAGINATED_OPERATIONS.has(contract.name),
|
|
152
123
|
effects: Object.freeze({
|
|
153
124
|
mutatesArtifact: false,
|
|
154
125
|
launchesProcess: true,
|
|
@@ -158,23 +129,15 @@ export const CAPABILITIES = Object.freeze(GHIDRA_PROVIDER_TOOL_CONTRACTS.map((co
|
|
|
158
129
|
changesPermissions: false,
|
|
159
130
|
requiresRoot: false,
|
|
160
131
|
}),
|
|
161
|
-
limits: Object.freeze({
|
|
162
|
-
maxResults: PAGINATED_OPERATIONS.has(contract.name)
|
|
163
|
-
? SEARCH_OPERATIONS.has(contract.name)
|
|
164
|
-
? 100
|
|
165
|
-
: 500
|
|
166
|
-
: null,
|
|
167
|
-
maxPayloadBytes: GHIDRA_MAX_LINE_BYTES,
|
|
168
|
-
timeoutMs: DECOMPILE_OPERATIONS.has(contract.name)
|
|
169
|
-
? GHIDRA_DECOMPILE_REQUEST_TIMEOUT_MS
|
|
170
|
-
: GHIDRA_REQUEST_TIMEOUT_MS,
|
|
171
|
-
}),
|
|
172
132
|
limitations: Object.freeze(limitationsFor(contract.name)),
|
|
173
133
|
});
|
|
174
134
|
}));
|
|
175
135
|
/** Capabilities advertised for the experimental Windows x64 P0 boundary. */
|
|
176
136
|
export const WINDOWS_P0_CAPABILITIES = Object.freeze(CAPABILITIES.map((capability) => Object.freeze({
|
|
177
137
|
...capability,
|
|
138
|
+
available: false,
|
|
139
|
+
reason: WINDOWS_NATIVE_AUTHORITY_UNAVAILABLE_REASON,
|
|
140
|
+
availabilityCode: "unsupported_host",
|
|
178
141
|
limitations: Object.freeze([
|
|
179
142
|
...capability.limitations,
|
|
180
143
|
...windowsP0Limitations,
|
|
@@ -1,41 +1,28 @@
|
|
|
1
|
-
import { performance } from "node:perf_hooks";
|
|
2
1
|
import { err } from "../domain/result.js";
|
|
3
|
-
/**
|
|
2
|
+
/** FIFO that admits one Ghidra Program request at a time. */
|
|
4
3
|
export class GhidraRequestQueue {
|
|
5
|
-
maximum;
|
|
6
4
|
execute;
|
|
7
5
|
failure;
|
|
8
6
|
#queue = [];
|
|
9
7
|
#active = false;
|
|
10
|
-
|
|
11
|
-
constructor(maximum, execute, failure) {
|
|
12
|
-
this.maximum = maximum;
|
|
8
|
+
constructor(execute, failure) {
|
|
13
9
|
this.execute = execute;
|
|
14
10
|
this.failure = failure;
|
|
15
11
|
}
|
|
16
|
-
/** Queue one request,
|
|
12
|
+
/** Queue one request until it completes, is cancelled, or the session closes. */
|
|
17
13
|
run(method, parameters, options) {
|
|
18
14
|
if (options.signal?.aborted === true)
|
|
19
15
|
return Promise.resolve(err(this.failure("cancelled", "Ghidra request was cancelled")));
|
|
20
|
-
if (options.timeoutMs <= 0)
|
|
21
|
-
return Promise.resolve(err(this.failure("timeout", "Ghidra request deadline elapsed", options.timeoutMs)));
|
|
22
|
-
if (this.#size >= this.maximum)
|
|
23
|
-
return Promise.resolve(err(this.failure("protocol", `Ghidra serial request queue reached its ${String(this.maximum)}-request limit`)));
|
|
24
|
-
this.#size += 1;
|
|
25
16
|
return new Promise((resolve) => {
|
|
26
17
|
let entry;
|
|
27
18
|
const onAbort = options.signal === undefined
|
|
28
19
|
? undefined
|
|
29
20
|
: () => this.#rejectQueued(entry, err(this.failure("cancelled", "Ghidra request was cancelled")));
|
|
30
|
-
const timer = setTimeout(() => this.#rejectQueued(entry, err(this.failure("timeout", "Ghidra request deadline elapsed in the serial queue", options.timeoutMs))), options.timeoutMs);
|
|
31
21
|
entry = {
|
|
32
22
|
method,
|
|
33
23
|
parameters,
|
|
34
24
|
signal: options.signal,
|
|
35
|
-
timeoutMs: options.timeoutMs,
|
|
36
|
-
deadline: performance.now() + options.timeoutMs,
|
|
37
25
|
resolve,
|
|
38
|
-
timer,
|
|
39
26
|
onAbort,
|
|
40
27
|
};
|
|
41
28
|
this.#queue.push(entry);
|
|
@@ -48,7 +35,6 @@ export class GhidraRequestQueue {
|
|
|
48
35
|
failQueued(failure) {
|
|
49
36
|
for (const entry of this.#queue.splice(0)) {
|
|
50
37
|
this.#release(entry);
|
|
51
|
-
this.#size -= 1;
|
|
52
38
|
entry.resolve(err(failure));
|
|
53
39
|
}
|
|
54
40
|
}
|
|
@@ -59,25 +45,17 @@ export class GhidraRequestQueue {
|
|
|
59
45
|
if (entry === undefined)
|
|
60
46
|
return;
|
|
61
47
|
this.#release(entry);
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
this.#size -= 1;
|
|
65
|
-
entry.resolve(err(entry.signal?.aborted === true
|
|
66
|
-
? this.failure("cancelled", "Ghidra request was cancelled")
|
|
67
|
-
: this.failure("timeout", "Ghidra request deadline elapsed in the serial queue", entry.timeoutMs)));
|
|
48
|
+
if (entry.signal?.aborted === true) {
|
|
49
|
+
entry.resolve(err(this.failure("cancelled", "Ghidra request was cancelled")));
|
|
68
50
|
this.#drain();
|
|
69
51
|
return;
|
|
70
52
|
}
|
|
71
53
|
this.#active = true;
|
|
72
|
-
void this.execute(entry.method, entry.parameters, {
|
|
73
|
-
...(entry.signal === undefined ? {} : { signal: entry.signal }),
|
|
74
|
-
timeoutMs: remaining,
|
|
75
|
-
})
|
|
54
|
+
void this.execute(entry.method, entry.parameters, entry.signal === undefined ? {} : { signal: entry.signal })
|
|
76
55
|
.then(entry.resolve)
|
|
77
56
|
.catch(() => entry.resolve(err(this.failure("protocol", "Ghidra serial request execution rejected unexpectedly"))))
|
|
78
57
|
.finally(() => {
|
|
79
58
|
this.#active = false;
|
|
80
|
-
this.#size -= 1;
|
|
81
59
|
this.#drain();
|
|
82
60
|
});
|
|
83
61
|
}
|
|
@@ -87,11 +65,9 @@ export class GhidraRequestQueue {
|
|
|
87
65
|
return;
|
|
88
66
|
this.#queue.splice(index, 1);
|
|
89
67
|
this.#release(entry);
|
|
90
|
-
this.#size -= 1;
|
|
91
68
|
entry.resolve(result);
|
|
92
69
|
}
|
|
93
70
|
#release(entry) {
|
|
94
|
-
clearTimeout(entry.timer);
|
|
95
71
|
if (entry.signal !== undefined && entry.onAbort !== undefined)
|
|
96
72
|
entry.signal.removeEventListener("abort", entry.onAbort);
|
|
97
73
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Splits fragmented UTF-8 socket data
|
|
1
|
+
/** Splits fragmented UTF-8 socket data into response lines. */
|
|
2
2
|
export class GhidraResponseBuffer {
|
|
3
3
|
#options;
|
|
4
4
|
#buffer = "";
|
|
@@ -12,17 +12,11 @@ export class GhidraResponseBuffer {
|
|
|
12
12
|
while (newline >= 0) {
|
|
13
13
|
const encodedLine = this.#buffer.slice(0, newline);
|
|
14
14
|
this.#buffer = this.#buffer.slice(newline + 1);
|
|
15
|
-
if (Buffer.byteLength(encodedLine) > this.#options.maxLineBytes) {
|
|
16
|
-
this.#options.onFailure("Ghidra response exceeded the maximum line size");
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
15
|
const line = encodedLine.trim();
|
|
20
16
|
if (line.length > 0)
|
|
21
17
|
this.#options.onLine(line);
|
|
22
18
|
newline = this.#buffer.indexOf("\n");
|
|
23
19
|
}
|
|
24
|
-
if (Buffer.byteLength(this.#buffer) > this.#options.maxLineBytes)
|
|
25
|
-
this.#options.onFailure("Ghidra response exceeded the maximum line size");
|
|
26
20
|
}
|
|
27
21
|
/** Drop any incomplete line when a session closes. */
|
|
28
22
|
reset() {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { err, ok } from "../domain/result.js";
|
|
3
|
-
import { GHIDRA_BRIDGE_VERSION } from "./GhidraDefaults.js";
|
|
4
3
|
import { GHIDRA_INVENTORY_OPERATIONS } from "./GhidraInventoryValues.js";
|
|
5
4
|
import { GHIDRA_FUNCTION_OPERATIONS } from "./GhidraFunctionValues.js";
|
|
6
5
|
/** Exact methods proved by the bridge handshake after auto-analysis. */
|
|
@@ -14,7 +13,6 @@ const capabilitySchema = z.enum(GHIDRA_SESSION_CAPABILITIES);
|
|
|
14
13
|
const sessionInfoSchema = z
|
|
15
14
|
.object({
|
|
16
15
|
name: z.literal("REA Ghidra bridge"),
|
|
17
|
-
bridge_version: z.literal(GHIDRA_BRIDGE_VERSION),
|
|
18
16
|
run_id: z.string().uuid(),
|
|
19
17
|
profile_digest: z.string().regex(/^[a-f0-9]{64}$/u),
|
|
20
18
|
provider: z
|
|
@@ -76,7 +76,7 @@ const connectGhidraSocketOnce = (target, signal) => new Promise((resolve) => {
|
|
|
76
76
|
if (signal.aborted)
|
|
77
77
|
onAbort();
|
|
78
78
|
});
|
|
79
|
-
const interruptionFailure = (options) => options.deadline.cancelled
|
|
79
|
+
const interruptionFailure = (options) => options.deadline.interruption === "cancelled"
|
|
80
80
|
? options.failure("cancelled", "Ghidra startup was cancelled")
|
|
81
81
|
: options.failure("timeout", "Ghidra startup deadline elapsed", undefined, {
|
|
82
82
|
timeoutMs: options.startupTimeoutMs,
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { access, open } from "node:fs/promises";
|
|
2
2
|
import { err, ok } from "../domain/result.js";
|
|
3
3
|
import { GhidraSessionError } from "./GhidraSessionError.js";
|
|
4
|
-
const MAX_ENDPOINT_BYTES = 1024;
|
|
5
4
|
/** Observe a ready endpoint, returning null while its bridge is not listening. */
|
|
6
5
|
export const observeGhidraEndpoint = async (endpoint) => {
|
|
7
6
|
if (endpoint.transport === "unix-socket") {
|
|
@@ -25,11 +24,10 @@ export const observeGhidraEndpoint = async (endpoint) => {
|
|
|
25
24
|
: err(endpointFailure(endpoint, "Ghidra endpoint observation failed", cause));
|
|
26
25
|
}
|
|
27
26
|
try {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
if (observed.bytesRead === 0 || observed.bytesRead > MAX_ENDPOINT_BYTES)
|
|
27
|
+
const encoded = await handle.readFile("utf8");
|
|
28
|
+
if (encoded.length === 0)
|
|
31
29
|
return err(endpointFailure(endpoint, "Ghidra TCP endpoint is invalid"));
|
|
32
|
-
return parseTcpEndpoint(endpoint,
|
|
30
|
+
return parseTcpEndpoint(endpoint, encoded);
|
|
33
31
|
}
|
|
34
32
|
catch (cause) {
|
|
35
33
|
return err(endpointFailure(endpoint, "Ghidra endpoint read failed", cause));
|
|
@@ -44,8 +42,7 @@ const parseTcpEndpoint = (endpoint, encoded) => {
|
|
|
44
42
|
if (typeof value !== "object" ||
|
|
45
43
|
value === null ||
|
|
46
44
|
Array.isArray(value) ||
|
|
47
|
-
!hasExactKeys(value, ["host", "port"
|
|
48
|
-
value.schema_version !== 1 ||
|
|
45
|
+
!hasExactKeys(value, ["host", "port"]) ||
|
|
49
46
|
value.host !== "127.0.0.1" ||
|
|
50
47
|
!Number.isSafeInteger(value.port) ||
|
|
51
48
|
typeof value.port !== "number" ||
|
package/dist/ghidra/protocol.js
CHANGED
|
@@ -1,46 +1,23 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
3
3
|
import { err, ok } from "../domain/result.js";
|
|
4
|
-
const responseSchema = z
|
|
5
|
-
.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
code: "custom",
|
|
22
|
-
path: ["result"],
|
|
23
|
-
message: "Successful Ghidra response requires a result",
|
|
24
|
-
});
|
|
25
|
-
if (!value.ok && value.error === undefined)
|
|
26
|
-
context.addIssue({
|
|
27
|
-
code: "custom",
|
|
28
|
-
path: ["error"],
|
|
29
|
-
message: "Failed Ghidra response requires an error",
|
|
30
|
-
});
|
|
31
|
-
if (!value.ok && value.result !== undefined)
|
|
32
|
-
context.addIssue({
|
|
33
|
-
code: "custom",
|
|
34
|
-
path: ["result"],
|
|
35
|
-
message: "Failed Ghidra response cannot include a result",
|
|
36
|
-
});
|
|
37
|
-
if (value.ok && value.error !== undefined)
|
|
38
|
-
context.addIssue({
|
|
39
|
-
code: "custom",
|
|
40
|
-
path: ["error"],
|
|
41
|
-
message: "Successful Ghidra response cannot include an error",
|
|
42
|
-
});
|
|
43
|
-
});
|
|
4
|
+
const responseSchema = z.discriminatedUnion("ok", [
|
|
5
|
+
z.strictObject({
|
|
6
|
+
id: z.number().int().positive(),
|
|
7
|
+
ok: z.literal(true),
|
|
8
|
+
result: jsonValueSchema,
|
|
9
|
+
}),
|
|
10
|
+
z.strictObject({
|
|
11
|
+
id: z.number().int().positive(),
|
|
12
|
+
ok: z.literal(false),
|
|
13
|
+
error: z
|
|
14
|
+
.object({
|
|
15
|
+
code: z.string().min(1),
|
|
16
|
+
message: z.string().min(1),
|
|
17
|
+
})
|
|
18
|
+
.strict(),
|
|
19
|
+
}),
|
|
20
|
+
]);
|
|
44
21
|
/** Expected operation failure returned by the authenticated Java bridge. */
|
|
45
22
|
export class GhidraRemoteError extends Error {
|
|
46
23
|
code;
|
|
@@ -65,5 +42,5 @@ export const parseGhidraResponseLine = (line) => {
|
|
|
65
42
|
};
|
|
66
43
|
/** Project one validated response into its result or remote failure. */
|
|
67
44
|
export const ghidraResponseResult = (response) => response.ok
|
|
68
|
-
? ok(response.result
|
|
69
|
-
: err(new GhidraRemoteError(response.error
|
|
45
|
+
? ok(response.result)
|
|
46
|
+
: err(new GhidraRemoteError(response.error.code, response.error.message));
|
|
@@ -5,10 +5,12 @@ import { promisify } from "node:util";
|
|
|
5
5
|
import { HopperCancelledError, HopperProcessError, HopperStartError, } from "../domain/errors.js";
|
|
6
6
|
import { err, ok } from "../domain/result.js";
|
|
7
7
|
import { cleanupOwnedProcessGroup } from "../process/ProcessOwnership.js";
|
|
8
|
+
import { execFileOutput } from "../process/ExecFileOutput.js";
|
|
8
9
|
import { spawnOwnedProviderProcess, } from "../process/ProviderProcess.js";
|
|
9
10
|
import { waitForAbortableDelay } from "../process/ProviderDeadline.js";
|
|
10
11
|
import { selectLinuxPrivateDisplayStrategy, } from "./LinuxPrivateDisplayProbe.js";
|
|
11
12
|
import writeFileAtomic from "write-file-atomic";
|
|
13
|
+
import { acquireHopperTargetLease } from "./HopperTargetLease.js";
|
|
12
14
|
const execFileAsync = promisify(execFile);
|
|
13
15
|
const HOPPER_BACKGROUND_STARTUP_MS = 5_000;
|
|
14
16
|
/**
|
|
@@ -33,57 +35,68 @@ export class HopperApplicationLauncher {
|
|
|
33
35
|
this.dependencies = dependencies;
|
|
34
36
|
}
|
|
35
37
|
async launch(session, options = {}) {
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
`REA_RUN_ID = ${JSON.stringify(session.runId)}`,
|
|
42
|
-
`REA_TARGET_PATH = ${JSON.stringify(this.options.targetPath)}`,
|
|
43
|
-
`REA_OWNS_PROCESS_LIFETIME = ${ownsProcessLifetime ? "True" : "False"}`,
|
|
44
|
-
`exec(compile(open(${JSON.stringify(this.options.bridgeScriptPath)}, 'rb').read(), ${JSON.stringify(this.options.bridgeScriptPath)}, 'exec'))`,
|
|
45
|
-
"",
|
|
46
|
-
].join("\n");
|
|
38
|
+
const leaseResult = await this.#acquireTargetLease(session.runId);
|
|
39
|
+
if (!leaseResult.ok)
|
|
40
|
+
return leaseResult;
|
|
41
|
+
const lease = leaseResult.value;
|
|
42
|
+
let leaseTransferred = false;
|
|
47
43
|
try {
|
|
48
|
-
|
|
49
|
-
await
|
|
44
|
+
const ownsProcessLifetime = usesLinuxDemo(this.options);
|
|
45
|
+
const bootstrap = await this.#writeBootstrap(session, ownsProcessLifetime);
|
|
46
|
+
if (!bootstrap.ok)
|
|
47
|
+
return bootstrap;
|
|
48
|
+
const launched = await this.#launchPreparedTarget({
|
|
49
|
+
session,
|
|
50
|
+
signal: options.signal,
|
|
51
|
+
bootstrapPath: bootstrap.value,
|
|
52
|
+
ownsProcessLifetime,
|
|
53
|
+
lease,
|
|
54
|
+
});
|
|
55
|
+
leaseTransferred = launched.ok;
|
|
56
|
+
return launched;
|
|
50
57
|
}
|
|
51
|
-
|
|
52
|
-
|
|
58
|
+
finally {
|
|
59
|
+
if (!leaseTransferred)
|
|
60
|
+
await lease?.release();
|
|
53
61
|
}
|
|
62
|
+
}
|
|
63
|
+
async #launchPreparedTarget(input) {
|
|
64
|
+
const { session, signal, bootstrapPath, ownsProcessLifetime, lease } = input;
|
|
54
65
|
const action = this.options.targetKind === "database" ? "--database" : "--executable";
|
|
55
|
-
const
|
|
66
|
+
const argumentsForTarget = [
|
|
56
67
|
...this.options.loaderArgs,
|
|
57
68
|
"--analysis",
|
|
58
|
-
"
|
|
69
|
+
"-Y",
|
|
59
70
|
bootstrapPath,
|
|
60
71
|
action,
|
|
61
72
|
this.options.targetPath,
|
|
62
73
|
];
|
|
63
74
|
try {
|
|
64
|
-
if (
|
|
75
|
+
if (signal?.aborted === true)
|
|
65
76
|
return err(new HopperCancelledError());
|
|
66
|
-
const display = await this.#privateDisplay(
|
|
77
|
+
const display = await this.#privateDisplay(signal);
|
|
67
78
|
if (!display.ok)
|
|
68
79
|
return err(display.error);
|
|
69
|
-
const prepared = await prepareHopperApplication(this.options.launcherPath,
|
|
80
|
+
const prepared = await prepareHopperApplication(this.options.launcherPath, signal);
|
|
70
81
|
if (!prepared)
|
|
71
82
|
return err(new HopperCancelledError());
|
|
72
|
-
const linuxDemo = linuxDemoLaunch(this.options, session,
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
83
|
+
const linuxDemo = linuxDemoLaunch(this.options, session, argumentsForTarget, display.strategy);
|
|
84
|
+
const started = await launchHopperProcess({
|
|
85
|
+
options: this.options,
|
|
86
|
+
session,
|
|
87
|
+
bootstrapPath,
|
|
88
|
+
ownsProcessLifetime,
|
|
89
|
+
argumentsForTarget,
|
|
90
|
+
linuxDemo,
|
|
91
|
+
signal,
|
|
79
92
|
});
|
|
80
|
-
|
|
81
|
-
|
|
93
|
+
if (started === null)
|
|
94
|
+
return err(new HopperCancelledError());
|
|
95
|
+
const cleanup = () => cleanupOwnedProcessGroup(started.ownership).finally(() => lease?.release());
|
|
82
96
|
const ownership = {
|
|
83
|
-
schema_version: 1,
|
|
84
97
|
run_id: session.runId,
|
|
85
|
-
pid,
|
|
86
|
-
process_group_id:
|
|
98
|
+
pid: started.ownership.leaderPid,
|
|
99
|
+
process_group_id: started.ownership.leaderPid,
|
|
87
100
|
parent_pid: process.pid,
|
|
88
101
|
launcher: linuxDemo?.command ?? this.options.launcherPath,
|
|
89
102
|
created_at: new Date().toISOString(),
|
|
@@ -96,15 +109,50 @@ export class HopperApplicationLauncher {
|
|
|
96
109
|
return err(new HopperStartError({ cause }));
|
|
97
110
|
}
|
|
98
111
|
return ok({
|
|
99
|
-
process:
|
|
112
|
+
process: started.process,
|
|
100
113
|
ownsProcessLifetime: true,
|
|
101
114
|
ownership: started.ownership,
|
|
102
|
-
|
|
103
|
-
|
|
115
|
+
shutdownMode: ownsProcessLifetime
|
|
116
|
+
? "process-cleanup"
|
|
117
|
+
: "bridge-request",
|
|
118
|
+
cleanup,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (cause) {
|
|
122
|
+
return err(hopperLaunchFailure(cause, signal));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async #acquireTargetLease(runId) {
|
|
126
|
+
if ((this.dependencies.platform ?? process.platform) !== "darwin")
|
|
127
|
+
return ok(undefined);
|
|
128
|
+
try {
|
|
129
|
+
const acquisition = await (this.dependencies.acquireTargetLease ?? acquireHopperTargetLease)({
|
|
130
|
+
targetPath: this.options.targetPath,
|
|
131
|
+
targetKind: this.options.targetKind,
|
|
132
|
+
loaderArgs: this.options.loaderArgs,
|
|
133
|
+
runId,
|
|
104
134
|
});
|
|
135
|
+
if (!acquisition.acquired)
|
|
136
|
+
return err(new HopperStartError({
|
|
137
|
+
ownerRunId: acquisition.owner.runId,
|
|
138
|
+
userMessage: `This Hopper target is already open in REA session ${acquisition.owner.runId}. ` +
|
|
139
|
+
"Use that REA session or close it before opening this target again.",
|
|
140
|
+
}));
|
|
141
|
+
return ok(acquisition.lease);
|
|
142
|
+
}
|
|
143
|
+
catch (cause) {
|
|
144
|
+
return err(new HopperStartError({ cause }));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async #writeBootstrap(session, ownsProcessLifetime) {
|
|
148
|
+
const bootstrapPath = `${session.directory}/bootstrap.py`;
|
|
149
|
+
try {
|
|
150
|
+
await writeFile(bootstrapPath, bridgeBootstrapSource(session, this.options, ownsProcessLifetime), { encoding: "utf8", mode: 0o600 });
|
|
151
|
+
await chmod(bootstrapPath, 0o600);
|
|
152
|
+
return ok(bootstrapPath);
|
|
105
153
|
}
|
|
106
154
|
catch (cause) {
|
|
107
|
-
return err(
|
|
155
|
+
return err(new HopperStartError({ cause }));
|
|
108
156
|
}
|
|
109
157
|
}
|
|
110
158
|
async #privateDisplay(signal) {
|
|
@@ -125,6 +173,32 @@ export class HopperApplicationLauncher {
|
|
|
125
173
|
};
|
|
126
174
|
}
|
|
127
175
|
}
|
|
176
|
+
const bridgeBootstrapSource = (session, options, ownsProcessLifetime) => [
|
|
177
|
+
`REA_SOCKET = ${JSON.stringify(session.socketPath)}`,
|
|
178
|
+
`REA_TOKEN = ${JSON.stringify(session.token)}`,
|
|
179
|
+
`REA_RUN_ID = ${JSON.stringify(session.runId)}`,
|
|
180
|
+
`REA_TARGET_PATH = ${JSON.stringify(options.targetPath)}`,
|
|
181
|
+
`REA_OWNS_PROCESS_LIFETIME = ${ownsProcessLifetime ? "True" : "False"}`,
|
|
182
|
+
`exec(compile(open(${JSON.stringify(options.bridgeScriptPath)}, 'rb').read(), ${JSON.stringify(options.bridgeScriptPath)}, 'exec'))`,
|
|
183
|
+
"",
|
|
184
|
+
].join("\n");
|
|
185
|
+
const launchHopperProcess = async (input) => {
|
|
186
|
+
const ownershipCommand = input.linuxDemo?.ownershipCommand ?? input.options.launcherPath;
|
|
187
|
+
const spawn = (arguments_) => spawnOwnedProviderProcess({
|
|
188
|
+
command: input.options.launcherPath,
|
|
189
|
+
arguments: arguments_,
|
|
190
|
+
runId: input.session.runId,
|
|
191
|
+
expectedCommand: ownershipCommand,
|
|
192
|
+
});
|
|
193
|
+
if (input.linuxDemo !== undefined)
|
|
194
|
+
return spawnOwnedProviderProcess({
|
|
195
|
+
command: input.linuxDemo.command,
|
|
196
|
+
arguments: input.linuxDemo.args,
|
|
197
|
+
runId: input.session.runId,
|
|
198
|
+
expectedCommand: ownershipCommand,
|
|
199
|
+
});
|
|
200
|
+
return spawn(input.argumentsForTarget);
|
|
201
|
+
};
|
|
128
202
|
export const linuxDemoLaunch = (options, session, hopperArgs, strategy) => {
|
|
129
203
|
if (!usesLinuxDemo(options) || options.demoHelperPath === undefined)
|
|
130
204
|
return undefined;
|
|
@@ -192,7 +266,11 @@ const hopperApplicationBundle = (launcherPath) => {
|
|
|
192
266
|
};
|
|
193
267
|
const processIsRunning = async (executablePath) => {
|
|
194
268
|
try {
|
|
195
|
-
const processes = await
|
|
269
|
+
const processes = await execFileOutput("/bin/ps", [
|
|
270
|
+
"-ax",
|
|
271
|
+
"-o",
|
|
272
|
+
"command=",
|
|
273
|
+
]);
|
|
196
274
|
return processes.stdout
|
|
197
275
|
.split("\n")
|
|
198
276
|
.some((command) => command.trim() === executablePath);
|
|
@@ -25,7 +25,7 @@ export const resolveHopperAnalysisProfile = async (target, options) => {
|
|
|
25
25
|
version: `launcher-sha256:${launcherDigest.value}`,
|
|
26
26
|
};
|
|
27
27
|
return ok({
|
|
28
|
-
profile: createAnalysisProfile(provider,
|
|
28
|
+
profile: createAnalysisProfile(provider, {
|
|
29
29
|
target_kind: target.kind,
|
|
30
30
|
target_format: target.format,
|
|
31
31
|
architecture: target.architecture ?? null,
|
|
@@ -49,9 +49,9 @@ export const resolveHopperAnalysisProfile = async (target, options) => {
|
|
|
49
49
|
export const hopperLoaderArgsForTarget = (target) => {
|
|
50
50
|
if (target.kind === "database")
|
|
51
51
|
return ok([]);
|
|
52
|
-
|
|
53
|
-
if (architecture === undefined)
|
|
52
|
+
if (target.kind !== "executable")
|
|
54
53
|
return err(new ProviderAdapterError("hopper", "resolve_analysis_profile"));
|
|
54
|
+
const architecture = target.architecture;
|
|
55
55
|
const flag = hopperArchitectureFlag(architecture);
|
|
56
56
|
switch (target.format) {
|
|
57
57
|
case "mach-o":
|
|
@@ -62,8 +62,6 @@ export const hopperLoaderArgsForTarget = (target) => {
|
|
|
62
62
|
return ok(["-l", "ELF", flag]);
|
|
63
63
|
case "pe":
|
|
64
64
|
return ok(["-l", "WinPE", flag]);
|
|
65
|
-
default:
|
|
66
|
-
return err(new ProviderAdapterError("hopper", "resolve_analysis_profile"));
|
|
67
65
|
}
|
|
68
66
|
};
|
|
69
67
|
const hopperArchitectureFlag = (architecture) => {
|