rea-agents 5.0.0 → 6.1.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 +168 -655
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +173 -47
- package/bridge/hopper_bridge.py +310 -128
- package/bridge/mitmproxy/capture.py +208 -0
- package/bridge/native/rea_lldb_tracer.py +839 -0
- package/bridge/process/ProcessRunTokenReader.swift +297 -0
- package/bridge/process/ProcessRunTokenReaderMain.swift +35 -0
- package/bridge/pwndbg/core_context.py +101 -0
- package/bridge/pwndbg/launch.py +39 -0
- package/bridge/pwndbg/launch_impl.py +34 -0
- package/bridge/pwntools/decoder_runtime.py +59 -0
- package/bridge/pwntools/layout.py +39 -0
- package/bridge/pwntools/layout_impl.py +309 -0
- package/bridge/pwntools/recorded_crash.py +39 -0
- package/bridge/pwntools/recorded_crash_impl.py +147 -0
- package/dist/android/JadxConfiguration.js +196 -33
- package/dist/android/JadxMcpTransport.js +4 -0
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +20 -2
- 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/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +27 -3
- package/dist/application/ClientConfigurationDocument.js +871 -6
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +97 -33
- package/dist/application/Doctor.js +4 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +13 -11
- package/dist/application/EvidenceBundleFiles.js +24 -12
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +3 -2
- package/dist/application/JsonFiles.js +50 -28
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +5 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/Setup.js +13 -1
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +5 -2
- package/dist/application/SetupPlan.js +5 -3
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +4 -3
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateRuntime.js +46 -25
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCapturePort.js +1 -0
- package/dist/application/WebNetworkCaptureService.js +134 -0
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +2 -2
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WindowsCapabilities.js +1 -1
- package/dist/application/WorkflowEvidence.js +82 -0
- package/dist/application/binary/AnalysisProviderEvaluation.js +21 -5
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -0
- package/dist/application/binary/AnalysisSnapshotCache.js +52 -12
- package/dist/application/binary/BinarySession.js +131 -76
- package/dist/application/binary/BinarySessionOpen.js +19 -6
- package/dist/application/binary/BinarySessionRecords.js +45 -3
- package/dist/application/binary/BinarySessionStatus.js +17 -1
- package/dist/application/binary/CompositeProvider.js +13 -0
- package/dist/application/binary/LazyAnalysisProvider.js +3 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutPort.js +1 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +59 -0
- package/dist/application/binaryDiagnostics/RecordedCrashPort.js +1 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +62 -0
- package/dist/application/evm/EvmInterfacePort.js +1 -0
- package/dist/application/evm/EvmInterfaceService.js +64 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +25 -5
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +34 -14
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +47 -27
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +39 -7
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +26 -2
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +80 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +33 -12
- package/dist/application/javascript/JavaScriptModuleRelationships.js +37 -8
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -1
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +7 -7
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +149 -72
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +14 -15
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +41 -1
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +7 -7
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -9
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +118 -12
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +27 -5
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +7 -4
- package/dist/application/managed/ManagedNativeVerificationService.js +4 -3
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/{ProcessCli.js → process/ProcessCli.js} +23 -15
- package/dist/application/{ProcessEvidence.js → process/ProcessEvidence.js} +8 -7
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +42 -5
- package/dist/artifacts/ArtifactProviderMetadata.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +98 -14
- package/dist/artifacts/NativeDmgArtifactReader.js +13 -6
- package/dist/artifacts/ZipArtifactReader.js +3 -0
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +22 -3
- package/dist/artifacts/apple/DylibResolutionReader.js +259 -0
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +36 -22
- package/dist/artifacts/apple/MachoLoadCommandReader.js +355 -0
- 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/{application → artifacts/extraction}/ArtifactExtraction.js +10 -10
- package/dist/{application → artifacts/inventory}/ArtifactGraphConstruction.js +16 -11
- package/dist/{application → artifacts/inventory}/ArtifactInventory.js +4 -4
- package/dist/{application/ArtifactInventory → artifacts/inventory}/classify.js +2 -2
- package/dist/{application/ArtifactInventory → artifacts/inventory}/reader.js +5 -5
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanCanonical.js +14 -17
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanReader.js +5 -5
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/artifacts/readStableArtifact.js +20 -4
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +165 -12
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +34 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/PlaywrightElectronActiveActions.js +32 -23
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +130 -122
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/history/CaptureFailures.js +137 -0
- package/dist/browser/history/CaptureFormatError.js +10 -0
- package/dist/browser/history/CaptureRedaction.js +65 -0
- package/dist/browser/history/CaptureRelease.js +17 -0
- package/dist/browser/history/HarCapture.js +165 -0
- package/dist/browser/history/HarCaptureAdapter.js +20 -0
- package/dist/browser/history/HarCaptureProcess.js +57 -0
- package/dist/browser/history/HarJson.js +92 -0
- package/dist/browser/history/HarSchema.js +72 -0
- package/dist/browser/history/HistoricalCaptureDecoder.js +188 -0
- package/dist/browser/history/HistoricalCaptureFormatAdapter.js +1 -0
- package/dist/browser/history/MitmproxyCaptureAdapter.js +42 -0
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +26 -1
- package/dist/cli/binaryDiagnosticsCommands.js +39 -0
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +78 -20
- package/dist/cli/electronCommands.js +21 -13
- package/dist/cli/evmCommands.js +24 -0
- package/dist/cli/firmwareCommands.js +6 -3
- package/dist/cli/javascriptApplicationAnalysis.js +20 -3
- package/dist/cli/jsonOutput.js +38 -0
- package/dist/cli/nativeCallCommands.js +34 -0
- package/dist/cli/processCommands.js +1 -1
- package/dist/cli/streamedJsonOutput.js +56 -0
- package/dist/cli/utilityCommands.js +2 -0
- package/dist/cli/webNetworkCaptureCommands.js +40 -0
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +11 -4
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +6 -1
- package/dist/cliJsonInput.js +35 -1
- package/dist/cliOutput.js +21 -6
- package/dist/composition/binaryDiagnostics.js +8 -0
- package/dist/composition/evm.js +4 -0
- package/dist/composition/webNetworkCaptures.js +6 -0
- package/dist/config/environment.js +4 -0
- package/dist/config/ghidraStartupTimeout.js +17 -0
- package/dist/config/mcpResponseBudget.js +22 -0
- package/dist/config/parseConfig.js +2 -1
- package/dist/contracts/artifactToolContracts.js +6 -0
- package/dist/contracts/browserCaptureToolInputSchema.js +43 -0
- package/dist/contracts/browserToolContracts.js +4 -3
- package/dist/contracts/enhancedInputs.js +5 -3
- package/dist/contracts/enhancedToolContracts.js +3 -3
- package/dist/contracts/errorSchemas.js +8 -1
- package/dist/contracts/evm/evmToolContracts.js +20 -0
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/investigationExamples.js +2 -2
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +8 -6
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +42 -0
- package/dist/contracts/native/nativeToolContracts.js +21 -3
- package/dist/contracts/officialToolContracts.js +26 -24
- package/dist/contracts/process/processCaptureExample.js +2 -0
- package/dist/contracts/promptContracts.js +3 -3
- package/dist/contracts/sessionLifecycleInputs.js +18 -5
- package/dist/contracts/sessionStatusContract.js +8 -2
- package/dist/contracts/sessionToolContracts.js +8 -3
- package/dist/contracts/sessionToolSchemas.js +8 -4
- package/dist/contracts/toolContractExamples.js +1 -2
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +30 -1
- package/dist/contracts/toolOutputSchemaGroups.js +33 -28
- package/dist/contracts/toolOutputSchemaPrimitives.js +19 -1
- package/dist/contracts/toolSchemaMetadata.js +69 -10
- package/dist/contracts/webNetworkCaptureToolContracts.js +24 -0
- package/dist/domain/analysisErrorBase.js +22 -2
- package/dist/domain/analysisErrorCore.js +61 -5
- package/dist/domain/analysisErrorPresentation.js +95 -12
- package/dist/domain/analysisErrorProjection.js +148 -19
- package/dist/domain/analysisSnapshot.js +166 -2
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +17 -9
- package/dist/domain/apple/appleApplication.js +41 -14
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dyldPaths.js +81 -0
- package/dist/domain/apple/dylibResolution.js +478 -0
- package/dist/domain/apple/dylibResolutionFindings.js +77 -0
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -13
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +9 -1
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +19 -24
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserObservation.js +1 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +13 -0
- package/dist/domain/browserScenarioValues.js +5 -2
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPathSchemas.js +1 -1
- package/dist/domain/canonicalDigest.js +13 -1
- 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/comparisonStatus.js +2 -30
- package/dist/domain/configurationErrors.js +1 -1
- package/dist/domain/conformanceTrustGate.js +0 -16
- package/dist/domain/evidence.js +78 -11
- package/dist/domain/evidenceBundle.js +42 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/evm/evmInterface.js +63 -0
- package/dist/domain/explicitSensitiveFailure.js +108 -0
- package/dist/domain/explicitSensitiveValues.js +10 -0
- package/dist/domain/firmware/firmwareAnalysis.js +10 -4
- 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 +37 -6
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/htmlArtifactReferences.js +40 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationGraph.js +13 -0
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +21 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +0 -10
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +97 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +22 -5
- package/dist/domain/javascript/javascriptSemanticGraph.js +34 -5
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +25 -17
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +83 -11
- 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 +14 -4
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -16
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +91 -3
- package/dist/domain/localPath.js +8 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -9
- package/dist/domain/native/binaryLayout.js +357 -0
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeCallObservation.js +186 -0
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/objcSwiftMetadata.js +0 -39
- package/dist/domain/native/recordedCrash.js +266 -0
- package/dist/domain/native/recordedCrashNoteCoverage.js +73 -0
- package/dist/domain/{processCapture.js → process/processCapture.js} +143 -2
- package/dist/domain/{processCaptureExample.js → process/processCaptureExample.js} +5 -0
- package/dist/domain/process/processCaptureParsing.js +54 -0
- package/dist/domain/{processCaptureValidation.js → process/processCaptureValidation.js} +18 -2
- package/dist/domain/{processComparison.js → process/processComparison.js} +39 -5
- package/dist/domain/{processObservation.js → process/processObservation.js} +1 -1
- package/dist/domain/{processScenario.js → process/processScenario.js} +11 -10
- package/dist/domain/{processTraceSpecification.js → process/processTraceSpecification.js} +1 -1
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +1 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/providerSelectionError.js +4 -2
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +3 -3
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +9 -46
- 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 +1 -0
- package/dist/domain/webNetworkCapture.js +118 -0
- package/dist/domain/webNetworkCaptureCoordinates.js +58 -0
- package/dist/domain/webRuntime.js +19 -5
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedExceptionRegionValidation.js +41 -0
- package/dist/dotnet/ManagedMemberInspector.js +4 -2
- package/dist/dotnet/ManagedMemberInspectorCore.js +38 -32
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +23 -7
- package/dist/dotnet/ManagedMemberRows.js +14 -3
- package/dist/dotnet/ManagedMetadataHeaps.js +20 -2
- package/dist/dotnet/ManagedMetadataInventory.js +38 -28
- package/dist/dotnet/ManagedMetadataInventoryRows.js +24 -10
- package/dist/dotnet/ManagedMethodBodyReader.js +7 -1
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +15 -3
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +3 -1
- package/dist/dotnet/ManagedPeReader.js +11 -0
- package/dist/evm/EvmBytecodeCarrier.js +21 -0
- package/dist/evm/EvmWorkerLimits.js +40 -0
- package/dist/evm/EvmoleFailures.js +126 -0
- package/dist/evm/EvmoleInterfaceAdapter.js +53 -0
- package/dist/evm/EvmoleInterfaceProvider.js +273 -0
- package/dist/evm/EvmoleInterfaceWorker.js +87 -0
- package/dist/evm/EvmoleRelease.js +16 -0
- package/dist/firmware/FirmwareCommand.js +1 -0
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +5 -0
- package/dist/ghidra/GhidraClient.js +47 -14
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraFunctionValues.js +10 -7
- package/dist/ghidra/GhidraInstallation.js +18 -21
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +62 -0
- package/dist/ghidra/GhidraLauncher.js +34 -16
- package/dist/ghidra/GhidraProvider.js +2 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +15 -3
- package/dist/ghidra/GhidraProviderClient.js +23 -12
- package/dist/ghidra/GhidraSessionError.js +11 -7
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/hopper/BridgeLauncher.js +33 -11
- package/dist/hopper/HopperAnalysisProfile.js +62 -4
- package/dist/hopper/HopperCleanup.js +15 -3
- package/dist/hopper/HopperClient.js +222 -14
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +196 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +63 -9
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +137 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +3 -2
- package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +8 -3
- package/dist/inspector/V8InspectorProvider.js +47 -11
- package/dist/javascript/recovery/WakaruCommand.js +3 -0
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +17 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- 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 +32 -16
- 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 +82 -84
- package/dist/native/LldbCallTracer.js +541 -0
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +194 -0
- package/dist/native/NativeMacOSProvider.js +117 -20
- package/dist/native/NativeMacOSProviderMetadata.js +8 -3
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +180 -0
- package/dist/native/pwntools/PwntoolsDecoder.js +203 -0
- package/dist/native/pwntools/PwntoolsFailures.js +180 -0
- package/dist/native/pwntools/PwntoolsLayoutProvider.js +36 -0
- package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +75 -0
- package/dist/native/pwntools/PwntoolsRelease.js +19 -0
- package/dist/native/pwntools/PwntoolsResourceLimits.js +76 -0
- package/dist/native/pwntools/RecordedCrashSourceBindings.js +46 -0
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +103 -0
- package/dist/process/DarwinProcessRunTokenReader.js +293 -0
- package/dist/process/ExecFileOutput.js +20 -0
- package/dist/process/OwnedCommand.js +118 -0
- package/dist/process/ProcessOwnership.js +431 -51
- package/dist/process/ProcessOwnershipObservation.js +209 -27
- package/dist/process/ProviderProcess.js +68 -10
- package/dist/{application → process/capture}/ProcessCaptureCapability.js +15 -0
- package/dist/{application → process/capture}/ProcessCaptureError.js +18 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +681 -0
- package/dist/{application → process/capture}/ProcessHarness.js +195 -29
- package/dist/{application → process/capture}/ProcessSampling.js +2 -2
- package/dist/server/EvidenceMcpServer.js +146 -0
- package/dist/server/createServer.js +37 -8
- package/dist/server/promptCompletion.js +10 -3
- package/dist/server/registerAndroidTools.js +2 -4
- package/dist/server/registerApplicationTools/helpers.js +2 -4
- package/dist/server/registerArtifactComparisonTool.js +11 -7
- package/dist/server/registerBinaryDiagnosticsTools.js +15 -0
- package/dist/server/registerBrowserScenarioTool.js +2 -4
- package/dist/server/registerBrowserTools.js +2 -4
- package/dist/server/registerBundleComparisonTool.js +2 -3
- package/dist/server/registerCloseLifecycleTool.js +8 -18
- package/dist/server/registerElectronTools.js +2 -4
- package/dist/server/registerEnhancedTools.js +18 -59
- package/dist/server/registerEvidenceTools.js +3 -5
- package/dist/server/registerEvmTools.js +15 -0
- package/dist/server/registerFirmwareTools.js +2 -4
- package/dist/server/registerFunctionComparisonTool.js +10 -6
- package/dist/server/registerInvestigationTools.js +7 -7
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -4
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -4
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +2 -4
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +2 -4
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -4
- package/dist/server/registerOfficialTools.js +2 -4
- package/dist/server/registerProcessComparisonTool.js +72 -46
- package/dist/server/registerRecordedCrashTools.js +15 -0
- package/dist/server/registerSessionRecordTools.js +5 -6
- package/dist/server/registerSessionStatusTool.js +17 -3
- package/dist/server/registerSessionTools.js +13 -5
- package/dist/server/registerWebModuleTool.js +2 -4
- package/dist/server/registerWebNetworkCaptureTool.js +26 -0
- package/dist/server/registerWebRuntimeTools.js +3 -7
- package/dist/server/registerWebScriptTool.js +2 -4
- package/dist/server/registerWebSourceLocationTool.js +2 -4
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +3 -1
- package/dist/server/sessionToolPolicies.js +1 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +63 -11
- package/dist/server/toolResultEncoding.js +33 -0
- package/install.sh +1 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +42 -9
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +11 -3
- package/skills/reverse-engineer-anything/SKILL.md +32 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +8 -1
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +29 -0
- package/third_party/README.md +60 -0
- package/third_party/evmole/LICENSE +21 -0
- package/third_party/evmole/README.md +22 -0
- package/third_party/pwndbg/LICENSE.md +21 -0
- package/third_party/pwndbg/README.md +23 -0
- package/third_party/pwntools/README.md +40 -0
- package/dist/application/AuthorizedArtifactInventory.js +0 -7
- package/dist/application/ProcessCaptureLifecycle.js +0 -299
- package/dist/application/StoreFileLock.js +0 -124
- package/dist/contracts/processCaptureExample.js +0 -2
- package/dist/domain/bytecodeProvider.js +0 -178
- package/dist/domain/customProtocolCapture.js +0 -137
- package/dist/domain/eventProcessTree.js +0 -225
- package/dist/domain/mobileApplicationInvestigation.js +0 -159
- package/dist/domain/packageAnalysis.js +0 -123
- package/dist/domain/peInspection.js +0 -197
- package/dist/domain/processCaptureParsing.js +0 -21
- package/dist/domain/protocolCapture.js +0 -217
- package/dist/domain/runtimeIdentification.js +0 -212
- package/dist/generatedMcpToolCatalog.js +0 -37
- package/dist/ghidra/GhidraDefaults.js +0 -2
- /package/dist/application/{ArtifactExtractionDestination.js → artifacts/ArtifactExtractionDestination.js} +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/policy.js +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/types.js +0 -0
- /package/dist/domain/{processEvidenceProvider.js → process/processEvidenceProvider.js} +0 -0
- /package/dist/domain/{processTraceComparison.js → process/processTraceComparison.js} +0 -0
- /package/dist/domain/{processTraceDimensionProjection.js → process/processTraceDimensionProjection.js} +0 -0
- /package/dist/domain/{processTraceEvaluation.js → process/processTraceEvaluation.js} +0 -0
- /package/dist/{application → process/capture}/FilesystemSnapshot.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureEnvironment.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureJournal.js +0 -0
- /package/dist/{application → process/capture}/ProcessFilesystemEffects.js +0 -0
- /package/dist/{application → process/capture}/ProcessNormalization.js +0 -0
- /package/dist/{application → process/capture}/ProcessScenarioRuntimeValidation.js +0 -0
- /package/dist/{application → process/capture}/ProcessTimer.js +0 -0
- /package/dist/{application → process/capture}/TerminalRenderer.js +0 -0
|
@@ -77,11 +77,26 @@ const entrySchema = z.object({
|
|
|
77
77
|
subject: subjectSchema.nullable(),
|
|
78
78
|
}),
|
|
79
79
|
});
|
|
80
|
+
const workflowEntrySchema = z.object({
|
|
81
|
+
query_id: prefixedDigestSchema("query"),
|
|
82
|
+
operation: z.string().min(1),
|
|
83
|
+
parameters: jsonObjectSchema,
|
|
84
|
+
execution: z.object({
|
|
85
|
+
result: jsonValueSchema,
|
|
86
|
+
raw_result: jsonValueSchema.nullable(),
|
|
87
|
+
provider: committedProviderSchema,
|
|
88
|
+
analysis_profile: analysisProfileSchema,
|
|
89
|
+
limitations: z.array(z.string()),
|
|
90
|
+
locations: z.array(evidenceLocationSchema),
|
|
91
|
+
subject: subjectSchema.nullable(),
|
|
92
|
+
}),
|
|
93
|
+
});
|
|
80
94
|
/** Provider- and profile-exact cache of successful immutable analysis calls. */
|
|
81
95
|
export const analysisSnapshotSchema = z.object({
|
|
82
96
|
target: targetSchema,
|
|
83
97
|
binding: bindingSchema,
|
|
84
98
|
entries: z.array(entrySchema),
|
|
99
|
+
workflow_entries: z.array(workflowEntrySchema).optional(),
|
|
85
100
|
evidence_bundle: evidenceBundleSchema,
|
|
86
101
|
});
|
|
87
102
|
const canonicalJson = (value) => {
|
|
@@ -122,6 +137,11 @@ export const snapshotEvidenceForQuery = (snapshot, query) => {
|
|
|
122
137
|
if (!snapshotMatchesBinding(snapshot, target, bindingProfile))
|
|
123
138
|
return undefined;
|
|
124
139
|
const encodedParameters = canonicalJson(parameters);
|
|
140
|
+
const queryId = analysisQueryId(snapshot.target, snapshot.binding, operation, parameters);
|
|
141
|
+
const entry = snapshot.entries.find((candidate) => candidate.query_id === queryId);
|
|
142
|
+
const workflowEntry = snapshot.workflow_entries?.find((candidate) => candidate.query_id === queryId);
|
|
143
|
+
if (entry === undefined && workflowEntry === undefined)
|
|
144
|
+
return undefined;
|
|
125
145
|
return snapshot.evidence_bundle.records.find((record) => record.subject?.digest.sha256 === target.sha256 &&
|
|
126
146
|
record.operation === operation &&
|
|
127
147
|
record.provider.id === provider.id &&
|
|
@@ -129,8 +149,54 @@ export const snapshotEvidenceForQuery = (snapshot, query) => {
|
|
|
129
149
|
record.provider.version === provider.version &&
|
|
130
150
|
"analysis_profile" in record &&
|
|
131
151
|
analysisProfilesEqual(record.analysis_profile, evidenceProfile) &&
|
|
132
|
-
canonicalJson(record.parameters) === encodedParameters
|
|
152
|
+
canonicalJson(record.parameters) === encodedParameters &&
|
|
153
|
+
((entry !== undefined && evidenceMatchesEntry(record, entry, snapshot)) ||
|
|
154
|
+
(workflowEntry !== undefined &&
|
|
155
|
+
evidenceMatchesWorkflowEntry(record, workflowEntry, snapshot))));
|
|
156
|
+
};
|
|
157
|
+
/** Create one exact replay record for a derived application workflow result. */
|
|
158
|
+
export const createAnalysisSnapshotWorkflowEntry = (input) => {
|
|
159
|
+
const { target, binding, operation, parameters, execution } = input;
|
|
160
|
+
if (execution.provider.id !== execution.analysisProfile.provider.id ||
|
|
161
|
+
execution.provider.name !== execution.analysisProfile.provider.name ||
|
|
162
|
+
execution.provider.version !== execution.analysisProfile.provider.version)
|
|
163
|
+
throw new TypeError("Workflow snapshot execution provider does not match its profile");
|
|
164
|
+
return {
|
|
165
|
+
query_id: analysisQueryId(target, binding, operation, parameters),
|
|
166
|
+
operation,
|
|
167
|
+
parameters: jsonObjectSchema.parse(parameters),
|
|
168
|
+
execution: {
|
|
169
|
+
result: execution.result,
|
|
170
|
+
raw_result: execution.rawResult,
|
|
171
|
+
provider: execution.analysisProfile.provider,
|
|
172
|
+
analysis_profile: execution.analysisProfile,
|
|
173
|
+
limitations: [...execution.limitations],
|
|
174
|
+
locations: [...execution.locations],
|
|
175
|
+
subject: execution.subject === null
|
|
176
|
+
? null
|
|
177
|
+
: {
|
|
178
|
+
...execution.subject,
|
|
179
|
+
architecture: execution.subject.architecture ?? null,
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
};
|
|
133
183
|
};
|
|
184
|
+
const evidenceMatchesEntry = (evidence, entry, snapshot) => isCorrespondingEvidence(evidence, snapshot) &&
|
|
185
|
+
canonicalJson({
|
|
186
|
+
query: evidenceQueryKey(evidence),
|
|
187
|
+
normalized_result: evidence.normalized_result,
|
|
188
|
+
raw_result: evidence.raw_result,
|
|
189
|
+
limitations: evidence.limitations,
|
|
190
|
+
locations: evidence.locations,
|
|
191
|
+
subject: evidence.subject === null
|
|
192
|
+
? null
|
|
193
|
+
: {
|
|
194
|
+
local_path: evidence.subject.local_path,
|
|
195
|
+
sha256: evidence.subject.digest.sha256,
|
|
196
|
+
format: evidence.subject.format,
|
|
197
|
+
architecture: evidence.subject.architecture,
|
|
198
|
+
},
|
|
199
|
+
}) === entryEvidenceKey(entry, snapshot.binding);
|
|
134
200
|
/** Compute the stable lookup key for one provider/profile-specific query. */
|
|
135
201
|
export const analysisQueryId = (target, binding, operation, parameters) => `query_${createHash("sha256")
|
|
136
202
|
.update(canonicalJson({ target, binding, operation, parameters }))
|
|
@@ -171,7 +237,9 @@ export const parseAnalysisSnapshot = (input) => {
|
|
|
171
237
|
throw new TypeError("Analysis snapshot evidence contains records for another target");
|
|
172
238
|
const ids = new Set();
|
|
173
239
|
const boundEntries = [];
|
|
240
|
+
const boundWorkflowEntries = [];
|
|
174
241
|
const index = createEvidenceIndex(parsed);
|
|
242
|
+
const workflowIndex = createWorkflowEvidenceIndex(parsed);
|
|
175
243
|
for (const entry of parsed.entries) {
|
|
176
244
|
if (entry.execution.provider.id !== parsed.binding.provider.id ||
|
|
177
245
|
entry.execution.provider.name !== parsed.binding.provider.name ||
|
|
@@ -192,10 +260,41 @@ export const parseAnalysisSnapshot = (input) => {
|
|
|
192
260
|
}
|
|
193
261
|
boundEntries.push(entry);
|
|
194
262
|
}
|
|
263
|
+
for (const entry of parsed.workflow_entries ?? []) {
|
|
264
|
+
if (entry.execution.provider.id !==
|
|
265
|
+
entry.execution.analysis_profile.provider.id ||
|
|
266
|
+
entry.execution.provider.name !==
|
|
267
|
+
entry.execution.analysis_profile.provider.name ||
|
|
268
|
+
entry.execution.provider.version !==
|
|
269
|
+
entry.execution.analysis_profile.provider.version)
|
|
270
|
+
throw new TypeError("Analysis snapshot workflow entry provider does not match its profile");
|
|
271
|
+
const expected = analysisQueryId(parsed.target, parsed.binding, entry.operation, entry.parameters);
|
|
272
|
+
if (entry.query_id !== expected)
|
|
273
|
+
throw new TypeError("Analysis snapshot workflow query identifier does not match");
|
|
274
|
+
if (ids.has(entry.query_id))
|
|
275
|
+
throw new TypeError("Analysis snapshot contains duplicate queries");
|
|
276
|
+
ids.add(entry.query_id);
|
|
277
|
+
if (!workflowEntryHasMatchingEvidence(entry, workflowIndex)) {
|
|
278
|
+
if (workflowEntryHasCorrespondingEvidence(entry, workflowIndex))
|
|
279
|
+
throw new TypeError(`Analysis snapshot workflow entry ${entry.operation} differs from its Evidence record`);
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
boundWorkflowEntries.push(entry);
|
|
283
|
+
}
|
|
195
284
|
const sorted = [...parsed.entries].sort((left, right) => left.query_id.localeCompare(right.query_id));
|
|
196
285
|
if (JSON.stringify(parsed.entries) !== JSON.stringify(sorted))
|
|
197
286
|
throw new TypeError("Analysis snapshot entries are not canonical");
|
|
198
|
-
|
|
287
|
+
const sortedWorkflows = [...(parsed.workflow_entries ?? [])].sort((left, right) => left.query_id.localeCompare(right.query_id));
|
|
288
|
+
if (parsed.workflow_entries !== undefined &&
|
|
289
|
+
JSON.stringify(parsed.workflow_entries) !== JSON.stringify(sortedWorkflows))
|
|
290
|
+
throw new TypeError("Analysis snapshot workflow entries are not canonical");
|
|
291
|
+
return {
|
|
292
|
+
...parsed,
|
|
293
|
+
entries: boundEntries,
|
|
294
|
+
...(parsed.workflow_entries === undefined
|
|
295
|
+
? {}
|
|
296
|
+
: { workflow_entries: boundWorkflowEntries }),
|
|
297
|
+
};
|
|
199
298
|
};
|
|
200
299
|
const createEvidenceIndex = (snapshot) => {
|
|
201
300
|
const matching = new Set();
|
|
@@ -259,5 +358,70 @@ const entryEvidenceKey = (entry, binding) => canonicalJson({
|
|
|
259
358
|
architecture: entry.execution.subject.architecture,
|
|
260
359
|
},
|
|
261
360
|
});
|
|
361
|
+
const workflowEntryQueryKey = (entry) => canonicalJson({
|
|
362
|
+
operation: entry.operation,
|
|
363
|
+
parameters: entry.parameters,
|
|
364
|
+
provider: entry.execution.provider,
|
|
365
|
+
analysis_profile: entry.execution.analysis_profile,
|
|
366
|
+
});
|
|
367
|
+
const workflowEntryEvidenceKey = (entry) => canonicalJson({
|
|
368
|
+
query: workflowEntryQueryKey(entry),
|
|
369
|
+
normalized_result: entry.execution.result,
|
|
370
|
+
raw_result: entry.execution.raw_result,
|
|
371
|
+
limitations: entry.execution.limitations,
|
|
372
|
+
locations: entry.execution.locations,
|
|
373
|
+
subject: entry.execution.subject === null
|
|
374
|
+
? null
|
|
375
|
+
: {
|
|
376
|
+
local_path: entry.execution.subject.path,
|
|
377
|
+
sha256: entry.execution.subject.sha256,
|
|
378
|
+
format: entry.execution.subject.format,
|
|
379
|
+
architecture: entry.execution.subject.architecture,
|
|
380
|
+
},
|
|
381
|
+
});
|
|
382
|
+
const isWorkflowEvidence = (evidence, snapshot, entry) => evidence.predicate_type === "rea.analysis" &&
|
|
383
|
+
evidence.confidence === "derived" &&
|
|
384
|
+
evidence.authority === "shipped-artifact" &&
|
|
385
|
+
evidence.subject?.digest.sha256 === snapshot.target.sha256 &&
|
|
386
|
+
"analysis_profile" in evidence &&
|
|
387
|
+
analysisProfilesEqual(evidence.analysis_profile, entry.execution.analysis_profile) &&
|
|
388
|
+
evidence.provider.id === entry.execution.provider.id &&
|
|
389
|
+
evidence.provider.name === entry.execution.provider.name &&
|
|
390
|
+
evidence.provider.version === entry.execution.provider.version;
|
|
391
|
+
const createWorkflowEvidenceIndex = (snapshot) => {
|
|
392
|
+
const matching = new Set();
|
|
393
|
+
const corresponding = new Set();
|
|
394
|
+
for (const evidence of snapshot.evidence_bundle.records) {
|
|
395
|
+
if (evidence.predicate_type !== "rea.analysis" ||
|
|
396
|
+
evidence.confidence !== "derived" ||
|
|
397
|
+
evidence.authority !== "shipped-artifact" ||
|
|
398
|
+
evidence.subject?.digest.sha256 !== snapshot.target.sha256 ||
|
|
399
|
+
!("analysis_profile" in evidence))
|
|
400
|
+
continue;
|
|
401
|
+
corresponding.add(evidenceQueryKey(evidence));
|
|
402
|
+
matching.add(canonicalJson(evidenceContentProjection(evidence)));
|
|
403
|
+
}
|
|
404
|
+
return { matching, corresponding };
|
|
405
|
+
};
|
|
406
|
+
const workflowEntryHasMatchingEvidence = (entry, index) => index.matching.has(workflowEntryEvidenceKey(entry));
|
|
407
|
+
const workflowEntryHasCorrespondingEvidence = (entry, index) => index.corresponding.has(workflowEntryQueryKey(entry));
|
|
408
|
+
const evidenceMatchesWorkflowEntry = (evidence, entry, snapshot) => isWorkflowEvidence(evidence, snapshot, entry) &&
|
|
409
|
+
canonicalJson(evidenceContentProjection(evidence)) ===
|
|
410
|
+
workflowEntryEvidenceKey(entry);
|
|
411
|
+
const evidenceContentProjection = (evidence) => ({
|
|
412
|
+
query: evidenceQueryKey(evidence),
|
|
413
|
+
normalized_result: evidence.normalized_result,
|
|
414
|
+
raw_result: evidence.raw_result,
|
|
415
|
+
limitations: evidence.limitations,
|
|
416
|
+
locations: evidence.locations,
|
|
417
|
+
subject: evidence.subject === null
|
|
418
|
+
? null
|
|
419
|
+
: {
|
|
420
|
+
local_path: evidence.subject.local_path,
|
|
421
|
+
sha256: evidence.subject.digest.sha256,
|
|
422
|
+
format: evidence.subject.format,
|
|
423
|
+
architecture: evidence.subject.architecture,
|
|
424
|
+
},
|
|
425
|
+
});
|
|
262
426
|
/** Serialize a validated snapshot with byte-stable canonical entry ordering. */
|
|
263
427
|
export const serializeAnalysisSnapshot = (snapshot) => `${canonicalJson(parseAnalysisSnapshot(snapshot))}\n`;
|
|
@@ -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(),
|
|
@@ -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(),
|
|
@@ -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
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
const MAX_SYMLINK_HOPS = 32;
|
|
2
|
+
/**
|
|
3
|
+
* Resolve a root-relative path one segment at a time, as `open` would:
|
|
4
|
+
* symlinks are followed inside the root, `..` applies to the real parent,
|
|
5
|
+
* and any escape above the root or through an absolute link stops.
|
|
6
|
+
*/
|
|
7
|
+
export const resolveTreePath = async (view, input) => {
|
|
8
|
+
const pending = segmentsOf(input);
|
|
9
|
+
const resolved = [];
|
|
10
|
+
let last;
|
|
11
|
+
let hops = 0;
|
|
12
|
+
while (pending.length > 0) {
|
|
13
|
+
const segment = pending.shift() ?? "";
|
|
14
|
+
if (segment === "..") {
|
|
15
|
+
if (resolved.length === 0)
|
|
16
|
+
return { kind: "escapes" };
|
|
17
|
+
resolved.pop();
|
|
18
|
+
last = { kind: "directory" };
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const path = [...resolved, segment].join("/");
|
|
22
|
+
const entry = await view.entry(path);
|
|
23
|
+
if (entry === undefined)
|
|
24
|
+
return { kind: "absent" };
|
|
25
|
+
if (entry.kind === "symlink") {
|
|
26
|
+
hops += 1;
|
|
27
|
+
if (hops > MAX_SYMLINK_HOPS)
|
|
28
|
+
return { kind: "absent" };
|
|
29
|
+
if (entry.target.startsWith("/"))
|
|
30
|
+
return { kind: "escapes" };
|
|
31
|
+
pending.unshift(...segmentsOf(entry.target));
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (entry.kind === "file" && pending.length > 0)
|
|
35
|
+
return { kind: "absent" };
|
|
36
|
+
resolved.push(segment);
|
|
37
|
+
last = entry;
|
|
38
|
+
}
|
|
39
|
+
return last?.kind === "file"
|
|
40
|
+
? { kind: "file", path: resolved.join("/") }
|
|
41
|
+
: { kind: "not-file" };
|
|
42
|
+
};
|
|
43
|
+
const segmentsOf = (path) => path.split("/").filter((segment) => segment !== "" && segment !== ".");
|
|
44
|
+
export const directoryOf = (path) => {
|
|
45
|
+
const index = path.lastIndexOf("/");
|
|
46
|
+
return index < 0 ? "" : path.slice(0, index);
|
|
47
|
+
};
|
|
48
|
+
export const joinPath = (directory, rest) => directory === "" ? rest : rest === "" ? directory : `${directory}/${rest}`;
|
|
49
|
+
/** Expand one dyld path prefix relative to its owning image. */
|
|
50
|
+
export const expandPrefix = (raw, context) => {
|
|
51
|
+
const variable = /^@(executable_path|loader_path)(?:\/(.*))?$/u.exec(raw);
|
|
52
|
+
if (variable !== null) {
|
|
53
|
+
const rest = variable[2] ?? "";
|
|
54
|
+
if (variable[1] === "loader_path")
|
|
55
|
+
return { scope: "target", path: joinPath(context.ownerDirectory, rest) };
|
|
56
|
+
return context.executable === null
|
|
57
|
+
? { scope: "undetermined", path: raw }
|
|
58
|
+
: {
|
|
59
|
+
scope: "target",
|
|
60
|
+
path: joinPath(directoryOf(context.executable), rest),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (raw.startsWith("/"))
|
|
64
|
+
return { scope: "outside", path: raw };
|
|
65
|
+
return { scope: "undetermined", path: raw };
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Slices a process may load, best first, following dyld's graded
|
|
69
|
+
* architectures: an x86_64h process also accepts generic x86_64.
|
|
70
|
+
*/
|
|
71
|
+
const COMPATIBLE_ARCHITECTURES = {
|
|
72
|
+
x86_64h: ["x86_64h", "x86_64"],
|
|
73
|
+
};
|
|
74
|
+
export const compatibleSlice = (slices, process) => {
|
|
75
|
+
for (const architecture of COMPATIBLE_ARCHITECTURES[process] ?? [process]) {
|
|
76
|
+
const slice = slices.find((item) => item.architecture === architecture);
|
|
77
|
+
if (slice !== undefined)
|
|
78
|
+
return slice;
|
|
79
|
+
}
|
|
80
|
+
return undefined;
|
|
81
|
+
};
|