rea-agents 6.0.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -18
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +205 -51
- package/bridge/hopper_bridge.py +314 -127
- package/bridge/mitmproxy/capture.py +0 -2
- package/bridge/native/rea_lldb_tracer.py +630 -94
- package/bridge/process/ProcessRunTokenReader.swift +39 -5
- package/bridge/pwntools/recorded_crash_impl.py +4 -0
- package/dist/android/JadxConfiguration.js +274 -31
- package/dist/android/JadxMcpTransport.js +18 -2
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +76 -37
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +48 -11
- package/dist/application/ClientConfigurationDocument.js +917 -8
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +56 -51
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +19 -21
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +64 -17
- package/dist/application/EvidenceBundleFiles.js +30 -13
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +11 -2
- package/dist/application/JsonFiles.js +83 -28
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +21 -17
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +21 -29
- package/dist/application/SetupPlan.js +11 -9
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +82 -29
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +57 -36
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCaptureService.js +4 -2
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +32 -6
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WorkflowEvidence.js +105 -0
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
- package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
- package/dist/application/binary/BinarySession.js +161 -93
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +4 -4
- package/dist/application/binary/BinarySessionRecords.js +26 -4
- package/dist/application/binary/BinarySessionStatus.js +18 -7
- package/dist/application/binary/CompositeProvider.js +16 -17
- package/dist/application/binary/LazyAnalysisProvider.js +8 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
- package/dist/application/evm/EvmInterfaceService.js +4 -2
- package/dist/application/homebrew.js +48 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
- package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
- package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/process/ProcessCli.js +25 -17
- package/dist/application/process/ProcessEvidence.js +4 -4
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +48 -13
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
- package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
- package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +59 -38
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +78 -15
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +25 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +41 -1
- package/dist/browser/history/CaptureRelease.js +5 -0
- package/dist/browser/history/HarCaptureAdapter.js +3 -3
- package/dist/browser/history/HarJson.js +3 -2
- package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +100 -37
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +10 -9
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +7 -3
- package/dist/cli/jsonOutput.js +4 -99
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +3 -5
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +18 -9
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -1
- package/dist/cliJsonInput.js +24 -5
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraStartupTimeout.js +12 -0
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +30 -0
- package/dist/config/parseConfig.js +8 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +7 -5
- package/dist/contracts/enhancedToolContracts.js +7 -6
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +7 -14
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +5 -3
- package/dist/contracts/officialToolContracts.js +16 -16
- package/dist/contracts/promptContracts.js +5 -5
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +3 -7
- package/dist/contracts/sessionStatusContract.js +2 -4
- package/dist/contracts/sessionToolContracts.js +18 -8
- package/dist/contracts/sessionToolSchemas.js +3 -19
- package/dist/contracts/toolContractExamples.js +0 -1
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -1
- package/dist/contracts/toolOutputSchemaGroups.js +160 -115
- package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
- package/dist/contracts/toolSchemaMetadata.js +41 -33
- package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +8 -3
- package/dist/domain/analysisErrorCore.js +6 -1
- package/dist/domain/analysisErrorPresentation.js +90 -20
- package/dist/domain/analysisErrorProjection.js +130 -32
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +18 -10
- package/dist/domain/apple/appleApplication.js +42 -15
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dylibResolution.js +130 -12
- package/dist/domain/apple/dylibResolutionFindings.js +9 -7
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +35 -3
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +28 -40
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +5 -10
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +13 -1
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +65 -36
- package/dist/domain/evidenceBundle.js +47 -8
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/explicitSensitiveFailure.js +17 -1
- package/dist/domain/firmware/firmwareAnalysis.js +6 -7
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +47 -64
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
- package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +90 -6
- package/dist/domain/localPath.js +6 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -11
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +37 -13
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +21 -16
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +79 -26
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +35 -12
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +3 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +4 -3
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +8 -45
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +19 -7
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
- package/dist/ghidra/GhidraClient.js +126 -34
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +13 -12
- package/dist/ghidra/GhidraInstallation.js +58 -33
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +66 -0
- package/dist/ghidra/GhidraLauncher.js +47 -22
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
- package/dist/ghidra/GhidraProviderClient.js +36 -15
- package/dist/ghidra/GhidraSessionError.js +13 -7
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +65 -56
- package/dist/hopper/HopperAnalysisProfile.js +65 -12
- package/dist/hopper/HopperCleanup.js +63 -22
- package/dist/hopper/HopperClient.js +288 -59
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +197 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +71 -19
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +134 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +133 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
- package/dist/inspector/V8InspectorProvider.js +82 -36
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +48 -22
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +87 -88
- package/dist/native/LldbCallTracer.js +372 -103
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +62 -3
- package/dist/native/NativeMacOSProvider.js +122 -31
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
- package/dist/process/DarwinProcessRunTokenReader.js +23 -10
- package/dist/process/ExecFileOutput.js +108 -6
- package/dist/process/OwnedCommand.js +7 -2
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +204 -57
- package/dist/process/ProcessOwnershipObservation.js +60 -9
- package/dist/process/ProviderProcess.js +39 -10
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +15 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +157 -0
- package/dist/server/createServer.js +61 -41
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -5
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +13 -10
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
- package/dist/server/registerBrowserScenarioTool.js +3 -6
- package/dist/server/registerBrowserTools.js +13 -18
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +9 -20
- package/dist/server/registerElectronTools.js +10 -15
- package/dist/server/registerEnhancedTools.js +36 -77
- package/dist/server/registerEvidenceTools.js +3 -6
- package/dist/server/registerEvmTools.js +2 -5
- package/dist/server/registerFirmwareTools.js +2 -5
- package/dist/server/registerFunctionComparisonTool.js +15 -12
- package/dist/server/registerInvestigationTools.js +16 -17
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
- package/dist/server/registerOfficialTools.js +4 -21
- package/dist/server/registerProcessComparisonTool.js +74 -48
- package/dist/server/registerRecordedCrashTools.js +2 -5
- package/dist/server/registerSessionRecordTools.js +19 -24
- package/dist/server/registerSessionStatusTool.js +19 -6
- package/dist/server/registerSessionTools.js +20 -18
- package/dist/server/registerWebModuleTool.js +2 -5
- package/dist/server/registerWebNetworkCaptureTool.js +2 -5
- package/dist/server/registerWebRuntimeTools.js +4 -9
- package/dist/server/registerWebScriptTool.js +2 -5
- package/dist/server/registerWebSourceLocationTool.js +2 -5
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +0 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +75 -51
- package/dist/server/toolResultEncoding.js +34 -0
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/install.sh +1 -1
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +44 -30
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +12 -3
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/ghidra/GhidraDefaults.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { TextDecoder } from "node:util";
|
|
2
|
+
import { InterfaceBuilderDecodeBudget, InterfaceBuilderDecodeBudgetExceeded, } from "./InterfaceBuilderDecodeBudget.js";
|
|
2
3
|
const MAGIC = Buffer.from("NIBArchive", "ascii");
|
|
3
|
-
const
|
|
4
|
+
const DEFAULT_DECODE_BUDGET_BYTES = 128 * 1024 * 1024;
|
|
4
5
|
/** Decode Apple's length-prefixed NIBArchive representation without loading UI classes. */
|
|
5
|
-
export const decodeNibArchive = (bytes) => {
|
|
6
|
+
export const decodeNibArchive = (bytes, budget = new InterfaceBuilderDecodeBudget(DEFAULT_DECODE_BUDGET_BYTES)) => {
|
|
6
7
|
if (bytes.length < 50 || !bytes.subarray(0, MAGIC.length).equals(MAGIC))
|
|
7
8
|
throw new TypeError("NIBArchive magic or header is invalid");
|
|
8
9
|
const formatVersion = readU32(bytes, 10);
|
|
@@ -23,11 +24,13 @@ export const decodeNibArchive = (bytes) => {
|
|
|
23
24
|
valuesOffset,
|
|
24
25
|
classesOffset,
|
|
25
26
|
]);
|
|
27
|
+
const projectedFieldCount = preflightProjectedFieldCount(bytes, objectsOffset, keysOffset, objectCount, valueCount, classCount, budget.remainingBytes);
|
|
28
|
+
budget.reserve(objectCount * 96 + projectedFieldCount * 96, "NIBArchive object and projected field counts exceed the aggregate Interface Builder decode budget");
|
|
26
29
|
const objectRecords = parseObjects(bytes, objectsOffset, keysOffset, objectCount, valueCount, classCount);
|
|
27
|
-
const keys = parseStrings(bytes, keysOffset, valuesOffset, keyCount, "key");
|
|
28
|
-
const classes = parseClasses(bytes, classesOffset, bytes.length, classCount);
|
|
30
|
+
const keys = parseStrings(bytes, keysOffset, valuesOffset, keyCount, "key", budget);
|
|
31
|
+
const classes = parseClasses(bytes, classesOffset, bytes.length, classCount, budget);
|
|
29
32
|
const neededValues = valueIndexes(objectRecords, valueCount);
|
|
30
|
-
const values = parseValues(bytes, valuesOffset, classesOffset, valueCount, keyCount, neededValues);
|
|
33
|
+
const values = parseValues(bytes, valuesOffset, classesOffset, valueCount, keyCount, neededValues, budget);
|
|
31
34
|
for (const { value } of values.values()) {
|
|
32
35
|
if (typeof value === "object" &&
|
|
33
36
|
value !== null &&
|
|
@@ -89,19 +92,40 @@ const parseObjects = (bytes, start, end, count, valueCount, classCount) => {
|
|
|
89
92
|
throw new TypeError("NIBArchive object table overlaps the next table");
|
|
90
93
|
return output;
|
|
91
94
|
};
|
|
92
|
-
const
|
|
95
|
+
const preflightProjectedFieldCount = (bytes, start, end, objectCount, valueCount, classCount, maxBytes) => {
|
|
96
|
+
if (objectCount * 96 > maxBytes)
|
|
97
|
+
throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "NIBArchive object count exceeds the aggregate Interface Builder decode budget");
|
|
98
|
+
const cursor = { offset: start };
|
|
99
|
+
let projectedFields = 0;
|
|
100
|
+
for (let index = 0; index < objectCount; index += 1) {
|
|
101
|
+
const classIndex = readVarint(bytes, cursor, end);
|
|
102
|
+
const valueStart = readVarint(bytes, cursor, end);
|
|
103
|
+
const fieldCount = readVarint(bytes, cursor, end);
|
|
104
|
+
if (classIndex >= classCount ||
|
|
105
|
+
valueStart > valueCount ||
|
|
106
|
+
fieldCount > valueCount - valueStart)
|
|
107
|
+
throw new TypeError(`NIBArchive object ${index} references an invalid table range`);
|
|
108
|
+
projectedFields += fieldCount;
|
|
109
|
+
if (!Number.isSafeInteger(projectedFields) ||
|
|
110
|
+
projectedFields * 96 > maxBytes - objectCount * 96)
|
|
111
|
+
throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "NIBArchive projected field ranges exceed the aggregate Interface Builder decode budget");
|
|
112
|
+
}
|
|
113
|
+
return projectedFields;
|
|
114
|
+
};
|
|
115
|
+
const parseStrings = (bytes, start, end, count, label, budget) => {
|
|
93
116
|
const cursor = { offset: start };
|
|
94
117
|
const output = [];
|
|
95
118
|
for (let index = 0; index < count; index += 1) {
|
|
96
119
|
const length = readVarint(bytes, cursor, end);
|
|
97
120
|
const next = checkedEnd(cursor.offset, length, end, `${label} ${index}`);
|
|
121
|
+
budget.reserve(32 + length * 2, `NIBArchive ${label} strings exceed the aggregate Interface Builder decode budget`);
|
|
98
122
|
const value = decodeUtf8(bytes, cursor.offset, next, `${label} ${index}`);
|
|
99
123
|
cursor.offset = next;
|
|
100
124
|
output.push(value);
|
|
101
125
|
}
|
|
102
126
|
return output;
|
|
103
127
|
};
|
|
104
|
-
const parseClasses = (bytes, start, end, count) => {
|
|
128
|
+
const parseClasses = (bytes, start, end, count, budget) => {
|
|
105
129
|
const cursor = { offset: start };
|
|
106
130
|
const output = [];
|
|
107
131
|
for (let index = 0; index < count; index += 1) {
|
|
@@ -112,13 +136,14 @@ const parseClasses = (bytes, start, end, count) => {
|
|
|
112
136
|
ensureRange(cursor.offset, extraCount * 4, end, `class ${index} extensions`);
|
|
113
137
|
cursor.offset += extraCount * 4;
|
|
114
138
|
const next = checkedEnd(cursor.offset, length, end, `class ${index}`);
|
|
139
|
+
budget.reserve(32 + length * 2, "NIBArchive class names exceed the aggregate Interface Builder decode budget");
|
|
115
140
|
const name = decodeUtf8(bytes, cursor.offset, next, `class ${index}`).replace(/\0+$/u, "");
|
|
116
141
|
cursor.offset = next;
|
|
117
142
|
output.push(name);
|
|
118
143
|
}
|
|
119
144
|
return output;
|
|
120
145
|
};
|
|
121
|
-
const parseValues = (bytes, start, end, count, keyCount, needed) => {
|
|
146
|
+
const parseValues = (bytes, start, end, count, keyCount, needed, budget) => {
|
|
122
147
|
const cursor = { offset: start };
|
|
123
148
|
const output = new Map();
|
|
124
149
|
for (let index = 0; index < count; index += 1) {
|
|
@@ -127,15 +152,19 @@ const parseValues = (bytes, start, end, count, keyCount, needed) => {
|
|
|
127
152
|
throw new TypeError(`NIBArchive value ${index} references an invalid key`);
|
|
128
153
|
ensureRange(cursor.offset, 1, end, `value ${index} type`);
|
|
129
154
|
const type = bytes[cursor.offset++] ?? -1;
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
155
|
+
if (!needed.has(index)) {
|
|
156
|
+
skipValue(bytes, cursor, end, type, index);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
budget.reserve(64, "NIBArchive decoded values exceed the aggregate Interface Builder decode budget");
|
|
160
|
+
const value = readValue(bytes, cursor, end, type, index, budget);
|
|
161
|
+
output.set(index, { key_index: keyIndex, value });
|
|
133
162
|
}
|
|
134
163
|
if (cursor.offset > end)
|
|
135
164
|
throw new TypeError("NIBArchive value table overlaps the next table");
|
|
136
165
|
return output;
|
|
137
166
|
};
|
|
138
|
-
const readValue = (bytes, cursor, end, type, index) => {
|
|
167
|
+
const readValue = (bytes, cursor, end, type, index, budget) => {
|
|
139
168
|
switch (type) {
|
|
140
169
|
case 0:
|
|
141
170
|
ensureRange(cursor.offset, 1, end, `value ${index}`);
|
|
@@ -185,6 +214,7 @@ const readValue = (bytes, cursor, end, type, index) => {
|
|
|
185
214
|
case 8: {
|
|
186
215
|
const length = readVarint(bytes, cursor, end);
|
|
187
216
|
const next = checkedEnd(cursor.offset, length, end, `value ${index} data`);
|
|
217
|
+
budget.reserve(32 + 4 * Math.ceil(length / 3), `NIBArchive data value ${index} exceeds the aggregate Interface Builder decode budget`);
|
|
188
218
|
const encoded = bytes.subarray(cursor.offset, next).toString("base64");
|
|
189
219
|
cursor.offset = next;
|
|
190
220
|
return { $nib_data_base64: encoded };
|
|
@@ -202,6 +232,43 @@ const readValue = (bytes, cursor, end, type, index) => {
|
|
|
202
232
|
throw new TypeError(`NIBArchive value ${index} has unsupported type ${type}`);
|
|
203
233
|
}
|
|
204
234
|
};
|
|
235
|
+
const skipValue = (bytes, cursor, end, type, index) => {
|
|
236
|
+
switch (type) {
|
|
237
|
+
case 0:
|
|
238
|
+
ensureRange(cursor.offset, 1, end, `value ${index}`);
|
|
239
|
+
cursor.offset += 1;
|
|
240
|
+
return;
|
|
241
|
+
case 1:
|
|
242
|
+
ensureRange(cursor.offset, 2, end, `value ${index}`);
|
|
243
|
+
cursor.offset += 2;
|
|
244
|
+
return;
|
|
245
|
+
case 2:
|
|
246
|
+
case 10:
|
|
247
|
+
ensureRange(cursor.offset, 4, end, `value ${index}`);
|
|
248
|
+
cursor.offset += 4;
|
|
249
|
+
return;
|
|
250
|
+
case 3:
|
|
251
|
+
case 7:
|
|
252
|
+
ensureRange(cursor.offset, 8, end, `value ${index}`);
|
|
253
|
+
cursor.offset += 8;
|
|
254
|
+
return;
|
|
255
|
+
case 6:
|
|
256
|
+
ensureRange(cursor.offset, 4, end, `value ${index}`);
|
|
257
|
+
cursor.offset += 4;
|
|
258
|
+
return;
|
|
259
|
+
case 4:
|
|
260
|
+
case 5:
|
|
261
|
+
case 9:
|
|
262
|
+
return;
|
|
263
|
+
case 8: {
|
|
264
|
+
const length = readVarint(bytes, cursor, end);
|
|
265
|
+
cursor.offset = checkedEnd(cursor.offset, length, end, `value ${index} data`);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
default:
|
|
269
|
+
throw new TypeError(`NIBArchive value ${index} has unsupported type ${type}`);
|
|
270
|
+
}
|
|
271
|
+
};
|
|
205
272
|
const valueIndexes = (objects, total) => {
|
|
206
273
|
const indexes = new Set();
|
|
207
274
|
for (const object of objects)
|
|
@@ -213,8 +280,8 @@ const valueIndexes = (objects, total) => {
|
|
|
213
280
|
};
|
|
214
281
|
const readCount = (bytes, offset, label) => {
|
|
215
282
|
const count = readU32(bytes, offset);
|
|
216
|
-
if (count >
|
|
217
|
-
throw new TypeError(`NIBArchive ${label} count exceeds the
|
|
283
|
+
if (count > bytes.length)
|
|
284
|
+
throw new TypeError(`NIBArchive ${label} count exceeds the archive length`);
|
|
218
285
|
return count;
|
|
219
286
|
};
|
|
220
287
|
const readOffset = (bytes, offset, fileLength, label) => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Project encoded view parents; archive owners are not inferred view parents. */
|
|
2
|
-
export const projectNibViewHierarchy = (objects, retainedIds) => {
|
|
2
|
+
export const projectNibViewHierarchy = (objects, retainedIds, reserveNode = () => true, maxNodes = 20_000) => {
|
|
3
3
|
const { parents, involved, invalid } = collectNibParents(objects, retainedIds);
|
|
4
4
|
if (parents.size === 0)
|
|
5
5
|
return { hierarchy: null, omitted: invalid };
|
|
@@ -21,7 +21,10 @@ export const projectNibViewHierarchy = (objects, retainedIds) => {
|
|
|
21
21
|
const item = pending.pop();
|
|
22
22
|
if (item === undefined)
|
|
23
23
|
break;
|
|
24
|
-
if (visited.has(item.id) ||
|
|
24
|
+
if (visited.has(item.id) ||
|
|
25
|
+
item.depth > 128 ||
|
|
26
|
+
visited.size >= maxNodes ||
|
|
27
|
+
!reserveNode())
|
|
25
28
|
continue;
|
|
26
29
|
visited.add(item.id);
|
|
27
30
|
const node = { objectID: String(item.id), children: [] };
|
|
@@ -35,7 +38,7 @@ export const projectNibViewHierarchy = (objects, retainedIds) => {
|
|
|
35
38
|
};
|
|
36
39
|
};
|
|
37
40
|
/** Add encoded parent links once; conflicting legacy parents remain unknown. */
|
|
38
|
-
export const mergeNibHierarchies = (legacy, recovered) => {
|
|
41
|
+
export const mergeNibHierarchies = (legacy, recovered, reserveNode = () => true, maxNodes = 20_000) => {
|
|
39
42
|
const existing = new Map();
|
|
40
43
|
const owners = new Map();
|
|
41
44
|
const parents = new Map();
|
|
@@ -70,6 +73,10 @@ export const mergeNibHierarchies = (legacy, recovered) => {
|
|
|
70
73
|
break;
|
|
71
74
|
let target = existing.get(entry.node.objectID);
|
|
72
75
|
if (target === undefined) {
|
|
76
|
+
if (existing.size >= maxNodes || !reserveNode()) {
|
|
77
|
+
omitted += 1;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
73
80
|
target = { objectID: entry.node.objectID, children: [] };
|
|
74
81
|
existing.set(target.objectID, target);
|
|
75
82
|
entry.output.push(target);
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { decodeXmlText } from "../../domain/propertyListKeys.js";
|
|
2
|
+
const collector = () => {
|
|
3
|
+
const integers = new Map();
|
|
4
|
+
const reals = new Set();
|
|
5
|
+
let unsafeIntegerLiterals = 0;
|
|
6
|
+
let incompleteMetadata = false;
|
|
7
|
+
return {
|
|
8
|
+
integer: (literal) => {
|
|
9
|
+
if (!/^[+-]?\d+$/u.test(literal)) {
|
|
10
|
+
incompleteMetadata = true;
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const exact = BigInt(literal);
|
|
14
|
+
if (exact >= BigInt(Number.MIN_SAFE_INTEGER) &&
|
|
15
|
+
exact <= BigInt(Number.MAX_SAFE_INTEGER))
|
|
16
|
+
return;
|
|
17
|
+
unsafeIntegerLiterals += 1;
|
|
18
|
+
const rounded = Number(exact);
|
|
19
|
+
integers.set(rounded, (integers.get(rounded) ?? new Set()).add(exact.toString()));
|
|
20
|
+
},
|
|
21
|
+
real: (value) => {
|
|
22
|
+
reals.add(value);
|
|
23
|
+
},
|
|
24
|
+
markIncomplete: () => {
|
|
25
|
+
incompleteMetadata = true;
|
|
26
|
+
},
|
|
27
|
+
result: (incomplete = false) => ({
|
|
28
|
+
incomplete: incomplete || incompleteMetadata,
|
|
29
|
+
integers,
|
|
30
|
+
reals,
|
|
31
|
+
unsafeIntegerLiterals,
|
|
32
|
+
}),
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
// Consume quoted tag attributes and opaque comment/CDATA tokens whole.
|
|
36
|
+
const XML_TOKEN = /<!--[\s\S]*?-->|<!\[CDATA\[[\s\S]*?\]\]>|<(?:[^>"']|"[^"]*"|'[^']*')*>/gu;
|
|
37
|
+
const OPAQUE_ELEMENTS = new Set(["string", "key", "data", "date"]);
|
|
38
|
+
/** Observe plist number element types without interpreting strings or class code. */
|
|
39
|
+
export const xmlPlistNumberLiterals = (xml) => {
|
|
40
|
+
const output = collector();
|
|
41
|
+
const elements = [];
|
|
42
|
+
let number;
|
|
43
|
+
let cursor = 0;
|
|
44
|
+
for (const match of xml.matchAll(XML_TOKEN)) {
|
|
45
|
+
const index = match.index;
|
|
46
|
+
if (number !== undefined)
|
|
47
|
+
number.text += xml.slice(cursor, index);
|
|
48
|
+
const token = match[0];
|
|
49
|
+
cursor = index + token.length;
|
|
50
|
+
if (token.startsWith("<!--") || token.startsWith("<![CDATA[")) {
|
|
51
|
+
if (number !== undefined) {
|
|
52
|
+
number.plainText = false;
|
|
53
|
+
output.markIncomplete();
|
|
54
|
+
}
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const tag = /^<\s*(\/?)\s*([\w:-]+)/u.exec(token);
|
|
58
|
+
if (tag === null) {
|
|
59
|
+
if (number !== undefined) {
|
|
60
|
+
number.plainText = false;
|
|
61
|
+
output.markIncomplete();
|
|
62
|
+
}
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const closing = tag[1] === "/";
|
|
66
|
+
const name = tag[2];
|
|
67
|
+
if (name === undefined)
|
|
68
|
+
continue;
|
|
69
|
+
if (closing) {
|
|
70
|
+
if (number !== undefined &&
|
|
71
|
+
number.kind === name &&
|
|
72
|
+
number.depth === elements.length) {
|
|
73
|
+
if (number.plainText) {
|
|
74
|
+
const text = decodeXmlText(number.text).trim();
|
|
75
|
+
if (number.kind === "integer")
|
|
76
|
+
output.integer(text);
|
|
77
|
+
else
|
|
78
|
+
output.real(Number.parseFloat(text));
|
|
79
|
+
}
|
|
80
|
+
number = undefined;
|
|
81
|
+
}
|
|
82
|
+
elements.pop();
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
// The pinned decoder reads only the first child for integers and only text
|
|
86
|
+
// nodes for reals. Mixed content cannot establish an exact association.
|
|
87
|
+
if (number !== undefined) {
|
|
88
|
+
number.plainText = false;
|
|
89
|
+
output.markIncomplete();
|
|
90
|
+
}
|
|
91
|
+
if (/\/\s*>$/u.test(token))
|
|
92
|
+
continue;
|
|
93
|
+
if (number === undefined &&
|
|
94
|
+
(name === "integer" || name === "real") &&
|
|
95
|
+
!elements.some((parent) => OPAQUE_ELEMENTS.has(parent)))
|
|
96
|
+
number = {
|
|
97
|
+
kind: name,
|
|
98
|
+
text: "",
|
|
99
|
+
depth: elements.length + 1,
|
|
100
|
+
plainText: true,
|
|
101
|
+
};
|
|
102
|
+
elements.push(name);
|
|
103
|
+
}
|
|
104
|
+
return output.result();
|
|
105
|
+
};
|
|
106
|
+
/** Observe bounded binary number markers without changing primary decode acceptance. */
|
|
107
|
+
export const binaryPlistNumberLiterals = (bytes) => {
|
|
108
|
+
const output = collector();
|
|
109
|
+
if (bytes.length < 40 ||
|
|
110
|
+
bytes.subarray(0, 8).toString("ascii") !== "bplist00")
|
|
111
|
+
return output.result(true);
|
|
112
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
113
|
+
const trailer = bytes.length - 32;
|
|
114
|
+
const offsetWidth = bytes[trailer + 6] ?? 0;
|
|
115
|
+
if (![1, 2, 4, 8].includes(offsetWidth))
|
|
116
|
+
return output.result(true);
|
|
117
|
+
const countRaw = view.getBigUint64(trailer + 8);
|
|
118
|
+
const tableRaw = view.getBigUint64(trailer + 24);
|
|
119
|
+
const safeMaximum = BigInt(Number.MAX_SAFE_INTEGER);
|
|
120
|
+
if (countRaw === 0n || countRaw > safeMaximum || tableRaw > safeMaximum)
|
|
121
|
+
return output.result(true);
|
|
122
|
+
if (tableRaw < 8n || tableRaw >= BigInt(trailer))
|
|
123
|
+
return output.result(true);
|
|
124
|
+
const offsetTable = Number(tableRaw);
|
|
125
|
+
const capacity = Math.floor((trailer - offsetTable) / offsetWidth);
|
|
126
|
+
if (countRaw > BigInt(capacity))
|
|
127
|
+
return output.result(true);
|
|
128
|
+
const count = Number(countRaw);
|
|
129
|
+
const unsigned = (offset) => {
|
|
130
|
+
if (offset < offsetTable || offset + offsetWidth > trailer)
|
|
131
|
+
return undefined;
|
|
132
|
+
if (offsetWidth === 1)
|
|
133
|
+
return view.getUint8(offset);
|
|
134
|
+
if (offsetWidth === 2)
|
|
135
|
+
return view.getUint16(offset);
|
|
136
|
+
if (offsetWidth === 4)
|
|
137
|
+
return view.getUint32(offset);
|
|
138
|
+
const value = view.getBigUint64(offset);
|
|
139
|
+
return value > safeMaximum ? undefined : Number(value);
|
|
140
|
+
};
|
|
141
|
+
for (let index = 0; index < count; index += 1) {
|
|
142
|
+
const offset = unsigned(offsetTable + index * offsetWidth);
|
|
143
|
+
if (offset === undefined || offset < 8 || offset >= offsetTable)
|
|
144
|
+
return output.result(true);
|
|
145
|
+
const marker = bytes[offset] ?? 0;
|
|
146
|
+
const type = marker >> 4;
|
|
147
|
+
if (type !== 1 && type !== 2)
|
|
148
|
+
continue;
|
|
149
|
+
const width = 2 ** (marker & 0xf);
|
|
150
|
+
if (offset + 1 + width > offsetTable)
|
|
151
|
+
return output.result(true);
|
|
152
|
+
if (type === 1 && width === 8)
|
|
153
|
+
output.integer(view.getBigInt64(offset + 1).toString());
|
|
154
|
+
else if (type === 1 && width > 4)
|
|
155
|
+
return output.result(true);
|
|
156
|
+
else if (type === 2 && width === 4)
|
|
157
|
+
output.real(view.getFloat32(offset + 1));
|
|
158
|
+
else if (type === 2 && width === 8)
|
|
159
|
+
output.real(view.getFloat64(offset + 1));
|
|
160
|
+
else if (type === 2)
|
|
161
|
+
return output.result(true);
|
|
162
|
+
}
|
|
163
|
+
return output.result();
|
|
164
|
+
};
|
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
import { lstat, realpath } from "node:fs/promises";
|
|
2
|
+
import { compareCodePoints } from "../../domain/canonicalOrdering.js";
|
|
2
3
|
import { canonicalDigest } from "../../domain/comparisonSemantics.js";
|
|
3
4
|
import { AsarArtifactReader } from "../AsarArtifactReader.js";
|
|
4
5
|
import { ArtifactPathRegistry, normalizeArtifactPath, } from "../ArtifactPaths.js";
|
|
5
6
|
import { ArtifactReaderFailure, } from "../ArtifactReader.js";
|
|
7
|
+
import { abortIfNeeded } from "../ArtifactHash.js";
|
|
6
8
|
import { DirectoryArtifactReader } from "../DirectoryArtifactReader.js";
|
|
7
9
|
import { SafeOutputTree } from "../SafeOutputTree.js";
|
|
8
10
|
import { ZipArtifactReader } from "../ZipArtifactReader.js";
|
|
9
11
|
import { MachOSliceArtifactReader } from "../MachOSliceArtifactReader.js";
|
|
10
12
|
import { artifactExtractionResultSchema, } from "../../domain/artifactGraph.js";
|
|
13
|
+
import { AnalysisUnsupportedTargetError } from "../../domain/analysisErrorCore.js";
|
|
11
14
|
import { scanArtifactInventory } from "../inventory/ArtifactInventory.js";
|
|
12
15
|
/** Extract every regular inventory occurrence into an exclusively owned absent root. */
|
|
13
16
|
export const extractArtifact = async (input, signal) => {
|
|
17
|
+
// Cancellation wins over every later refusal, including unsupported formats.
|
|
18
|
+
abortIfNeeded(signal);
|
|
14
19
|
const sourcePath = await realpath(input.inputPath);
|
|
20
|
+
await requireExtractableFormat(sourcePath, input);
|
|
15
21
|
const snapshot = await scanArtifactInventory(sourcePath, {
|
|
16
22
|
signal,
|
|
23
|
+
environment: input.environment,
|
|
17
24
|
});
|
|
18
25
|
const selectedOccurrences = snapshot.occurrences.filter((occurrence) => (occurrence.entry_kind === "file" || occurrence.entry_kind === "slice") &&
|
|
19
26
|
occurrence.logical_path !== ".");
|
|
@@ -29,11 +36,14 @@ export const extractArtifact = async (input, signal) => {
|
|
|
29
36
|
nodes,
|
|
30
37
|
};
|
|
31
38
|
const selected = selectedOccurrences.map((occurrence) => {
|
|
39
|
+
// REA never decrypts archive entries, so an encrypted entry makes the
|
|
40
|
+
// complete extraction unsupported rather than the archive invalid.
|
|
41
|
+
if (occurrence.encrypted)
|
|
42
|
+
throw new AnalysisUnsupportedTargetError("extract_artifact", input.inputPath, `Archive entry ${occurrence.logical_path} is encrypted; REA does not decrypt archive entries, so the archive cannot be extracted completely`);
|
|
32
43
|
if ((occurrence.entry_kind !== "file" && occurrence.entry_kind !== "slice") ||
|
|
33
44
|
occurrence.artifact_id === null ||
|
|
34
|
-
occurrence.encrypted ||
|
|
35
45
|
occurrence.logical_path === ".")
|
|
36
|
-
throw new ArtifactReaderFailure("format", `Selected occurrence is not an extractable regular child file: ${occurrence.occurrence_id}`);
|
|
46
|
+
throw new ArtifactReaderFailure("format", `Selected occurrence is not an extractable regular child file: ${occurrence.logical_path} (${occurrence.occurrence_id})`);
|
|
37
47
|
const node = inventory.nodes.get(occurrence.artifact_id);
|
|
38
48
|
if (node === undefined)
|
|
39
49
|
throw new ArtifactReaderFailure("integrity", `Selected occurrence has no inventory node: ${occurrence.occurrence_id}`);
|
|
@@ -49,11 +59,13 @@ export const extractArtifact = async (input, signal) => {
|
|
|
49
59
|
};
|
|
50
60
|
const materializeSelection = async ({ input, sourcePath, inventory, selected, signal, }) => {
|
|
51
61
|
const byPath = new Map(selected.map((item) => [item.occurrence.logical_path, item]));
|
|
52
|
-
const reader = await createReader(sourcePath, input
|
|
53
|
-
|
|
62
|
+
const reader = await createReader(sourcePath, input);
|
|
63
|
+
let output;
|
|
64
|
+
let readerCloseAttempted = false;
|
|
54
65
|
let readerClosed = false;
|
|
55
66
|
const extracted = [];
|
|
56
67
|
try {
|
|
68
|
+
output = await SafeOutputTree.create(input.outputRoot);
|
|
57
69
|
const materialized = [];
|
|
58
70
|
const registry = new ArtifactPathRegistry();
|
|
59
71
|
for await (const entry of reader.entries(signal)) {
|
|
@@ -77,20 +89,53 @@ const materializeSelection = async ({ input, sourcePath, inventory, selected, si
|
|
|
77
89
|
});
|
|
78
90
|
materialized.push(selectedItem);
|
|
79
91
|
}
|
|
92
|
+
readerCloseAttempted = true;
|
|
80
93
|
await reader.close();
|
|
81
94
|
readerClosed = true;
|
|
82
|
-
extracted.sort((left, right) => left.relative_path
|
|
95
|
+
extracted.sort((left, right) => compareCodePoints(left.relative_path, right.relative_path));
|
|
83
96
|
const result = createExtractionResult(input, inventory, materialized, extracted);
|
|
84
97
|
await output.commit();
|
|
85
98
|
return result;
|
|
86
99
|
}
|
|
87
100
|
catch (cause) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
101
|
+
const cleanupFailures = [];
|
|
102
|
+
if (readerCloseAttempted && !readerClosed)
|
|
103
|
+
cleanupFailures.push({
|
|
104
|
+
cause,
|
|
105
|
+
resource: `artifact reader for ${sourcePath}`,
|
|
92
106
|
});
|
|
93
|
-
|
|
107
|
+
if (!readerCloseAttempted) {
|
|
108
|
+
try {
|
|
109
|
+
readerCloseAttempted = true;
|
|
110
|
+
await reader.close();
|
|
111
|
+
}
|
|
112
|
+
catch (cleanupCause) {
|
|
113
|
+
cleanupFailures.push({
|
|
114
|
+
cause: cleanupCause,
|
|
115
|
+
resource: `artifact reader for ${sourcePath}`,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (output !== undefined) {
|
|
120
|
+
try {
|
|
121
|
+
await output.rollback();
|
|
122
|
+
}
|
|
123
|
+
catch (cleanupCause) {
|
|
124
|
+
cleanupFailures.push({
|
|
125
|
+
cause: cleanupCause,
|
|
126
|
+
resource: input.outputRoot,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (cleanupFailures.length > 0) {
|
|
131
|
+
const observations = cleanupFailures.map(({ cause: cleanupCause, resource }) => ArtifactReaderFailure.cleanupObservation(cleanupCause, resource));
|
|
132
|
+
throw ArtifactReaderFailure.withCleanup(cause, {
|
|
133
|
+
reason: observations.map(({ reason }) => reason).join("; "),
|
|
134
|
+
resources: [
|
|
135
|
+
...new Set(observations.flatMap(({ resources }) => resources)),
|
|
136
|
+
],
|
|
137
|
+
});
|
|
138
|
+
}
|
|
94
139
|
throw cause;
|
|
95
140
|
}
|
|
96
141
|
};
|
|
@@ -99,7 +144,7 @@ const createExtractionResult = (input, inventory, selected, extracted) => {
|
|
|
99
144
|
source_manifest_id: inventory.manifest.manifest_id,
|
|
100
145
|
selected_occurrence_ids: selected
|
|
101
146
|
.map(({ occurrence }) => occurrence.occurrence_id)
|
|
102
|
-
.sort(
|
|
147
|
+
.sort(compareCodePoints),
|
|
103
148
|
files_sha256: canonicalDigest(extracted, "Artifact"),
|
|
104
149
|
output_root_alias: "$OUTPUT_ROOT",
|
|
105
150
|
};
|
|
@@ -133,20 +178,32 @@ const collectNodes = (items, selected, output) => {
|
|
|
133
178
|
if (selected.has(item.artifact_id))
|
|
134
179
|
output.set(item.artifact_id, item);
|
|
135
180
|
};
|
|
136
|
-
const
|
|
137
|
-
|
|
181
|
+
const ZIP_FORMATS = ["ipa", "apk", "msix", "appx", "zip"];
|
|
182
|
+
const isZipFormat = (format) => ZIP_FORMATS.includes(format);
|
|
183
|
+
/**
|
|
184
|
+
* Refuse a format without an extraction reader before inventory work starts.
|
|
185
|
+
* The target kind, not the host, is unsupported by extraction. The error keeps
|
|
186
|
+
* the caller's spelling of the path; I/O uses the canonical path.
|
|
187
|
+
*/
|
|
188
|
+
const requireExtractableFormat = async (path, input) => {
|
|
189
|
+
const format = input.inputFormat;
|
|
190
|
+
const directory = (await lstat(path)).isDirectory();
|
|
191
|
+
if (!directory &&
|
|
192
|
+
format !== "asar" &&
|
|
193
|
+
format !== "mach-o" &&
|
|
194
|
+
!isZipFormat(format))
|
|
195
|
+
throw new AnalysisUnsupportedTargetError("extract_artifact", input.inputPath, `Artifact format has no extraction reader: ${format}`);
|
|
196
|
+
return directory;
|
|
197
|
+
};
|
|
198
|
+
const createReader = async (path, input) => {
|
|
199
|
+
const format = input.inputFormat;
|
|
200
|
+
if (await requireExtractableFormat(path, input))
|
|
138
201
|
return new DirectoryArtifactReader(path);
|
|
139
202
|
if (format === "asar")
|
|
140
203
|
return new AsarArtifactReader(path);
|
|
141
|
-
if (format
|
|
142
|
-
format === "apk" ||
|
|
143
|
-
format === "msix" ||
|
|
144
|
-
format === "appx" ||
|
|
145
|
-
format === "zip")
|
|
204
|
+
if (isZipFormat(format))
|
|
146
205
|
return new ZipArtifactReader(path, format);
|
|
147
|
-
|
|
148
|
-
return new MachOSliceArtifactReader(path);
|
|
149
|
-
throw new ArtifactReaderFailure("unavailable", `Artifact format has no extraction reader: ${format}`);
|
|
206
|
+
return new MachOSliceArtifactReader(path, input.environment);
|
|
150
207
|
};
|
|
151
208
|
const preflight = (entry) => {
|
|
152
209
|
if ((entry.kind !== "file" && entry.kind !== "slice") || entry.encrypted)
|