rea-agents 6.0.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -18
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +205 -51
- package/bridge/hopper_bridge.py +314 -127
- package/bridge/mitmproxy/capture.py +0 -2
- package/bridge/native/rea_lldb_tracer.py +630 -94
- package/bridge/process/ProcessRunTokenReader.swift +39 -5
- package/bridge/pwntools/recorded_crash_impl.py +4 -0
- package/dist/android/JadxConfiguration.js +274 -31
- package/dist/android/JadxMcpTransport.js +18 -2
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +76 -37
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +48 -11
- package/dist/application/ClientConfigurationDocument.js +917 -8
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +56 -51
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +19 -21
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +64 -17
- package/dist/application/EvidenceBundleFiles.js +30 -13
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +11 -2
- package/dist/application/JsonFiles.js +83 -28
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +21 -17
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +21 -29
- package/dist/application/SetupPlan.js +11 -9
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +82 -29
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +57 -36
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCaptureService.js +4 -2
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +32 -6
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WorkflowEvidence.js +105 -0
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
- package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
- package/dist/application/binary/BinarySession.js +161 -93
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +4 -4
- package/dist/application/binary/BinarySessionRecords.js +26 -4
- package/dist/application/binary/BinarySessionStatus.js +18 -7
- package/dist/application/binary/CompositeProvider.js +16 -17
- package/dist/application/binary/LazyAnalysisProvider.js +8 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
- package/dist/application/evm/EvmInterfaceService.js +4 -2
- package/dist/application/homebrew.js +48 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
- package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
- package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/process/ProcessCli.js +25 -17
- package/dist/application/process/ProcessEvidence.js +4 -4
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +48 -13
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
- package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
- package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +59 -38
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +78 -15
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +25 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +41 -1
- package/dist/browser/history/CaptureRelease.js +5 -0
- package/dist/browser/history/HarCaptureAdapter.js +3 -3
- package/dist/browser/history/HarJson.js +3 -2
- package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +100 -37
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +10 -9
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +7 -3
- package/dist/cli/jsonOutput.js +4 -99
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +3 -5
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +18 -9
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -1
- package/dist/cliJsonInput.js +24 -5
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraStartupTimeout.js +12 -0
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +30 -0
- package/dist/config/parseConfig.js +8 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +7 -5
- package/dist/contracts/enhancedToolContracts.js +7 -6
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +7 -14
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +5 -3
- package/dist/contracts/officialToolContracts.js +16 -16
- package/dist/contracts/promptContracts.js +5 -5
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +3 -7
- package/dist/contracts/sessionStatusContract.js +2 -4
- package/dist/contracts/sessionToolContracts.js +18 -8
- package/dist/contracts/sessionToolSchemas.js +3 -19
- package/dist/contracts/toolContractExamples.js +0 -1
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -1
- package/dist/contracts/toolOutputSchemaGroups.js +160 -115
- package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
- package/dist/contracts/toolSchemaMetadata.js +41 -33
- package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +8 -3
- package/dist/domain/analysisErrorCore.js +6 -1
- package/dist/domain/analysisErrorPresentation.js +90 -20
- package/dist/domain/analysisErrorProjection.js +130 -32
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +18 -10
- package/dist/domain/apple/appleApplication.js +42 -15
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dylibResolution.js +130 -12
- package/dist/domain/apple/dylibResolutionFindings.js +9 -7
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +35 -3
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +28 -40
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +5 -10
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +13 -1
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +65 -36
- package/dist/domain/evidenceBundle.js +47 -8
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/explicitSensitiveFailure.js +17 -1
- package/dist/domain/firmware/firmwareAnalysis.js +6 -7
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +47 -64
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
- package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +90 -6
- package/dist/domain/localPath.js +6 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -11
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +37 -13
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +21 -16
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +79 -26
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +35 -12
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +3 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +4 -3
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +8 -45
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +19 -7
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
- package/dist/ghidra/GhidraClient.js +126 -34
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +13 -12
- package/dist/ghidra/GhidraInstallation.js +58 -33
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +66 -0
- package/dist/ghidra/GhidraLauncher.js +47 -22
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
- package/dist/ghidra/GhidraProviderClient.js +36 -15
- package/dist/ghidra/GhidraSessionError.js +13 -7
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +65 -56
- package/dist/hopper/HopperAnalysisProfile.js +65 -12
- package/dist/hopper/HopperCleanup.js +63 -22
- package/dist/hopper/HopperClient.js +288 -59
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +197 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +71 -19
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +134 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +133 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
- package/dist/inspector/V8InspectorProvider.js +82 -36
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +48 -22
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +87 -88
- package/dist/native/LldbCallTracer.js +372 -103
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +62 -3
- package/dist/native/NativeMacOSProvider.js +122 -31
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
- package/dist/process/DarwinProcessRunTokenReader.js +23 -10
- package/dist/process/ExecFileOutput.js +108 -6
- package/dist/process/OwnedCommand.js +7 -2
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +204 -57
- package/dist/process/ProcessOwnershipObservation.js +60 -9
- package/dist/process/ProviderProcess.js +39 -10
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +15 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +157 -0
- package/dist/server/createServer.js +61 -41
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -5
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +13 -10
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
- package/dist/server/registerBrowserScenarioTool.js +3 -6
- package/dist/server/registerBrowserTools.js +13 -18
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +9 -20
- package/dist/server/registerElectronTools.js +10 -15
- package/dist/server/registerEnhancedTools.js +36 -77
- package/dist/server/registerEvidenceTools.js +3 -6
- package/dist/server/registerEvmTools.js +2 -5
- package/dist/server/registerFirmwareTools.js +2 -5
- package/dist/server/registerFunctionComparisonTool.js +15 -12
- package/dist/server/registerInvestigationTools.js +16 -17
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
- package/dist/server/registerOfficialTools.js +4 -21
- package/dist/server/registerProcessComparisonTool.js +74 -48
- package/dist/server/registerRecordedCrashTools.js +2 -5
- package/dist/server/registerSessionRecordTools.js +19 -24
- package/dist/server/registerSessionStatusTool.js +19 -6
- package/dist/server/registerSessionTools.js +20 -18
- package/dist/server/registerWebModuleTool.js +2 -5
- package/dist/server/registerWebNetworkCaptureTool.js +2 -5
- package/dist/server/registerWebRuntimeTools.js +4 -9
- package/dist/server/registerWebScriptTool.js +2 -5
- package/dist/server/registerWebSourceLocationTool.js +2 -5
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +0 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +75 -51
- package/dist/server/toolResultEncoding.js +34 -0
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/install.sh +1 -1
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +44 -30
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +12 -3
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/ghidra/GhidraDefaults.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { decodeXmlPlistText } from "../../domain/propertyListXmlText.js";
|
|
2
|
+
/** A named resource-limit failure that keeps budget exhaustion out of decode errors. */
|
|
3
|
+
export class InterfaceBuilderDecodeBudgetExceeded extends Error {
|
|
4
|
+
reason;
|
|
5
|
+
constructor(reason, message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.reason = reason;
|
|
8
|
+
this.name = "InterfaceBuilderDecodeBudgetExceeded";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** Shared byte budget for decoder records and projected archive data. */
|
|
12
|
+
export class InterfaceBuilderDecodeBudget {
|
|
13
|
+
#initialBytes;
|
|
14
|
+
#remainingBytes;
|
|
15
|
+
constructor(maxBytes) {
|
|
16
|
+
this.#initialBytes = maxBytes;
|
|
17
|
+
this.#remainingBytes = maxBytes;
|
|
18
|
+
}
|
|
19
|
+
/** Representation bytes still available for the current inspection. */
|
|
20
|
+
get remainingBytes() {
|
|
21
|
+
return this.#remainingBytes;
|
|
22
|
+
}
|
|
23
|
+
/** Representation bytes reserved so far. */
|
|
24
|
+
get usedBytes() {
|
|
25
|
+
return this.#initialBytes - this.#remainingBytes;
|
|
26
|
+
}
|
|
27
|
+
/** Reserve representation bytes before allocation, or report exhaustion. */
|
|
28
|
+
reserve(bytes, message) {
|
|
29
|
+
if (!Number.isSafeInteger(bytes) ||
|
|
30
|
+
bytes < 0 ||
|
|
31
|
+
bytes > this.#remainingBytes)
|
|
32
|
+
throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", message);
|
|
33
|
+
this.#remainingBytes -= bytes;
|
|
34
|
+
}
|
|
35
|
+
/** Reserve an upper bound for one JSON-serialized string occurrence. */
|
|
36
|
+
reserveJsonStringOccurrence(value) {
|
|
37
|
+
// JSON escaping uses at most six ASCII bytes per UTF-16 code unit, plus
|
|
38
|
+
// quotes. Count occurrences even when the source string is shared.
|
|
39
|
+
this.reserve(value.length * 6 + 2, "projected JSON strings exceed the aggregate Interface Builder decode budget");
|
|
40
|
+
}
|
|
41
|
+
/** Reserve the exact JSON string length for a base64 value from Buffer. */
|
|
42
|
+
reserveBase64JsonStringOccurrence(value) {
|
|
43
|
+
// Buffer's base64 alphabet contains no JSON-escaped characters.
|
|
44
|
+
this.reserve(value.length + 2, "projected NIB base64 values exceed the aggregate Interface Builder decode budget");
|
|
45
|
+
}
|
|
46
|
+
/** Reserve an upper bound for one JSON object property name occurrence. */
|
|
47
|
+
reserveJsonPropertyNameOccurrence(value) {
|
|
48
|
+
this.reserve(value.length * 6 + 3, "projected JSON property names exceed the aggregate Interface Builder decode budget");
|
|
49
|
+
}
|
|
50
|
+
/** Reserve bytes for an optional projection without throwing on exhaustion. */
|
|
51
|
+
tryReserve(bytes) {
|
|
52
|
+
if (!Number.isSafeInteger(bytes) ||
|
|
53
|
+
bytes < 0 ||
|
|
54
|
+
bytes > this.#remainingBytes)
|
|
55
|
+
return false;
|
|
56
|
+
this.#remainingBytes -= bytes;
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Preflight the representation created by the pinned plist decoder. */
|
|
61
|
+
export const estimatePropertyListDecodeBytes = (bytes, maxBytes, xmlText) => {
|
|
62
|
+
const estimate = bytes.subarray(0, 8).toString("ascii") === "bplist00"
|
|
63
|
+
? estimateBinaryPlistExpansion(bytes, maxBytes)
|
|
64
|
+
: estimateXmlPlistExpansion(bytes, maxBytes, xmlText);
|
|
65
|
+
if (estimate > maxBytes)
|
|
66
|
+
throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "plist representation exceeds the aggregate Interface Builder decode budget");
|
|
67
|
+
return estimate;
|
|
68
|
+
};
|
|
69
|
+
const estimateXmlPlistExpansion = (bytes, maxBytes, xmlText) => {
|
|
70
|
+
const xml = xmlText ?? decodeXmlPlistText(bytes);
|
|
71
|
+
if (/<!DOCTYPE\b[^>]*\[/iu.test(xml))
|
|
72
|
+
throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "XML plist internal entity expansion exceeds the aggregate Interface Builder decode budget");
|
|
73
|
+
const elementPattern = /<!--[^]*?-->|<!\[CDATA\[[^]*?\]\]>|<!DOCTYPE[^>]*>|<\?[^]*?\?>|<\/?[A-Za-z][^>]*>/giu;
|
|
74
|
+
const decodedSourceBytes = xml.length * 2;
|
|
75
|
+
let elementCount = 0;
|
|
76
|
+
let xmlDepth = 0;
|
|
77
|
+
for (const match of xml.matchAll(elementPattern)) {
|
|
78
|
+
const token = match[0] ?? "";
|
|
79
|
+
if (token.startsWith("<!--") ||
|
|
80
|
+
token.startsWith("<![CDATA[") ||
|
|
81
|
+
token.startsWith("<!DOCTYPE") ||
|
|
82
|
+
token.startsWith("<?"))
|
|
83
|
+
continue;
|
|
84
|
+
elementCount += 1;
|
|
85
|
+
if (token.startsWith("</"))
|
|
86
|
+
xmlDepth -= 1;
|
|
87
|
+
else if (!token.endsWith("/>")) {
|
|
88
|
+
xmlDepth += 1;
|
|
89
|
+
if (xmlDepth > 128)
|
|
90
|
+
throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "XML plist nesting exceeds the aggregate Interface Builder decode budget");
|
|
91
|
+
}
|
|
92
|
+
if (decodedSourceBytes * 2 + elementCount * 128 > maxBytes)
|
|
93
|
+
return maxBytes + 1;
|
|
94
|
+
}
|
|
95
|
+
return decodedSourceBytes * 2 + elementCount * 128;
|
|
96
|
+
};
|
|
97
|
+
/** Count every expanded binary-plist reference before calling plist.parseBinary. */
|
|
98
|
+
const estimateBinaryPlistExpansion = (bytes, maxBytes) => {
|
|
99
|
+
if (bytes.length < 40)
|
|
100
|
+
throw new TypeError("binary plist trailer is truncated");
|
|
101
|
+
const trailer = bytes.length - 32;
|
|
102
|
+
const offsetSize = bytes[trailer + 6] ?? 0;
|
|
103
|
+
const referenceSize = bytes[trailer + 7] ?? 0;
|
|
104
|
+
if (![1, 2, 4, 8].includes(offsetSize) ||
|
|
105
|
+
![1, 2, 4, 8].includes(referenceSize))
|
|
106
|
+
throw new TypeError("binary plist trailer integer sizes are invalid");
|
|
107
|
+
const readInteger = (offset, size) => {
|
|
108
|
+
if (offset < 0 || size < 1 || offset + size > bytes.length)
|
|
109
|
+
return -1;
|
|
110
|
+
let value = 0;
|
|
111
|
+
for (let index = 0; index < size; index += 1)
|
|
112
|
+
value = value * 256 + (bytes[offset + index] ?? 0);
|
|
113
|
+
return Number.isSafeInteger(value) ? value : -1;
|
|
114
|
+
};
|
|
115
|
+
const objectCount = readInteger(trailer + 8, 8);
|
|
116
|
+
const topObject = readInteger(trailer + 16, 8);
|
|
117
|
+
const offsetTable = readInteger(trailer + 24, 8);
|
|
118
|
+
if (objectCount < 1 ||
|
|
119
|
+
topObject < 0 ||
|
|
120
|
+
topObject >= objectCount ||
|
|
121
|
+
offsetTable < 8 ||
|
|
122
|
+
offsetTable + objectCount * offsetSize > trailer)
|
|
123
|
+
throw new TypeError("binary plist trailer or object table is invalid");
|
|
124
|
+
let estimate = bytes.length * 2 + objectCount * 16;
|
|
125
|
+
if (estimate > maxBytes)
|
|
126
|
+
throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "binary plist object table exceeds the aggregate Interface Builder decode budget");
|
|
127
|
+
const active = new Set();
|
|
128
|
+
const pending = [
|
|
129
|
+
{ object: topObject, depth: 0, exit: false },
|
|
130
|
+
];
|
|
131
|
+
let pendingObjectCount = 1;
|
|
132
|
+
while (pending.length > 0) {
|
|
133
|
+
const entry = pending.pop();
|
|
134
|
+
if (entry === undefined)
|
|
135
|
+
break;
|
|
136
|
+
if (entry.exit) {
|
|
137
|
+
active.delete(entry.object);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
pendingObjectCount -= 1;
|
|
141
|
+
if (entry.depth > 128)
|
|
142
|
+
throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "binary plist nesting exceeds the aggregate Interface Builder decode budget");
|
|
143
|
+
if (active.has(entry.object))
|
|
144
|
+
throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "binary plist reference cycle exceeds the aggregate Interface Builder decode budget");
|
|
145
|
+
estimate += 96;
|
|
146
|
+
if (estimate > maxBytes)
|
|
147
|
+
throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "binary plist reference expansion exceeds the aggregate Interface Builder decode budget");
|
|
148
|
+
const offset = readInteger(offsetTable + entry.object * offsetSize, offsetSize);
|
|
149
|
+
if (offset < 8 || offset >= offsetTable)
|
|
150
|
+
throw new TypeError("binary plist object offset is invalid");
|
|
151
|
+
const marker = bytes[offset] ?? 0;
|
|
152
|
+
const type = marker >> 4;
|
|
153
|
+
let size = marker & 0x0f;
|
|
154
|
+
let cursor = offset + 1;
|
|
155
|
+
if (size === 0x0f && type !== 0 && type !== 8) {
|
|
156
|
+
const extMarker = bytes[cursor] ?? 0;
|
|
157
|
+
if (extMarker >> 4 !== 1 || (extMarker & 0x0f) > 3)
|
|
158
|
+
throw new TypeError("binary plist extended object size is invalid");
|
|
159
|
+
cursor += 1;
|
|
160
|
+
const integerSize = 1 << (extMarker & 0x0f);
|
|
161
|
+
size = readInteger(cursor, integerSize);
|
|
162
|
+
cursor += integerSize;
|
|
163
|
+
if (size < 0 || cursor > offsetTable)
|
|
164
|
+
throw new TypeError("binary plist extended object size is invalid");
|
|
165
|
+
}
|
|
166
|
+
if (type === 4 || type === 5 || type === 6) {
|
|
167
|
+
const byteLength = type === 6 ? size * 2 : size;
|
|
168
|
+
if (cursor + byteLength > offsetTable)
|
|
169
|
+
throw new TypeError("binary plist scalar object is truncated");
|
|
170
|
+
estimate += type === 4 ? size + 4 * Math.ceil(size / 3) : byteLength * 2;
|
|
171
|
+
if (estimate > maxBytes)
|
|
172
|
+
throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "binary plist scalar expansion exceeds the aggregate Interface Builder decode budget");
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
if (type !== 10 && type !== 13)
|
|
176
|
+
continue;
|
|
177
|
+
const childCount = type === 13 ? size * 2 : size;
|
|
178
|
+
const refsEnd = cursor + childCount * referenceSize;
|
|
179
|
+
if (!Number.isSafeInteger(refsEnd) || refsEnd > offsetTable)
|
|
180
|
+
throw new TypeError("binary plist reference table is truncated");
|
|
181
|
+
const availableNodes = Math.floor((maxBytes - estimate) / 96);
|
|
182
|
+
if (childCount > availableNodes - pendingObjectCount)
|
|
183
|
+
throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "binary plist reference expansion exceeds the aggregate Interface Builder decode budget");
|
|
184
|
+
active.add(entry.object);
|
|
185
|
+
pending.push({ object: entry.object, depth: entry.depth, exit: true });
|
|
186
|
+
for (let index = childCount - 1; index >= 0; index -= 1) {
|
|
187
|
+
const reference = readInteger(cursor + index * referenceSize, referenceSize);
|
|
188
|
+
if (reference < 0 || reference >= objectCount)
|
|
189
|
+
throw new TypeError("binary plist reference is invalid");
|
|
190
|
+
pending.push({ object: reference, depth: entry.depth + 1, exit: false });
|
|
191
|
+
}
|
|
192
|
+
pendingObjectCount += childCount;
|
|
193
|
+
}
|
|
194
|
+
return estimate;
|
|
195
|
+
};
|
|
@@ -1,55 +1,73 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import {
|
|
2
|
+
import { join } from "node:path";
|
|
3
3
|
import { parseBinary } from "plist";
|
|
4
4
|
import { z } from "zod";
|
|
5
|
+
import { AnalysisInputError, AnalysisUnsupportedTargetError, } from "../../domain/analysisErrorCore.js";
|
|
5
6
|
import { projectPlistValue } from "../../domain/apple/plistValue.js";
|
|
7
|
+
import { createPlistNumberProjection } from "../../domain/apple/plistNumbers.js";
|
|
8
|
+
import { binaryPlistNumberLiterals, xmlPlistNumberLiterals, } from "./PlistNumberLiterals.js";
|
|
6
9
|
import { omittedPrototypeKeysLimitation, parseXmlPropertyList, } from "../../domain/propertyListKeys.js";
|
|
7
|
-
import { keyedArchiveInputSchema, keyedArchiveResultSchema, projectKeyedArchive, } from "../../domain/apple/keyedArchive.js";
|
|
10
|
+
import { KeyedArchiveKindError, keyedArchiveInputSchema, keyedArchiveResultSchema, projectKeyedArchive, } from "../../domain/apple/keyedArchive.js";
|
|
8
11
|
import { DirectoryArtifactReader } from "../DirectoryArtifactReader.js";
|
|
9
12
|
import { ArtifactReaderFailure } from "../ArtifactReader.js";
|
|
13
|
+
import { decodeXmlPlistText } from "../../domain/propertyListXmlText.js";
|
|
10
14
|
const MAX_BYTES = 64 * 1024 * 1024;
|
|
11
15
|
/** Parse inert plist bytes, preserving data and dates with explicit typed values. */
|
|
12
16
|
export const decodeKeyedArchiveBytes = (bytes, selection) => {
|
|
13
17
|
if (bytes.length > MAX_BYTES)
|
|
14
18
|
throw new RangeError("Keyed archive exceeds 64 MiB");
|
|
19
|
+
if (bytes.subarray(0, 10).toString("ascii") === "NIBArchive")
|
|
20
|
+
throw new KeyedArchiveKindError("Selected file is a compiled NIBArchive, not a Foundation plist archive; decode it with decode_interface_builder", "nib-archive");
|
|
15
21
|
const binary = bytes.subarray(0, 8).toString("ascii") === "bplist00";
|
|
22
|
+
const xmlText = binary ? undefined : decodeXmlPlistText(bytes);
|
|
16
23
|
const parsed = binary
|
|
17
24
|
? { value: parseBinary(bytes), omittedPrototypeKeys: 0 }
|
|
18
|
-
: parseXmlPropertyList(
|
|
25
|
+
: parseXmlPropertyList(xmlText ?? "");
|
|
19
26
|
const graph = projectKeyedArchive(normalizePlist(parsed.value), selection);
|
|
27
|
+
const numbers = createPlistNumberProjection(binary
|
|
28
|
+
? binaryPlistNumberLiterals(bytes)
|
|
29
|
+
: xmlPlistNumberLiterals(xmlText ?? ""));
|
|
30
|
+
// Classify the serialized graph before projecting values to typed decimals.
|
|
31
|
+
// Numeric IDs, node kinds, references and pagination retain their original meaning.
|
|
32
|
+
const roots = Object.fromEntries(Object.entries(graph.roots).map(([name, value]) => [
|
|
33
|
+
name,
|
|
34
|
+
numbers.project(value),
|
|
35
|
+
]));
|
|
36
|
+
const objects = graph.objects.map((object) => ({
|
|
37
|
+
...object,
|
|
38
|
+
value: numbers.project(object.value),
|
|
39
|
+
}));
|
|
20
40
|
return {
|
|
21
41
|
archive_format: binary ? "binary-plist" : "xml-plist",
|
|
22
42
|
...graph,
|
|
43
|
+
roots,
|
|
44
|
+
objects,
|
|
23
45
|
limitations: [
|
|
24
46
|
...graph.limitations,
|
|
47
|
+
...numbers.limitations(),
|
|
25
48
|
...(parsed.omittedPrototypeKeys === 0
|
|
26
49
|
? []
|
|
27
50
|
: [omittedPrototypeKeysLimitation(parsed.omittedPrototypeKeys)]),
|
|
28
51
|
],
|
|
29
52
|
};
|
|
30
53
|
};
|
|
31
|
-
const decodeXmlPlistText = (bytes) => {
|
|
32
|
-
const encoding = bytes[0] === 0xff && bytes[1] === 0xfe
|
|
33
|
-
? "utf-16le"
|
|
34
|
-
: bytes[0] === 0xfe && bytes[1] === 0xff
|
|
35
|
-
? "utf-16be"
|
|
36
|
-
: "utf-8";
|
|
37
|
-
const text = new TextDecoder(encoding, { fatal: true }).decode(bytes);
|
|
38
|
-
const declared = /^<\?xml\s[^?]*\bencoding\s*=\s*["']([^"']+)["']/u
|
|
39
|
-
.exec(text)?.[1]
|
|
40
|
-
?.toLowerCase();
|
|
41
|
-
if (declared !== undefined &&
|
|
42
|
-
((encoding !== "utf-8" && declared !== encoding && declared !== "utf-16") ||
|
|
43
|
-
(encoding === "utf-8" && declared.startsWith("utf-16"))))
|
|
44
|
-
throw new TypeError("XML encoding declaration disagrees with its bytes");
|
|
45
|
-
return text;
|
|
46
|
-
};
|
|
47
54
|
const normalizePlist = (value) => {
|
|
48
55
|
const projected = projectPlistValue(value);
|
|
49
56
|
if (projected.unknownRealCount > 0)
|
|
50
57
|
throw new RangeError("Keyed archive contains a non-finite real");
|
|
51
58
|
return projected.value;
|
|
52
59
|
};
|
|
60
|
+
/**
|
|
61
|
+
* Point to the workflow that reads the selected kind of file on this host.
|
|
62
|
+
* decode_interface_builder is portable; inspect_plist requires macOS.
|
|
63
|
+
*/
|
|
64
|
+
const keyedArchiveKindRemediation = (kind, platform) => {
|
|
65
|
+
if (kind === "nib-archive")
|
|
66
|
+
return "Decode compiled NIBArchive files with decode_interface_builder on the app bundle.";
|
|
67
|
+
return platform === "darwin"
|
|
68
|
+
? "Inspect an ordinary property list with inspect_plist; inspect_keyed_archive decodes NSKeyedArchiver archives only."
|
|
69
|
+
: "Select an NSKeyedArchiver archive; inspect_keyed_archive decodes only those. inspect_plist, which reads ordinary property lists, requires a macOS host.";
|
|
70
|
+
};
|
|
53
71
|
/** Read exactly one regular, contained bundle entry without following symlinks. */
|
|
54
72
|
export const inspectBundleKeyedArchive = async (input) => {
|
|
55
73
|
const selected = keyedArchiveInputSchema.parse(input.parameters);
|
|
@@ -57,14 +75,16 @@ export const inspectBundleKeyedArchive = async (input) => {
|
|
|
57
75
|
selected.path
|
|
58
76
|
.split("/")
|
|
59
77
|
.some((part) => part === ".." || part === "." || part.length === 0))
|
|
60
|
-
throw
|
|
78
|
+
throw archivePathError("invalid_format", selected.path === "."
|
|
79
|
+
? "Select a keyed archive path relative to the active app bundle."
|
|
80
|
+
: `Archive path must be a canonical relative bundle path without empty, '.', or '..' segments: ${selected.path}`);
|
|
61
81
|
const reader = new DirectoryArtifactReader(input.bundlePath);
|
|
62
82
|
try {
|
|
63
83
|
for await (const entry of reader.entries(input.signal)) {
|
|
64
84
|
if (entry.path !== selected.path)
|
|
65
85
|
continue;
|
|
66
86
|
if (entry.kind !== "file")
|
|
67
|
-
throw
|
|
87
|
+
throw archivePathError("invalid_value", `Archive path selects a ${entry.kind}, not a regular file: ${selected.path}`);
|
|
68
88
|
if ((entry.declaredSize ?? 0) > MAX_BYTES)
|
|
69
89
|
throw new ArtifactReaderFailure("limit", "Keyed archive exceeds 64 MiB");
|
|
70
90
|
const stream = await reader.open(entry, input.signal);
|
|
@@ -93,12 +113,24 @@ export const inspectBundleKeyedArchive = async (input) => {
|
|
|
93
113
|
});
|
|
94
114
|
}
|
|
95
115
|
catch (cause) {
|
|
96
|
-
|
|
116
|
+
if (cause instanceof AnalysisInputError)
|
|
117
|
+
throw cause;
|
|
118
|
+
// An intact file of another kind is not a damaged archive.
|
|
119
|
+
if (cause instanceof KeyedArchiveKindError)
|
|
120
|
+
throw new AnalysisUnsupportedTargetError("inspect_keyed_archive", join(input.bundlePath, entry.path), cause.message, {
|
|
121
|
+
cause,
|
|
122
|
+
remediationAction: keyedArchiveKindRemediation(cause.kind, input.platform ?? process.platform),
|
|
123
|
+
});
|
|
124
|
+
throw new ArtifactReaderFailure(cause instanceof RangeError ? "limit" : "format", `Cannot decode selected Foundation keyed archive: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
|
|
97
125
|
}
|
|
98
126
|
}
|
|
99
|
-
throw
|
|
127
|
+
throw archivePathError("invalid_value", `No regular file exists at ${selected.path} in the active app bundle.`);
|
|
100
128
|
}
|
|
101
129
|
finally {
|
|
102
130
|
await reader.close();
|
|
103
131
|
}
|
|
104
132
|
};
|
|
133
|
+
/** A caller-selected archive path, not the artifact, failed its constraint. */
|
|
134
|
+
const archivePathError = (reason, message) => new AnalysisInputError("inspect_keyed_archive", undefined, [
|
|
135
|
+
{ path: ["path"], reason, message },
|
|
136
|
+
]);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { readFatSliceDeclarations, validateFatSlice, } from "../../domain/apple/machoContainer.js";
|
|
1
2
|
/** Load commands larger than this are refused instead of buffered. */
|
|
2
3
|
export const MAX_LOAD_COMMAND_BYTES = 16 * 1024 * 1024;
|
|
3
4
|
/** Target opening accepts up to 128 FAT records; Java class files share the FAT magic. */
|
|
@@ -23,6 +24,11 @@ const LC_LOAD_UPWARD_DYLIB = 0x80000023;
|
|
|
23
24
|
const LC_RPATH = 0x8000001c;
|
|
24
25
|
const LC_DYLD_ENVIRONMENT = 0x27;
|
|
25
26
|
const LC_CODE_SIGNATURE = 0x1d;
|
|
27
|
+
const LC_VERSION_MIN_MACOSX = 0x24;
|
|
28
|
+
const LC_VERSION_MIN_IPHONEOS = 0x25;
|
|
29
|
+
const LC_VERSION_MIN_TVOS = 0x2f;
|
|
30
|
+
const LC_VERSION_MIN_WATCHOS = 0x30;
|
|
31
|
+
const LC_BUILD_VERSION = 0x32;
|
|
26
32
|
/** `mach-o/loader.h` `dylib_use_command`: `nameoff == 28` and this marker. */
|
|
27
33
|
const DYLIB_USE_MARKER = 0x1a741800;
|
|
28
34
|
const DYLIB_USE_WEAK_LINK = 0x1;
|
|
@@ -85,18 +91,35 @@ export const readMachoImage = async (readAt, size) => {
|
|
|
85
91
|
};
|
|
86
92
|
if (count > MAX_FAT_ARCHITECTURES || 8 + count * (wide ? 32 : 20) > size)
|
|
87
93
|
return { status: "not-mach-o" };
|
|
88
|
-
const
|
|
94
|
+
const tableBytes = await readExact(readAt, 8, count * (wide ? 32 : 20), "FAT table");
|
|
95
|
+
const declarations = readFatSliceDeclarations(tableBytes, {
|
|
96
|
+
count,
|
|
97
|
+
wide,
|
|
98
|
+
littleEndian,
|
|
99
|
+
});
|
|
100
|
+
if (declarations.status !== "parsed")
|
|
101
|
+
throw new MachoFormatIssue("malformed", declarations.reason);
|
|
89
102
|
// A Java class file's version fields read as a FAT count; its "table" names no CPU.
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
103
|
+
if (!declarations.slices.some(({ cpuType }) => KNOWN_CPU_TYPES.includes(cpuType))) {
|
|
104
|
+
let hasMachOSliceHeader = false;
|
|
105
|
+
for (const declaration of declarations.slices) {
|
|
106
|
+
if (validateFatSlice(declaration, size, 8 + count * (wide ? 32 : 20)) !== null)
|
|
107
|
+
continue;
|
|
108
|
+
const bytes = await readAt(declaration.offset, 4);
|
|
109
|
+
if (bytes.byteLength < 4)
|
|
110
|
+
continue;
|
|
111
|
+
const sliceMagic = viewOf(bytes).getUint32(0, false);
|
|
112
|
+
if ([MH_MAGIC, MH_MAGIC_64, MH_CIGAM, MH_CIGAM_64].includes(sliceMagic)) {
|
|
113
|
+
hasMachOSliceHeader = true;
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (!hasMachOSliceHeader)
|
|
118
|
+
return { status: "not-mach-o" };
|
|
119
|
+
}
|
|
93
120
|
return {
|
|
94
121
|
status: "parsed",
|
|
95
|
-
slices: await readFatSlices(readAt, size,
|
|
96
|
-
wide,
|
|
97
|
-
littleEndian,
|
|
98
|
-
count,
|
|
99
|
-
}),
|
|
122
|
+
slices: await readFatSlices(readAt, size, 8 + count * (wide ? 32 : 20), declarations.slices),
|
|
100
123
|
};
|
|
101
124
|
}
|
|
102
125
|
if (magic === MH_CIGAM || magic === MH_CIGAM_64)
|
|
@@ -111,26 +134,29 @@ export const readMachoImage = async (readAt, size) => {
|
|
|
111
134
|
throw cause;
|
|
112
135
|
}
|
|
113
136
|
};
|
|
114
|
-
const readFatSlices = async (readAt, size,
|
|
115
|
-
const { wide, littleEndian, count } = table;
|
|
116
|
-
const entrySize = wide ? 32 : 20;
|
|
117
|
-
const view = viewOf(await readExact(readAt, 8, count * entrySize, "FAT table"));
|
|
137
|
+
const readFatSlices = async (readAt, size, tableEnd, declarations) => {
|
|
118
138
|
const slices = [];
|
|
119
|
-
for (
|
|
120
|
-
const
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
:
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
139
|
+
for (const declaration of declarations) {
|
|
140
|
+
const { index, offset, size: length, cpuType, cpuSubtype } = declaration;
|
|
141
|
+
const rangeIssue = validateFatSlice(declaration, size, tableEnd);
|
|
142
|
+
if (rangeIssue !== null)
|
|
143
|
+
throw new MachoFormatIssue(rangeIssue.includes("unsupported") ? "unsupported" : "malformed", rangeIssue);
|
|
144
|
+
const slice = await readSlice(readAt, offset, length, {
|
|
145
|
+
fatCpuType: cpuType,
|
|
146
|
+
fatCpuSubtype: cpuSubtype,
|
|
147
|
+
alignmentExponent: declaration.alignmentExponent,
|
|
148
|
+
});
|
|
149
|
+
const identityIssue = validateFatSlice(declaration, size, tableEnd, {
|
|
150
|
+
cpuType: slice.cpu_type,
|
|
151
|
+
cpuSubtype: slice.cpu_subtype,
|
|
152
|
+
});
|
|
153
|
+
if (identityIssue !== null)
|
|
154
|
+
throw new MachoFormatIssue("malformed", identityIssue);
|
|
155
|
+
slices.push(slice);
|
|
130
156
|
}
|
|
131
157
|
return slices;
|
|
132
158
|
};
|
|
133
|
-
const readSlice = async (readAt, base, length) => {
|
|
159
|
+
const readSlice = async (readAt, base, length, fat = null) => {
|
|
134
160
|
const header = viewOf(await readExact(readAt, base, 28, "Mach-O header"));
|
|
135
161
|
const magic = header.getUint32(0, true);
|
|
136
162
|
if (magic === MH_MAGIC_64 || magic === MH_MAGIC) {
|
|
@@ -143,13 +169,22 @@ const readSlice = async (readAt, base, length) => {
|
|
|
143
169
|
if (headerSize + commandBytes > length)
|
|
144
170
|
throw new MachoFormatIssue("malformed", "load commands extend beyond the Mach-O slice");
|
|
145
171
|
const commands = await readExact(readAt, base + headerSize, commandBytes, "load commands");
|
|
146
|
-
|
|
172
|
+
const slice = decodeCommands(commands, {
|
|
147
173
|
wide,
|
|
148
174
|
cpuType: header.getUint32(4, true),
|
|
149
175
|
cpuSubtype: header.getUint32(8, true),
|
|
150
176
|
fileType: header.getUint32(12, true),
|
|
151
177
|
commandCount,
|
|
178
|
+
sliceOffset: base,
|
|
179
|
+
sliceSize: length,
|
|
180
|
+
fatCpuType: fat?.fatCpuType ?? null,
|
|
181
|
+
fatCpuSubtype: fat?.fatCpuSubtype ?? null,
|
|
182
|
+
fatAlignmentExponent: fat?.alignmentExponent ?? null,
|
|
152
183
|
});
|
|
184
|
+
const distinctPlatforms = [...new Set(slice.platforms)];
|
|
185
|
+
slice.platform =
|
|
186
|
+
distinctPlatforms.length === 1 ? (distinctPlatforms[0] ?? null) : null;
|
|
187
|
+
return slice;
|
|
153
188
|
}
|
|
154
189
|
throw new MachoFormatIssue(magic === swap(MH_MAGIC) || magic === swap(MH_MAGIC_64)
|
|
155
190
|
? "unsupported"
|
|
@@ -163,7 +198,17 @@ const decodeCommands = (bytes, header) => {
|
|
|
163
198
|
const view = viewOf(bytes);
|
|
164
199
|
const slice = {
|
|
165
200
|
architecture: architectureName(header.cpuType, header.cpuSubtype),
|
|
201
|
+
slice_offset: header.sliceOffset,
|
|
202
|
+
slice_size: header.sliceSize,
|
|
203
|
+
cpu_type: header.cpuType,
|
|
204
|
+
cpu_subtype: header.cpuSubtype,
|
|
205
|
+
fat_cpu_type: header.fatCpuType,
|
|
206
|
+
fat_cpu_subtype: header.fatCpuSubtype,
|
|
207
|
+
fat_alignment_exponent: header.fatAlignmentExponent,
|
|
166
208
|
file_type: fileTypeName(header.fileType),
|
|
209
|
+
file_type_code: header.fileType,
|
|
210
|
+
platform: null,
|
|
211
|
+
platforms: [],
|
|
167
212
|
install_name: null,
|
|
168
213
|
dependencies: [],
|
|
169
214
|
rpaths: [],
|
|
@@ -182,6 +227,8 @@ const decodeCommands = (bytes, header) => {
|
|
|
182
227
|
decodeCommand(command, body, index, slice);
|
|
183
228
|
offset += size;
|
|
184
229
|
}
|
|
230
|
+
if (offset !== bytes.byteLength)
|
|
231
|
+
throw new MachoFormatIssue("malformed", `load commands declare ${header.commandCount} commands but sizeofcmds holds ${bytes.byteLength} bytes`);
|
|
185
232
|
return slice;
|
|
186
233
|
};
|
|
187
234
|
const decodeCommand = (command, body, index, slice) => {
|
|
@@ -204,6 +251,25 @@ const decodeCommand = (command, body, index, slice) => {
|
|
|
204
251
|
slice.code_signature_present = true;
|
|
205
252
|
return;
|
|
206
253
|
}
|
|
254
|
+
if (command === LC_BUILD_VERSION) {
|
|
255
|
+
if (body.byteLength < 24)
|
|
256
|
+
throw new MachoFormatIssue("malformed", `load command ${index} is too short for LC_BUILD_VERSION`);
|
|
257
|
+
const platform = viewOf(body).getUint32(8, true);
|
|
258
|
+
slice.platforms.push(platform);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
const legacyPlatform = new Map([
|
|
262
|
+
[LC_VERSION_MIN_MACOSX, 1],
|
|
263
|
+
[LC_VERSION_MIN_IPHONEOS, 2],
|
|
264
|
+
[LC_VERSION_MIN_TVOS, 3],
|
|
265
|
+
[LC_VERSION_MIN_WATCHOS, 4],
|
|
266
|
+
]).get(command);
|
|
267
|
+
if (legacyPlatform !== undefined) {
|
|
268
|
+
if (body.byteLength < 16)
|
|
269
|
+
throw new MachoFormatIssue("malformed", `load command ${index} is too short for a version-min command`);
|
|
270
|
+
slice.platforms.push(legacyPlatform);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
207
273
|
const name = DEPENDENCY_COMMANDS.get(command);
|
|
208
274
|
if (name !== undefined)
|
|
209
275
|
slice.dependencies.push(decodeDependency(name, body, index));
|
|
@@ -286,9 +352,4 @@ const swap = (value) => (((value & 0xff) << 24) |
|
|
|
286
352
|
((value >>> 8) & 0xff00) |
|
|
287
353
|
(value >>> 24)) >>>
|
|
288
354
|
0;
|
|
289
|
-
const safeNumber = (value) => {
|
|
290
|
-
if (value > BigInt(Number.MAX_SAFE_INTEGER))
|
|
291
|
-
throw new MachoFormatIssue("malformed", "FAT offset exceeds safe range");
|
|
292
|
-
return Number(value);
|
|
293
|
-
};
|
|
294
355
|
const viewOf = (bytes) => new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|