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
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { AnalysisInputError, } from "../analysisErrorCore.js";
|
|
2
|
+
import { uniqueSorted } from "../canonicalOrdering.js";
|
|
3
|
+
import { jsonObjectSchema } from "../jsonValue.js";
|
|
4
|
+
import { err, ok } from "../result.js";
|
|
5
|
+
import { completeWithinViewCoverage as completeCoverage, pageViewCoverage as pageCoverage, } from "./analysisViewCoverage.js";
|
|
6
|
+
const OPERATION = "inspect_analysis_view";
|
|
7
|
+
const inputError = (issues) => new AnalysisInputError(OPERATION, undefined, issues);
|
|
8
|
+
const jsIncompatible = (detail) => inputError([
|
|
9
|
+
{
|
|
10
|
+
path: ["view"],
|
|
11
|
+
reason: "invalid_value",
|
|
12
|
+
message: detail,
|
|
13
|
+
},
|
|
14
|
+
]);
|
|
15
|
+
/** Exact module path or original source-map reference, when available. */
|
|
16
|
+
export const javascriptModulePath = (node) => {
|
|
17
|
+
if (node.identity.strategy === "canonical-path")
|
|
18
|
+
return node.identity.path;
|
|
19
|
+
if (node.identity.strategy === "source-map-original")
|
|
20
|
+
return node.identity.original_source;
|
|
21
|
+
for (const observation of node.observations) {
|
|
22
|
+
const path = observation.properties.path;
|
|
23
|
+
if (typeof path === "string")
|
|
24
|
+
return path;
|
|
25
|
+
const location = observation.evidence.location;
|
|
26
|
+
if (location.available && location.value.kind === "artifact-path")
|
|
27
|
+
return location.value.path;
|
|
28
|
+
if (location.available && location.value.kind === "source-range")
|
|
29
|
+
return location.value.source;
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
};
|
|
33
|
+
const moduleEntries = (nodes) => nodes
|
|
34
|
+
.filter((node) => node.kind === "javascript-asset" ||
|
|
35
|
+
node.kind === "javascript-module" ||
|
|
36
|
+
node.kind === "source-module")
|
|
37
|
+
.map((node) => ({ node, path: javascriptModulePath(node) }));
|
|
38
|
+
const exportNames = (node) => {
|
|
39
|
+
const names = new Set();
|
|
40
|
+
for (const observation of node.observations) {
|
|
41
|
+
const value = observation.properties.export_names ?? observation.properties.exports;
|
|
42
|
+
if (!Array.isArray(value))
|
|
43
|
+
continue;
|
|
44
|
+
for (const entry of value)
|
|
45
|
+
if (typeof entry === "string")
|
|
46
|
+
names.add(entry);
|
|
47
|
+
}
|
|
48
|
+
return [...names];
|
|
49
|
+
};
|
|
50
|
+
const nodeHashes = (node) => {
|
|
51
|
+
const hashes = new Set();
|
|
52
|
+
const { identity } = node;
|
|
53
|
+
if (identity.strategy === "content-digest")
|
|
54
|
+
hashes.add(identity.sha256);
|
|
55
|
+
if (identity.strategy === "canonical-path")
|
|
56
|
+
hashes.add(identity.artifact_sha256);
|
|
57
|
+
if (identity.strategy === "source-map-original") {
|
|
58
|
+
hashes.add(identity.source_map_sha256);
|
|
59
|
+
if (identity.source_sha256 !== null)
|
|
60
|
+
hashes.add(identity.source_sha256);
|
|
61
|
+
}
|
|
62
|
+
for (const observation of node.observations) {
|
|
63
|
+
for (const key of [
|
|
64
|
+
"sha256",
|
|
65
|
+
"container_sha256",
|
|
66
|
+
"entry_sha256",
|
|
67
|
+
"source_sha256",
|
|
68
|
+
]) {
|
|
69
|
+
const value = observation.properties[key];
|
|
70
|
+
if (typeof value === "string" && /^[a-f0-9]{64}$/u.test(value))
|
|
71
|
+
hashes.add(value);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return [...hashes];
|
|
75
|
+
};
|
|
76
|
+
const sourceRanges = (node) => node.observations.flatMap((observation) => {
|
|
77
|
+
const location = observation.evidence.location;
|
|
78
|
+
return location.available && location.value.kind === "source-range"
|
|
79
|
+
? [location.value]
|
|
80
|
+
: [];
|
|
81
|
+
});
|
|
82
|
+
const moduleItem = (node) => ({
|
|
83
|
+
node_id: node.node_id,
|
|
84
|
+
kind: node.kind,
|
|
85
|
+
path: javascriptModulePath(node),
|
|
86
|
+
identity: node.identity,
|
|
87
|
+
hashes: [...nodeHashes(node)],
|
|
88
|
+
exports: [...exportNames(node)],
|
|
89
|
+
source_ranges: [...sourceRanges(node)],
|
|
90
|
+
observations: node.observations.map((observation) => ({
|
|
91
|
+
observation_id: observation.observation_id,
|
|
92
|
+
label: observation.label,
|
|
93
|
+
properties: observation.properties,
|
|
94
|
+
evidence: {
|
|
95
|
+
...observation.evidence,
|
|
96
|
+
location: observation.evidence.location,
|
|
97
|
+
},
|
|
98
|
+
})),
|
|
99
|
+
});
|
|
100
|
+
const applicationUnknownCount = (analysis) => analysis.graph.nodes.reduce((count, node) => count + Number(node.kind === "unknown"), 0);
|
|
101
|
+
const javascriptUnknowns = (analysis) => {
|
|
102
|
+
const unknowns = [
|
|
103
|
+
...analysis.limitations,
|
|
104
|
+
...analysis.graph.limitations,
|
|
105
|
+
...analysis.semantic_graph.limitations,
|
|
106
|
+
];
|
|
107
|
+
if (analysis.graph.coverage.status !== "complete")
|
|
108
|
+
unknowns.push(`graph.coverage.status is ${analysis.graph.coverage.status}`);
|
|
109
|
+
if (analysis.semantic_graph.coverage.status !== "complete")
|
|
110
|
+
unknowns.push(`semantic_graph.coverage.status is ${analysis.semantic_graph.coverage.status}`);
|
|
111
|
+
if (applicationUnknownCount(analysis) > 0)
|
|
112
|
+
unknowns.push(`${String(applicationUnknownCount(analysis))} application graph unknowns remain in the parent Evidence.`);
|
|
113
|
+
if (analysis.semantic_graph.unknowns.length > 0)
|
|
114
|
+
unknowns.push(`${String(analysis.semantic_graph.unknowns.length)} semantic graph unknowns remain in the parent Evidence.`);
|
|
115
|
+
return unknowns;
|
|
116
|
+
};
|
|
117
|
+
const parentFields = (parent, analysis) => ({
|
|
118
|
+
parent_evidence_id: parent.evidenceId,
|
|
119
|
+
parent_operation: "analyze_javascript_application",
|
|
120
|
+
parent_digest: parent.evidenceId.slice(3),
|
|
121
|
+
artifact: {
|
|
122
|
+
path: analysis.input_path,
|
|
123
|
+
sha256: analysis.root_artifact_sha256,
|
|
124
|
+
},
|
|
125
|
+
limitations: uniqueSorted([
|
|
126
|
+
...parent.limitations,
|
|
127
|
+
...analysis.limitations,
|
|
128
|
+
...analysis.graph.limitations,
|
|
129
|
+
...analysis.semantic_graph.limitations,
|
|
130
|
+
]),
|
|
131
|
+
unknowns: uniqueSorted([...javascriptUnknowns(analysis)]),
|
|
132
|
+
});
|
|
133
|
+
const selectModule = (modules, selector) => {
|
|
134
|
+
if ("node_id" in selector) {
|
|
135
|
+
const matches = modules.filter(({ node }) => node.node_id === selector.node_id);
|
|
136
|
+
if (matches.length === 1) {
|
|
137
|
+
const selected = matches[0];
|
|
138
|
+
if (selected !== undefined)
|
|
139
|
+
return ok(selected.node);
|
|
140
|
+
}
|
|
141
|
+
return err(inputError([
|
|
142
|
+
{
|
|
143
|
+
path: ["view", "selector", "node_id"],
|
|
144
|
+
reason: "invalid_value",
|
|
145
|
+
message: `No module has node_id ${JSON.stringify(selector.node_id)}. Page the modules collection to inspect available identities.`,
|
|
146
|
+
},
|
|
147
|
+
]));
|
|
148
|
+
}
|
|
149
|
+
if ("path" in selector) {
|
|
150
|
+
const matches = modules.filter((entry) => entry.path === selector.path);
|
|
151
|
+
if (matches.length === 1) {
|
|
152
|
+
const selected = matches[0];
|
|
153
|
+
if (selected !== undefined)
|
|
154
|
+
return ok(selected.node);
|
|
155
|
+
}
|
|
156
|
+
if (matches.length === 0)
|
|
157
|
+
return err(inputError([
|
|
158
|
+
{
|
|
159
|
+
path: ["view", "selector", "path"],
|
|
160
|
+
reason: "invalid_value",
|
|
161
|
+
message: `No module has path ${JSON.stringify(selector.path)}. Page the modules collection to inspect exact paths and node_id values.`,
|
|
162
|
+
},
|
|
163
|
+
]));
|
|
164
|
+
return err(inputError([
|
|
165
|
+
{
|
|
166
|
+
path: ["view", "selector", "path"],
|
|
167
|
+
reason: "invalid_value",
|
|
168
|
+
message: `Multiple modules have path ${JSON.stringify(selector.path)}; select one by node_id.`,
|
|
169
|
+
expected: matches.map((entry) => ({ node_id: entry.node.node_id })),
|
|
170
|
+
},
|
|
171
|
+
]));
|
|
172
|
+
}
|
|
173
|
+
return err(jsIncompatible("Module items are selected by exact path or node_id."));
|
|
174
|
+
};
|
|
175
|
+
/** Project one JavaScript application view without re-running reconstruction. */
|
|
176
|
+
export const projectJavaScriptApplicationView = (parent, analysis, view) => {
|
|
177
|
+
const shared = parentFields(parent, analysis);
|
|
178
|
+
const modules = moduleEntries(analysis.graph.nodes);
|
|
179
|
+
if (view.kind === "summary")
|
|
180
|
+
return ok({
|
|
181
|
+
kind: "summary",
|
|
182
|
+
view,
|
|
183
|
+
summary: {
|
|
184
|
+
input_path: analysis.input_path,
|
|
185
|
+
format: analysis.format,
|
|
186
|
+
root_artifact_sha256: analysis.root_artifact_sha256,
|
|
187
|
+
statistics: jsonObjectSchema.parse(analysis.statistics),
|
|
188
|
+
electron: jsonObjectSchema.parse(analysis.summary),
|
|
189
|
+
coverage: jsonObjectSchema.parse({
|
|
190
|
+
application: analysis.graph.coverage,
|
|
191
|
+
semantic: {
|
|
192
|
+
...analysis.semantic_graph.coverage,
|
|
193
|
+
families: analysis.semantic_graph.coverage.families.map(({ unknown_ids, ...family }) => ({
|
|
194
|
+
...family,
|
|
195
|
+
unknown_count: unknown_ids.length,
|
|
196
|
+
})),
|
|
197
|
+
},
|
|
198
|
+
application_unknowns: applicationUnknownCount(analysis),
|
|
199
|
+
semantic_unknowns: analysis.semantic_graph.unknowns.length,
|
|
200
|
+
}),
|
|
201
|
+
limitation_count: analysis.limitations.length,
|
|
202
|
+
},
|
|
203
|
+
coverage: completeCoverage(modules.length, analysis.graph.nodes.length),
|
|
204
|
+
...shared,
|
|
205
|
+
});
|
|
206
|
+
if (view.kind === "facet")
|
|
207
|
+
return err(jsIncompatible("facet views apply to inspect_binary_layout Evidence (mitigations or linkage)."));
|
|
208
|
+
if (view.kind === "item") {
|
|
209
|
+
if (view.collection !== "modules")
|
|
210
|
+
return err(jsIncompatible("Section and symbol collections apply to inspect_binary_layout Evidence."));
|
|
211
|
+
const selected = selectModule(modules, view.selector);
|
|
212
|
+
if (!selected.ok)
|
|
213
|
+
return selected;
|
|
214
|
+
return ok({
|
|
215
|
+
kind: "item",
|
|
216
|
+
view,
|
|
217
|
+
item: moduleItem(selected.value),
|
|
218
|
+
coverage: completeCoverage(1, modules.length),
|
|
219
|
+
...shared,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
if (view.collection !== "modules")
|
|
223
|
+
return err(jsIncompatible("Section and symbol collections apply to inspect_binary_layout Evidence."));
|
|
224
|
+
const items = modules
|
|
225
|
+
.slice(view.offset, view.offset + view.limit)
|
|
226
|
+
.map(({ node, path }) => ({
|
|
227
|
+
node_id: node.node_id,
|
|
228
|
+
kind: node.kind,
|
|
229
|
+
path,
|
|
230
|
+
}));
|
|
231
|
+
return ok({
|
|
232
|
+
kind: "page",
|
|
233
|
+
view,
|
|
234
|
+
items,
|
|
235
|
+
coverage: pageCoverage(view.offset, items.length, modules.length),
|
|
236
|
+
...shared,
|
|
237
|
+
});
|
|
238
|
+
};
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { localPathStringSchema } from "../localPath.js";
|
|
2
3
|
const target = {
|
|
3
|
-
path:
|
|
4
|
-
.string()
|
|
5
|
-
.min(1)
|
|
6
|
-
.describe("Local APK path; the target is never executed"),
|
|
4
|
+
path: localPathStringSchema.describe("Local APK path; the target is never executed"),
|
|
7
5
|
};
|
|
8
6
|
const classTarget = {
|
|
9
7
|
...target,
|
|
@@ -5,6 +5,7 @@ import { parseArtifactInventoryEvidence } from "../artifactInventoryEvidence.js"
|
|
|
5
5
|
import { evidenceSchema } from "../evidence.js";
|
|
6
6
|
import { digestSchema } from "../digests.js";
|
|
7
7
|
import { prefixedDigestSchema } from "../digests.js";
|
|
8
|
+
import { bridgeCandidateCoverageSchema, projectCartesianCandidates, } from "../bridgeCandidateProjection.js";
|
|
8
9
|
const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
9
10
|
const pathSchema = z.string().min(1);
|
|
10
11
|
const componentSchema = z.strictObject({
|
|
@@ -52,6 +53,7 @@ export const androidApplicationProjectionResultSchema = z.strictObject({
|
|
|
52
53
|
"unity-convention",
|
|
53
54
|
]),
|
|
54
55
|
})),
|
|
56
|
+
bridge_candidate_coverage: bridgeCandidateCoverageSchema,
|
|
55
57
|
coverage: z.strictObject({
|
|
56
58
|
status: z.enum(["complete-within-inventory", "partial"]),
|
|
57
59
|
inventory_complete: z.boolean(),
|
|
@@ -75,7 +77,7 @@ export const projectAndroidApplication = (input) => {
|
|
|
75
77
|
path: occurrence.logical_path,
|
|
76
78
|
artifact_id: node.artifact_id,
|
|
77
79
|
sha256: node.sha256,
|
|
78
|
-
format:
|
|
80
|
+
format: occurrence.artifact_format,
|
|
79
81
|
};
|
|
80
82
|
});
|
|
81
83
|
const classified = classify(all);
|
|
@@ -88,6 +90,11 @@ export const projectAndroidApplication = (input) => {
|
|
|
88
90
|
"Manifest, resource, signing, and bytecode semantics require a dedicated Android provider; this projection reports exact inventory paths and hashes only.",
|
|
89
91
|
"Runtime families are inferred from inventory formats and paths; filename suffixes do not establish valid DEX or JVM class bytes.",
|
|
90
92
|
"Bridge candidates are path-based hypotheses, not decoded JNI declarations or observed runtime calls.",
|
|
93
|
+
...(bridgeProjection.coverage.status === "partial"
|
|
94
|
+
? [
|
|
95
|
+
`Bridge candidate pairs exceeded the projection safety budget; ${bridgeProjection.coverage.omitted_candidates} hypotheses are omitted. Component arrays still include every component from the supplied inventory pages.`,
|
|
96
|
+
]
|
|
97
|
+
: []),
|
|
91
98
|
];
|
|
92
99
|
const withoutId = {
|
|
93
100
|
root_sha256: inventory.manifest.root_sha256,
|
|
@@ -98,8 +105,9 @@ export const projectAndroidApplication = (input) => {
|
|
|
98
105
|
components,
|
|
99
106
|
runtime_families: runtimeFamilies(all),
|
|
100
107
|
bridge_candidates: bridgeProjection.candidates,
|
|
108
|
+
bridge_candidate_coverage: bridgeProjection.coverage,
|
|
101
109
|
coverage: {
|
|
102
|
-
status: inventory.complete
|
|
110
|
+
status: inventory.complete && bridgeProjection.coverage.status === "complete"
|
|
103
111
|
? "complete-within-inventory"
|
|
104
112
|
: "partial",
|
|
105
113
|
inventory_complete: inventory.complete,
|
|
@@ -141,14 +149,14 @@ const runtimeFamilies = (all) => {
|
|
|
141
149
|
return [...families].sort(compare);
|
|
142
150
|
};
|
|
143
151
|
const bridgeCandidates = (managed, native) => {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
};
|
|
152
|
+
return projectCartesianCandidates({
|
|
153
|
+
groups: [{ left: managed, right: native }],
|
|
154
|
+
createCandidate: (managed_path, target) => ({
|
|
155
|
+
managed_path,
|
|
156
|
+
native_path: target.path,
|
|
157
|
+
basis: bridgeBasis(target.path),
|
|
158
|
+
}),
|
|
159
|
+
});
|
|
152
160
|
};
|
|
153
161
|
const bridgeBasis = (path) => {
|
|
154
162
|
const lower = path.toLowerCase();
|
|
@@ -6,6 +6,7 @@ import { parseArtifactInventoryEvidence } from "../artifactInventoryEvidence.js"
|
|
|
6
6
|
import { evidenceSchema } from "../evidence.js";
|
|
7
7
|
import { digestSchema } from "../digests.js";
|
|
8
8
|
import { prefixedDigestSchema } from "../digests.js";
|
|
9
|
+
import { bridgeCandidateCoverageSchema, projectCartesianCandidates, } from "../bridgeCandidateProjection.js";
|
|
9
10
|
const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
10
11
|
const pathSchema = z.string().min(1);
|
|
11
12
|
const APPLE_ROOT_FORMATS = ["ipa", "directory", "zip", "dmg"];
|
|
@@ -52,6 +53,7 @@ export const appleApplicationProjectionResultSchema = z.strictObject({
|
|
|
52
53
|
"unity-convention",
|
|
53
54
|
]),
|
|
54
55
|
})),
|
|
56
|
+
bridge_candidate_coverage: bridgeCandidateCoverageSchema,
|
|
55
57
|
coverage: z.strictObject({
|
|
56
58
|
status: z.enum(["complete-within-inventory", "partial"]),
|
|
57
59
|
inventory_complete: z.boolean(),
|
|
@@ -83,7 +85,7 @@ export const projectAppleApplication = (input) => {
|
|
|
83
85
|
path: occurrence.logical_path,
|
|
84
86
|
artifact_id: node.artifact_id,
|
|
85
87
|
sha256: node.sha256,
|
|
86
|
-
format:
|
|
88
|
+
format: occurrence.artifact_format,
|
|
87
89
|
},
|
|
88
90
|
};
|
|
89
91
|
});
|
|
@@ -110,6 +112,7 @@ export const projectAppleApplication = (input) => {
|
|
|
110
112
|
sidecars: entries.some(({ path }) => isSidecar(path)),
|
|
111
113
|
symlinks: entries.some(({ kind }) => kind === "symlink"),
|
|
112
114
|
unattributed,
|
|
115
|
+
bridgeCandidateCoverage: bridgeProjection.coverage,
|
|
113
116
|
});
|
|
114
117
|
const withoutId = {
|
|
115
118
|
root_sha256: inventory.manifest.root_sha256,
|
|
@@ -127,8 +130,9 @@ export const projectAppleApplication = (input) => {
|
|
|
127
130
|
.sort(compare),
|
|
128
131
|
runtime_families: runtimeFamilies,
|
|
129
132
|
bridge_candidates: bridgeProjection.candidates,
|
|
133
|
+
bridge_candidate_coverage: bridgeProjection.coverage,
|
|
130
134
|
coverage: {
|
|
131
|
-
status: complete
|
|
135
|
+
status: complete && bridgeProjection.coverage.status === "complete"
|
|
132
136
|
? "complete-within-inventory"
|
|
133
137
|
: "partial",
|
|
134
138
|
inventory_complete: inventory.complete,
|
|
@@ -137,9 +141,11 @@ export const projectAppleApplication = (input) => {
|
|
|
137
141
|
};
|
|
138
142
|
return appleApplicationProjectionResultSchema.parse({
|
|
139
143
|
...withoutId,
|
|
140
|
-
projection_id:
|
|
144
|
+
projection_id: appleProjectionId(withoutId),
|
|
141
145
|
});
|
|
142
146
|
};
|
|
147
|
+
/** Identify the complete projection, including source Evidence provenance. */
|
|
148
|
+
export const appleProjectionId = (projection) => `aap_${digest(projection)}`;
|
|
143
149
|
/**
|
|
144
150
|
* IPA projection keeps every archive component, as before. Directory, ZIP,
|
|
145
151
|
* and DMG inventories can hold installers and other siblings, so only
|
|
@@ -204,21 +210,37 @@ const identifyRuntimeFamilies = (all) => {
|
|
|
204
210
|
families.add("unity");
|
|
205
211
|
return [...families].sort(compare);
|
|
206
212
|
};
|
|
207
|
-
/** Pair scripts and native code
|
|
213
|
+
/** Pair scripts and native code within matching application-root groups. */
|
|
208
214
|
const identifyBridgeCandidates = (scripts, native, roots) => {
|
|
209
215
|
const owner = (path) => roots.find((root) => isWithin(path, root)) ?? null;
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
216
|
+
const scriptGroups = [];
|
|
217
|
+
for (const script of scripts) {
|
|
218
|
+
const root = owner(script.path);
|
|
219
|
+
const last = scriptGroups.at(-1);
|
|
220
|
+
if (last?.root === root)
|
|
221
|
+
last.left.push(script);
|
|
222
|
+
else
|
|
223
|
+
scriptGroups.push({ root, left: [script] });
|
|
224
|
+
}
|
|
225
|
+
const nativeByRoot = new Map();
|
|
226
|
+
for (const item of native) {
|
|
227
|
+
const root = owner(item.path);
|
|
228
|
+
const scoped = nativeByRoot.get(root) ?? [];
|
|
229
|
+
scoped.push(item);
|
|
230
|
+
nativeByRoot.set(root, scoped);
|
|
231
|
+
}
|
|
232
|
+
const groups = scriptGroups.map(({ root, left }) => ({
|
|
233
|
+
left,
|
|
234
|
+
right: nativeByRoot.get(root) ?? [],
|
|
235
|
+
}));
|
|
236
|
+
return projectCartesianCandidates({
|
|
237
|
+
groups,
|
|
238
|
+
createCandidate: (source_path, item) => ({
|
|
239
|
+
source_path,
|
|
240
|
+
native_path: item.path,
|
|
241
|
+
basis: bridgeBasis(item.path),
|
|
220
242
|
}),
|
|
221
|
-
};
|
|
243
|
+
});
|
|
222
244
|
};
|
|
223
245
|
const bridgeBasis = (path) => {
|
|
224
246
|
const lower = path.toLowerCase();
|
|
@@ -264,6 +286,11 @@ const projectionLimitations = (facts) => [
|
|
|
264
286
|
"AppleDouble sidecar entries (._* files and __MACOSX/) describe neighbouring files and are excluded from bundle roles.",
|
|
265
287
|
]
|
|
266
288
|
: []),
|
|
289
|
+
...(facts.bridgeCandidateCoverage.status === "partial"
|
|
290
|
+
? [
|
|
291
|
+
`Bridge candidate pairs exceeded the projection safety budget; ${facts.bridgeCandidateCoverage.omitted_candidates} hypotheses are omitted. Component arrays still include every component from the supplied inventory pages.`,
|
|
292
|
+
]
|
|
293
|
+
: []),
|
|
267
294
|
"Bundle roles follow path conventions. Read each info_plist_path with inspect_plist for CFBundleExecutable, identifiers, and declared services.",
|
|
268
295
|
"Bundle identifiers and signing claims require dedicated plist and CMS parsing; this projection reports only exact paths and hashes.",
|
|
269
296
|
"Bridge candidates are path-based hypotheses, not observed runtime calls.",
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** Retain recognized image-selection settings separately from diagnostic observations. */
|
|
2
|
+
export const embeddedDyldOverrides = (environment, platforms) => {
|
|
3
|
+
const overrides = [];
|
|
4
|
+
for (const setting of environment) {
|
|
5
|
+
const delimiter = setting.indexOf("=");
|
|
6
|
+
if (delimiter <= 0)
|
|
7
|
+
continue;
|
|
8
|
+
const variable = setting.slice(0, delimiter);
|
|
9
|
+
const value = setting.slice(delimiter + 1);
|
|
10
|
+
const effect = overrideEffect(variable, value);
|
|
11
|
+
if (effect === undefined)
|
|
12
|
+
continue;
|
|
13
|
+
// ROOT_PATH is accepted only for simulator processes. Missing or unknown
|
|
14
|
+
// platform metadata cannot establish that dyld ignores it.
|
|
15
|
+
if (variable === "DYLD_ROOT_PATH" &&
|
|
16
|
+
platforms.length > 0 &&
|
|
17
|
+
platforms.every((platform) => platform >= 1 && platform <= 12) &&
|
|
18
|
+
!platforms.some((platform) => [7, 8, 9, 12].includes(platform)))
|
|
19
|
+
continue;
|
|
20
|
+
overrides.push({ variable, value, ...effect });
|
|
21
|
+
}
|
|
22
|
+
return overrides;
|
|
23
|
+
};
|
|
24
|
+
const overrideEffect = (variable, value) => {
|
|
25
|
+
switch (variable) {
|
|
26
|
+
// Empty directory components still produce /leaf candidates in dyld.
|
|
27
|
+
// In particular, an empty fallback value is not a no-op.
|
|
28
|
+
case "DYLD_LIBRARY_PATH":
|
|
29
|
+
return { phase: "override", scope: "library" };
|
|
30
|
+
case "DYLD_FRAMEWORK_PATH":
|
|
31
|
+
return { phase: "override", scope: "framework" };
|
|
32
|
+
case "DYLD_FALLBACK_LIBRARY_PATH":
|
|
33
|
+
return { phase: "fallback", scope: "library" };
|
|
34
|
+
case "DYLD_FALLBACK_FRAMEWORK_PATH":
|
|
35
|
+
return { phase: "fallback", scope: "framework" };
|
|
36
|
+
// Versioned paths map discovered images to their reported install names,
|
|
37
|
+
// so the directory's kind does not establish the replaced image's kind.
|
|
38
|
+
case "DYLD_VERSIONED_LIBRARY_PATH":
|
|
39
|
+
case "DYLD_VERSIONED_FRAMEWORK_PATH":
|
|
40
|
+
case "DYLD_IMAGE_SUFFIX":
|
|
41
|
+
// Versioned paths scan directories; suffixes create path variants.
|
|
42
|
+
// Empty directories cannot be scanned and empty suffixes repeat a path.
|
|
43
|
+
return /[^:]/u.test(value)
|
|
44
|
+
? { phase: "override", scope: "all" }
|
|
45
|
+
: undefined;
|
|
46
|
+
case "DYLD_INSERT_LIBRARIES":
|
|
47
|
+
return value === "" ? undefined : { phase: "override", scope: "all" };
|
|
48
|
+
case "DYLD_ROOT_PATH":
|
|
49
|
+
case "DYLD_OVERLAY_PATH":
|
|
50
|
+
return value === "" ? undefined : { phase: "override", scope: "prefix" };
|
|
51
|
+
default:
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const isFrameworkInstallName = (name, overrides) => {
|
|
56
|
+
const separator = name.lastIndexOf(".framework/");
|
|
57
|
+
if (separator < 0)
|
|
58
|
+
return false;
|
|
59
|
+
const framework = name.slice(0, separator).split("/").at(-1);
|
|
60
|
+
const leaf = name.slice(name.lastIndexOf("/") + 1);
|
|
61
|
+
return (leaf === framework ||
|
|
62
|
+
overrides.some(({ variable, value }) => variable === "DYLD_IMAGE_SUFFIX" && leaf === `${framework}${value}`));
|
|
63
|
+
};
|
|
64
|
+
/** Select only settings that can affect this dependency at its reached search phase. */
|
|
65
|
+
export const hasApplicableDyldOverrides = (overrides, installName, ordinarySearchFoundImage) => {
|
|
66
|
+
const kind = isFrameworkInstallName(installName, overrides)
|
|
67
|
+
? "framework"
|
|
68
|
+
: "library";
|
|
69
|
+
return overrides.some(({ phase, scope }) => (phase === "override" || !ordinarySearchFoundImage) &&
|
|
70
|
+
(scope === "all" ||
|
|
71
|
+
scope === kind ||
|
|
72
|
+
(scope === "prefix" && !installName.startsWith("@"))));
|
|
73
|
+
};
|