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
|
@@ -77,7 +77,7 @@ export const decodeAppleDispatchMetadata = (bytes, maxRecords, provenance, archi
|
|
|
77
77
|
evidence,
|
|
78
78
|
offset,
|
|
79
79
|
};
|
|
80
|
-
const { failures, examined, categoriesExamined } = decodeObjcDispatchFacets({
|
|
80
|
+
const { failures, categoryIssues, examined, categoriesExamined } = decodeObjcDispatchFacets({
|
|
81
81
|
bytes,
|
|
82
82
|
sections,
|
|
83
83
|
segments,
|
|
@@ -91,7 +91,7 @@ export const decodeAppleDispatchMetadata = (bytes, maxRecords, provenance, archi
|
|
|
91
91
|
budget,
|
|
92
92
|
result,
|
|
93
93
|
});
|
|
94
|
-
decodeSwiftDispatchFacets({
|
|
94
|
+
const swift = decodeSwiftDispatchFacets({
|
|
95
95
|
sections,
|
|
96
96
|
segments,
|
|
97
97
|
readers,
|
|
@@ -108,7 +108,7 @@ export const decodeAppleDispatchMetadata = (bytes, maxRecords, provenance, archi
|
|
|
108
108
|
if (section.size / 4 > maxRecords)
|
|
109
109
|
budget.truncated = true;
|
|
110
110
|
}
|
|
111
|
-
decodeSwiftClassVtables({
|
|
111
|
+
const vtables = decodeSwiftClassVtables({
|
|
112
112
|
entries: typeEntries,
|
|
113
113
|
result,
|
|
114
114
|
readers: {
|
|
@@ -126,10 +126,13 @@ export const decodeAppleDispatchMetadata = (bytes, maxRecords, provenance, archi
|
|
|
126
126
|
pushDispatchCoverage({
|
|
127
127
|
result,
|
|
128
128
|
failures,
|
|
129
|
+
categoryIssues,
|
|
129
130
|
examined,
|
|
130
131
|
categoriesExamined,
|
|
131
132
|
truncated: budget.truncated,
|
|
132
133
|
fixups,
|
|
134
|
+
vtables,
|
|
135
|
+
swift,
|
|
133
136
|
});
|
|
134
137
|
return objcSwiftMetadataSchema.parse(result);
|
|
135
138
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { issue } from "./AppleDispatchDecodeFacts.js";
|
|
1
2
|
const POINTER_FORMATS = {
|
|
2
3
|
1: "DYLD_CHAINED_PTR_ARM64E",
|
|
3
4
|
2: "DYLD_CHAINED_PTR_64",
|
|
@@ -19,39 +20,42 @@ const cString = (bytes, offset, end) => {
|
|
|
19
20
|
throw new RangeError("Fixup symbol name is outside the symbol pool");
|
|
20
21
|
return bytes.toString("utf8", offset, stop);
|
|
21
22
|
};
|
|
22
|
-
const
|
|
23
|
+
const readImport = (data, header, index) => {
|
|
23
24
|
const { bytes, base, end, dylibs } = data;
|
|
24
25
|
const size = header.format === 3 ? 16 : header.format === 2 ? 8 : 4;
|
|
25
26
|
if (header.format < 1 || header.format > 3)
|
|
26
27
|
throw new RangeError(`Unsupported chained import format ${header.format}`);
|
|
27
|
-
if (
|
|
28
|
+
if (!Number.isSafeInteger(header.count) ||
|
|
29
|
+
base + header.offset + header.count * size > end)
|
|
28
30
|
throw new RangeError("Chained import table exceeds the fixup data");
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
symbol: cString(bytes, base + header.symbols + Number(bits(word, 32, 32)), end),
|
|
36
|
-
library: libraryName(ordinal, dylibs),
|
|
37
|
-
weak: bits(word, 16, 1) === 1n,
|
|
38
|
-
addend: bytes.readBigInt64LE(at + 8),
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
const word = bytes.readUInt32LE(at);
|
|
42
|
-
const ordinal = Number(signed(BigInt(word & 0xff), 8));
|
|
31
|
+
if (index < 0 || index >= header.count)
|
|
32
|
+
throw new RangeError("Chained import index is outside the table");
|
|
33
|
+
const at = base + header.offset + index * size;
|
|
34
|
+
if (header.format === 3) {
|
|
35
|
+
const word = bytes.readBigUInt64LE(at);
|
|
36
|
+
const ordinal = Number(signed(bits(word, 0, 16), 16));
|
|
43
37
|
return {
|
|
44
|
-
symbol: cString(bytes, base + header.symbols + (word
|
|
38
|
+
symbol: cString(bytes, base + header.symbols + Number(bits(word, 32, 32)), end),
|
|
45
39
|
library: libraryName(ordinal, dylibs),
|
|
46
|
-
weak: (
|
|
47
|
-
addend:
|
|
40
|
+
weak: bits(word, 16, 1) === 1n,
|
|
41
|
+
addend: bytes.readBigInt64LE(at + 8),
|
|
48
42
|
};
|
|
49
|
-
}
|
|
43
|
+
}
|
|
44
|
+
const word = bytes.readUInt32LE(at);
|
|
45
|
+
const ordinal = Number(signed(BigInt(word & 0xff), 8));
|
|
46
|
+
return {
|
|
47
|
+
symbol: cString(bytes, base + header.symbols + (word >>> 9), end),
|
|
48
|
+
library: libraryName(ordinal, dylibs),
|
|
49
|
+
weak: ((word >>> 8) & 1) === 1,
|
|
50
|
+
addend: header.format === 2 ? BigInt(bytes.readInt32LE(at + 4)) : 0n,
|
|
51
|
+
};
|
|
50
52
|
};
|
|
51
53
|
/** Decode one raw chained pointer for its segment's pointer format. */
|
|
52
54
|
export const decodeChainedPointer = (raw, format, baseAddress, imports) => {
|
|
53
55
|
const bind = (ordinal, addend) => {
|
|
54
|
-
const target = imports
|
|
56
|
+
const target = typeof imports === "function"
|
|
57
|
+
? imports(Number(ordinal))
|
|
58
|
+
: imports[Number(ordinal)];
|
|
55
59
|
if (target === undefined)
|
|
56
60
|
throw new RangeError(`Chained bind ordinal ${ordinal} has no import`);
|
|
57
61
|
return { kind: "bind", ...target, addend: target.addend + addend };
|
|
@@ -86,12 +90,19 @@ const chainedFixups = (image, range) => {
|
|
|
86
90
|
if (range.size < 28 || end > bytes.length)
|
|
87
91
|
throw new RangeError("Chained fixup header exceeds the target");
|
|
88
92
|
const startsOffset = bytes.readUInt32LE(base + 4);
|
|
89
|
-
const
|
|
93
|
+
const importHeader = {
|
|
90
94
|
offset: bytes.readUInt32LE(base + 8),
|
|
91
95
|
symbols: bytes.readUInt32LE(base + 12),
|
|
92
96
|
count: bytes.readUInt32LE(base + 16),
|
|
93
97
|
format: bytes.readUInt32LE(base + 20),
|
|
94
|
-
}
|
|
98
|
+
};
|
|
99
|
+
const importSize = importHeader.format === 3 ? 16 : importHeader.format === 2 ? 8 : 4;
|
|
100
|
+
const importTableEnd = base + importHeader.offset + importHeader.count * importSize;
|
|
101
|
+
if (importHeader.format < 1 || importHeader.format > 3)
|
|
102
|
+
throw new RangeError(`Unsupported chained import format ${importHeader.format}`);
|
|
103
|
+
if (!Number.isSafeInteger(importHeader.count) || importTableEnd > end)
|
|
104
|
+
throw new RangeError("Chained import table exceeds the fixup data");
|
|
105
|
+
const imports = (index) => readImport({ bytes, base, end, dylibs }, importHeader, index);
|
|
95
106
|
if (bytes.readUInt32LE(base + 24) !== 0)
|
|
96
107
|
throw new RangeError("Compressed chained-fixup symbol names are not supported");
|
|
97
108
|
const starts = base + startsOffset;
|
|
@@ -113,10 +124,16 @@ const chainedFixups = (image, range) => {
|
|
|
113
124
|
const formats = [
|
|
114
125
|
...new Set(ranges.map(({ format }) => POINTER_FORMATS[format] ?? `format-${format}`)),
|
|
115
126
|
];
|
|
127
|
+
const issues = ranges.flatMap(({ format, from }) => POINTER_FORMATS[format] === undefined
|
|
128
|
+
? [
|
|
129
|
+
issue("pointer_fixups", "unsupported_pointer_format", `Unsupported chained pointer format ${format}`, `0x${from.toString(16)}`),
|
|
130
|
+
]
|
|
131
|
+
: []);
|
|
116
132
|
return {
|
|
117
133
|
kind: "chained",
|
|
118
134
|
formats,
|
|
119
|
-
failures:
|
|
135
|
+
failures: issues.map(({ message }) => message),
|
|
136
|
+
issues,
|
|
120
137
|
decode(address, raw) {
|
|
121
138
|
const segment = ranges.find(({ from, to }) => address >= from && address < to);
|
|
122
139
|
// Pointers outside fixup segments, such as in __TEXT, are stored plainly.
|
|
@@ -124,6 +141,11 @@ const chainedFixups = (image, range) => {
|
|
|
124
141
|
return { kind: "rebase", target: raw };
|
|
125
142
|
if (raw === 0n)
|
|
126
143
|
return { kind: "rebase", target: 0n };
|
|
144
|
+
if (POINTER_FORMATS[segment.format] === undefined)
|
|
145
|
+
return {
|
|
146
|
+
kind: "unsupported",
|
|
147
|
+
reason: `Unsupported chained pointer format ${segment.format}`,
|
|
148
|
+
};
|
|
127
149
|
return decodeChainedPointer(raw, segment.format, baseAddress, imports);
|
|
128
150
|
},
|
|
129
151
|
};
|
|
@@ -267,6 +289,7 @@ export const parsePointerFixups = (bytes, commands, segments, baseAddress) => {
|
|
|
267
289
|
kind: "none",
|
|
268
290
|
formats: [],
|
|
269
291
|
failures: [],
|
|
292
|
+
issues: [],
|
|
270
293
|
decode: (_address, raw) => ({ kind: "rebase", target: raw }),
|
|
271
294
|
};
|
|
272
295
|
const binds = new Map();
|
|
@@ -282,6 +305,7 @@ export const parsePointerFixups = (bytes, commands, segments, baseAddress) => {
|
|
|
282
305
|
kind: "dyld-info",
|
|
283
306
|
formats: [],
|
|
284
307
|
failures,
|
|
308
|
+
issues: failures.map((message) => issue("pointer_fixups", "bind_stream_decode_failed", message)),
|
|
285
309
|
decode(address, raw) {
|
|
286
310
|
const bound = binds.get(address);
|
|
287
311
|
return bound === undefined
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { readFatSliceDeclarations, validateFatSlice, } from "../domain/apple/machoContainer.js";
|
|
1
2
|
const hex = (value) => `0x${value.toString(16)}`;
|
|
2
3
|
/** Classify a FAT magic word; thin Mach-O returns null. */
|
|
3
4
|
export const fatHeaderFormat = (magic) => {
|
|
@@ -25,9 +26,6 @@ export const selectMachoSlice = (bytes, architecture) => {
|
|
|
25
26
|
const readUInt32 = littleEndian
|
|
26
27
|
? (offset) => bytes.readUInt32LE(offset)
|
|
27
28
|
: (offset) => bytes.readUInt32BE(offset);
|
|
28
|
-
const readUInt64 = littleEndian
|
|
29
|
-
? (offset) => bytes.readBigUInt64LE(offset)
|
|
30
|
-
: (offset) => bytes.readBigUInt64BE(offset);
|
|
31
29
|
const byteOrder = littleEndian ? "little-endian" : "big-endian";
|
|
32
30
|
const malformed = (reason) => new RangeError(`${reason} (FAT header byte order: ${byteOrder})`);
|
|
33
31
|
const invalid = (reason) => new TypeError(`${reason} (FAT header byte order: ${byteOrder})`);
|
|
@@ -38,22 +36,30 @@ export const selectMachoSlice = (bytes, architecture) => {
|
|
|
38
36
|
if (count > 128 || headerEnd > bytes.length)
|
|
39
37
|
throw malformed("Malformed FAT architecture table");
|
|
40
38
|
const cpu = architecture === "arm64" ? 0x0100000c : 0x01000007;
|
|
39
|
+
const declarations = readFatSliceDeclarations(bytes.subarray(8, headerEnd), {
|
|
40
|
+
count,
|
|
41
|
+
wide: fat64,
|
|
42
|
+
littleEndian,
|
|
43
|
+
});
|
|
44
|
+
if (declarations.status !== "parsed")
|
|
45
|
+
throw malformed(declarations.reason);
|
|
41
46
|
let selected;
|
|
42
|
-
for (
|
|
43
|
-
const
|
|
44
|
-
if (
|
|
47
|
+
for (const declaration of declarations.slices) {
|
|
48
|
+
const issue = validateFatSlice(declaration, bytes.length, headerEnd);
|
|
49
|
+
if (issue !== null)
|
|
50
|
+
throw malformed(issue);
|
|
51
|
+
if (declaration.cpuType !== cpu)
|
|
45
52
|
continue;
|
|
46
53
|
if (selected !== undefined)
|
|
47
54
|
throw invalid("Ambiguous FAT architecture slice");
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
:
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
selected = { slice: Number(start), sliceEnd: Number(start + size) };
|
|
55
|
+
selected = {
|
|
56
|
+
slice: declaration.offset,
|
|
57
|
+
sliceEnd: declaration.offset + declaration.size,
|
|
58
|
+
fatDeclaration: {
|
|
59
|
+
...declaration,
|
|
60
|
+
tableEnd: headerEnd,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
57
63
|
}
|
|
58
64
|
if (selected === undefined)
|
|
59
65
|
throw invalid("Requested FAT architecture is absent");
|
|
@@ -63,11 +69,21 @@ export const selectMachoSlice = (bytes, architecture) => {
|
|
|
63
69
|
export const parseMachoLayout = (bytes, architecture) => {
|
|
64
70
|
if (bytes.length < 4)
|
|
65
71
|
throw new RangeError("Truncated Mach-O header");
|
|
66
|
-
const
|
|
72
|
+
const selection = selectMachoSlice(bytes, architecture);
|
|
73
|
+
const { slice, sliceEnd } = selection;
|
|
67
74
|
if (slice === 0 && sliceEnd === bytes.length && bytes.length < 32)
|
|
68
75
|
throw new RangeError("Truncated Mach-O header");
|
|
69
76
|
if (slice + 32 > sliceEnd || bytes.readUInt32LE(slice) !== 0xfeedfacf)
|
|
70
77
|
throw new TypeError("Only little-endian 64-bit Mach-O metadata is supported");
|
|
78
|
+
const fat = selection.fatDeclaration;
|
|
79
|
+
if (fat !== undefined) {
|
|
80
|
+
const issue = validateFatSlice(fat, bytes.length, fat.tableEnd, {
|
|
81
|
+
cpuType: bytes.readUInt32LE(slice + 4),
|
|
82
|
+
cpuSubtype: bytes.readUInt32LE(slice + 8),
|
|
83
|
+
});
|
|
84
|
+
if (issue !== null)
|
|
85
|
+
throw new TypeError(issue);
|
|
86
|
+
}
|
|
71
87
|
const commands = bytes.readUInt32LE(slice + 16);
|
|
72
88
|
const commandEnd = slice + 32 + bytes.readUInt32LE(slice + 20);
|
|
73
89
|
if (commands > 4096 || commandEnd > sliceEnd)
|
|
@@ -166,9 +182,14 @@ const collectFixupCommand = (bytes, { cursor, kind, size }, state) => {
|
|
|
166
182
|
throw new RangeError("Fixup data exceeds the Mach-O slice");
|
|
167
183
|
return { offset, size: length };
|
|
168
184
|
};
|
|
169
|
-
if (kind === LC_DYLD_CHAINED_FIXUPS
|
|
185
|
+
if (kind === LC_DYLD_CHAINED_FIXUPS) {
|
|
186
|
+
if (size < 16)
|
|
187
|
+
throw new RangeError("Truncated chained-fixups command");
|
|
170
188
|
state.chained = range(cursor + 8);
|
|
171
|
-
|
|
189
|
+
}
|
|
190
|
+
else if (kind === LC_DYLD_INFO || kind === LC_DYLD_INFO_ONLY) {
|
|
191
|
+
if (size < 48)
|
|
192
|
+
throw new RangeError("Truncated dyld-info command");
|
|
172
193
|
for (const [at, stream] of [
|
|
173
194
|
[cursor + 16, "bind"],
|
|
174
195
|
[cursor + 24, "weak"],
|
|
@@ -178,11 +199,16 @@ const collectFixupCommand = (bytes, { cursor, kind, size }, state) => {
|
|
|
178
199
|
if (bound.size > 0)
|
|
179
200
|
state.binds.push({ ...bound, stream });
|
|
180
201
|
}
|
|
181
|
-
|
|
202
|
+
}
|
|
203
|
+
else if (DYLIB_COMMANDS.includes(kind)) {
|
|
204
|
+
if (size < 24)
|
|
205
|
+
throw new RangeError("Truncated dylib command");
|
|
182
206
|
const nameOffset = bytes.readUInt32LE(cursor + 8);
|
|
207
|
+
if (nameOffset < 24 || nameOffset >= size)
|
|
208
|
+
throw new RangeError("Dylib install name is outside its load command");
|
|
183
209
|
const end = bytes.indexOf(0, cursor + nameOffset);
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
210
|
+
if (end < 0 || end >= cursor + size)
|
|
211
|
+
throw new RangeError("Unterminated dylib install name");
|
|
212
|
+
state.dylibs.push(bytes.toString("utf8", cursor + nameOffset, end));
|
|
187
213
|
}
|
|
188
214
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { readObjcPropertiesOf } from "./AppleObjcProperties.js";
|
|
2
|
+
import { issue } from "./AppleDispatchDecodeFacts.js";
|
|
2
3
|
const CLASS_SYMBOL = /^_OBJC_(?:META)?CLASS_\$_(.+)$/u;
|
|
3
4
|
/** External class name from a bound `_OBJC_CLASS_$_Name` symbol. */
|
|
4
5
|
export const boundClassName = (read, field) => {
|
|
@@ -41,7 +42,8 @@ export const decodeObjcCategories = (input) => {
|
|
|
41
42
|
properties: readObjcPropertiesOf(read, read.pointer(category + 40n), {
|
|
42
43
|
owner: `category ${name}`,
|
|
43
44
|
admit: input.admit,
|
|
44
|
-
|
|
45
|
+
issues: input.issues,
|
|
46
|
+
location: `0x${read.pointer(category + 40n).toString(16)}`,
|
|
45
47
|
}),
|
|
46
48
|
location: read.location(category),
|
|
47
49
|
decode: className === null
|
|
@@ -51,7 +53,9 @@ export const decodeObjcCategories = (input) => {
|
|
|
51
53
|
});
|
|
52
54
|
}
|
|
53
55
|
catch (cause) {
|
|
54
|
-
|
|
56
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
57
|
+
failures.push(`Category at 0x${field.toString(16)}: ${message}`);
|
|
58
|
+
input.issues.push(issue("objc_properties_categories", "category_decode_failed", message, `0x${field.toString(16)}`));
|
|
55
59
|
}
|
|
56
60
|
}
|
|
57
61
|
}
|
|
@@ -30,6 +30,7 @@ const resolveSuperclass = (read, address, className, failures) => {
|
|
|
30
30
|
export const decodeObjcDispatchFacets = (input) => {
|
|
31
31
|
const { bytes, sections, segments, readers: read, budget, result } = input;
|
|
32
32
|
const failures = [];
|
|
33
|
+
const categoryIssues = [];
|
|
33
34
|
let examined = 0;
|
|
34
35
|
const methods = (list, className, methodType, category) => {
|
|
35
36
|
const selectors = [];
|
|
@@ -203,7 +204,8 @@ export const decodeObjcDispatchFacets = (input) => {
|
|
|
203
204
|
properties: readObjcPropertiesOf(read, read.pointer(ro + 64n), {
|
|
204
205
|
owner: name,
|
|
205
206
|
admit: () => budget.admit(),
|
|
206
|
-
|
|
207
|
+
issues: categoryIssues,
|
|
208
|
+
location: hex(read.pointer(ro + 64n)),
|
|
207
209
|
}),
|
|
208
210
|
protocols: protocolReader.list(read.pointer(ro + 40n)),
|
|
209
211
|
ivar_count: ivarCount,
|
|
@@ -248,10 +250,11 @@ export const decodeObjcDispatchFacets = (input) => {
|
|
|
248
250
|
read,
|
|
249
251
|
result,
|
|
250
252
|
failures,
|
|
253
|
+
issues: categoryIssues,
|
|
251
254
|
admit: () => budget.admit(),
|
|
252
255
|
methods,
|
|
253
256
|
protocols: (list) => protocolReader.list(list),
|
|
254
257
|
localClassName: (address) => localClassName(read, address),
|
|
255
258
|
});
|
|
256
|
-
return { failures, examined, categoriesExamined };
|
|
259
|
+
return { failures, categoryIssues, examined, categoriesExamined };
|
|
257
260
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { issue } from "./AppleDispatchDecodeFacts.js";
|
|
1
2
|
/**
|
|
2
3
|
* Parse an `@property` attribute string such as `T@"NSString",C,N,V_name`.
|
|
3
4
|
* Each comma-separated token is one attribute; `T` is the type encoding.
|
|
@@ -62,7 +63,7 @@ export const readObjcPropertiesOf = (read, list, context) => {
|
|
|
62
63
|
return readObjcPropertyList(read, list, context.admit);
|
|
63
64
|
}
|
|
64
65
|
catch (cause) {
|
|
65
|
-
context.
|
|
66
|
+
context.issues.push(issue("objc_properties_categories", "property_decode_failed", `${context.owner}: ${cause instanceof Error ? cause.message : String(cause)}`, context.location));
|
|
66
67
|
return [];
|
|
67
68
|
}
|
|
68
69
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { issue } from "./AppleDispatchDecodeFacts.js";
|
|
1
2
|
const hex = (value) => `0x${value.toString(16)}`;
|
|
2
3
|
const decoded = { status: "decoded", reason: null };
|
|
3
4
|
/** Create a Swift ABI signed-relative pointer decoder that records relative_pointers. */
|
|
@@ -42,7 +43,9 @@ export const createSwiftRelativeReader = (input) => {
|
|
|
42
43
|
export const decodeSwiftDispatchFacets = (input) => {
|
|
43
44
|
const { sections, segments, readers: read, relative, budget, result } = input;
|
|
44
45
|
const swiftFailures = [];
|
|
46
|
+
const issues = [];
|
|
45
47
|
let swiftExamined = 0;
|
|
48
|
+
let decodedRecords = 0;
|
|
46
49
|
for (const section of sections.filter(({ name }) => name === "__swift5_proto")) {
|
|
47
50
|
if (section.size % 4 !== 0)
|
|
48
51
|
throw new RangeError("Misaligned Swift conformance section");
|
|
@@ -77,6 +80,9 @@ export const decodeSwiftDispatchFacets = (input) => {
|
|
|
77
80
|
if (staticWitness && read.pointer(witness) !== descriptor)
|
|
78
81
|
witnessReason =
|
|
79
82
|
"Witness-table conformance header is unresolved or encoded";
|
|
83
|
+
const conformanceDecode = witnessReason === null
|
|
84
|
+
? { status: "decoded", reason: null }
|
|
85
|
+
: { status: "partial", reason: witnessReason };
|
|
80
86
|
result.swift_conformances.push({
|
|
81
87
|
type_name: typeName,
|
|
82
88
|
protocol_name: protocolName,
|
|
@@ -85,16 +91,14 @@ export const decodeSwiftDispatchFacets = (input) => {
|
|
|
85
91
|
? { address: null, file_offset: null }
|
|
86
92
|
: read.location(witness),
|
|
87
93
|
location: read.location(descriptor),
|
|
88
|
-
decode:
|
|
89
|
-
? decoded
|
|
90
|
-
: {
|
|
91
|
-
status: "partial",
|
|
92
|
-
reason: witnessReason,
|
|
93
|
-
},
|
|
94
|
+
decode: conformanceDecode,
|
|
94
95
|
evidence: read.evidence(descriptor, "Swift protocol conformance descriptor and directly encoded type/protocol names"),
|
|
95
96
|
});
|
|
97
|
+
if (conformanceDecode.status === "decoded")
|
|
98
|
+
decodedRecords++;
|
|
96
99
|
if (witnessReason !== null) {
|
|
97
100
|
swiftFailures.push(`${typeName}: ${witnessReason}`);
|
|
101
|
+
issues.push(issue("swift_conformances_static_witness_slots", "conformance_decode_partial", witnessReason, hex(descriptor)));
|
|
98
102
|
continue;
|
|
99
103
|
}
|
|
100
104
|
const count = read.u32(protocol + 16n);
|
|
@@ -113,6 +117,12 @@ export const decodeSwiftDispatchFacets = (input) => {
|
|
|
113
117
|
segments.some((segment) => segment.executable &&
|
|
114
118
|
implementation >= segment.address &&
|
|
115
119
|
implementation < segment.address + segment.size);
|
|
120
|
+
const slotDecode = executable
|
|
121
|
+
? { status: "decoded", reason: null }
|
|
122
|
+
: {
|
|
123
|
+
status: "partial",
|
|
124
|
+
reason: "Witness slot is non-function, async, nil, external, authenticated or encoded; implementation target is unresolved",
|
|
125
|
+
};
|
|
116
126
|
result.swift_dispatch_slots.push({
|
|
117
127
|
owner: `${typeName}: ${protocolName}`,
|
|
118
128
|
table_kind: "witness_table",
|
|
@@ -122,29 +132,25 @@ export const decodeSwiftDispatchFacets = (input) => {
|
|
|
122
132
|
implementation_address: executable ? hex(implementation) : null,
|
|
123
133
|
thunk_address: null,
|
|
124
134
|
location: read.location(entry),
|
|
125
|
-
decode:
|
|
126
|
-
? decoded
|
|
127
|
-
: {
|
|
128
|
-
status: "partial",
|
|
129
|
-
reason: "Witness slot is non-function, async, nil, external, authenticated or encoded; implementation target is unresolved",
|
|
130
|
-
},
|
|
135
|
+
decode: slotDecode,
|
|
131
136
|
evidence: read.evidence(entry, "Static Swift witness slot, indexed after the conformance-descriptor header"),
|
|
132
137
|
});
|
|
138
|
+
if (slotDecode.status !== "decoded")
|
|
139
|
+
issues.push(issue("swift_conformances_static_witness_slots", "witness_slot_unresolved", slotDecode.reason, hex(entry)));
|
|
133
140
|
}
|
|
134
141
|
}
|
|
135
142
|
catch (cause) {
|
|
136
|
-
|
|
143
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
144
|
+
swiftFailures.push(`${hex(field)}: ${message}`);
|
|
145
|
+
issues.push(issue("swift_conformances_static_witness_slots", "conformance_decode_failed", message, hex(field)));
|
|
137
146
|
}
|
|
138
147
|
}
|
|
139
148
|
}
|
|
140
|
-
|
|
149
|
+
return {
|
|
141
150
|
facet: "swift_conformances_static_witness_slots",
|
|
142
|
-
status: swiftFailures.length > 0 || budget.truncated ? "partial" : "complete",
|
|
143
|
-
reason: [
|
|
144
|
-
...swiftFailures,
|
|
145
|
-
...(budget.truncated ? ["max_records_reached"] : []),
|
|
146
|
-
].join("; ") || null,
|
|
147
151
|
examined: swiftExamined,
|
|
148
|
-
decoded:
|
|
149
|
-
|
|
152
|
+
decoded: decodedRecords,
|
|
153
|
+
exhaustive: !budget.truncated && issues.length === 0,
|
|
154
|
+
issues,
|
|
155
|
+
};
|
|
150
156
|
};
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
import { issue } from "./AppleDispatchDecodeFacts.js";
|
|
1
2
|
/** Decode non-generic, non-resilient Swift class vtable descriptors without instantiating metadata. */
|
|
2
3
|
export const decodeSwiftClassVtables = (input) => {
|
|
3
4
|
const { readers: read, result } = input;
|
|
4
5
|
const failures = [];
|
|
6
|
+
const issues = [];
|
|
5
7
|
let examined = 0;
|
|
8
|
+
let decoded = 0;
|
|
6
9
|
for (const field of input.entries) {
|
|
7
10
|
if (!read.admit()) {
|
|
8
11
|
failures.push("max_records_reached");
|
|
12
|
+
issues.push(issue("swift_class_vtable_descriptors", "record_budget_exhausted", "max_records_reached", `0x${field.toString(16)}`));
|
|
9
13
|
break;
|
|
10
14
|
}
|
|
11
15
|
examined++;
|
|
@@ -32,11 +36,12 @@ export const decodeSwiftClassVtables = (input) => {
|
|
|
32
36
|
throw new RangeError("Swift vtable count or offset exceeds declared metadata bounds");
|
|
33
37
|
const owner = read.string(read.relative(descriptor + 8n));
|
|
34
38
|
for (let index = 0; index < count; index++) {
|
|
39
|
+
const entry = header + 8n + BigInt(index * 8);
|
|
35
40
|
if (!read.admit()) {
|
|
36
41
|
failures.push("max_records_reached");
|
|
42
|
+
issues.push(issue("swift_class_vtable_descriptors", "record_budget_exhausted", "max_records_reached", `0x${entry.toString(16)}`));
|
|
37
43
|
break;
|
|
38
44
|
}
|
|
39
|
-
const entry = header + 8n + BigInt(index * 8);
|
|
40
45
|
const methodFlags = read.u32(entry);
|
|
41
46
|
// Async slots reference async descriptors; coroutine and future kinds need separate decoders.
|
|
42
47
|
const synchronous = (methodFlags & 0x40) === 0 && (methodFlags & 15) <= 3;
|
|
@@ -61,26 +66,27 @@ export const decodeSwiftClassVtables = (input) => {
|
|
|
61
66
|
},
|
|
62
67
|
evidence: read.evidence(entry, "Swift class vtable method descriptor; slot index is a metadata word offset, not a source method ordinal"),
|
|
63
68
|
});
|
|
69
|
+
if (resolved)
|
|
70
|
+
decoded++;
|
|
71
|
+
else
|
|
72
|
+
issues.push(issue("swift_class_vtable_descriptors", "vtable_implementation_unresolved", "Async, coroutine, external or unmapped vtable implementation is unresolved", `0x${entry.toString(16)}`));
|
|
64
73
|
}
|
|
65
|
-
if ((specific & 0x4000) !== 0)
|
|
74
|
+
if ((specific & 0x4000) !== 0) {
|
|
66
75
|
failures.push(`${owner}: inherited override descriptors are unsupported`);
|
|
76
|
+
issues.push(issue("swift_class_vtable_descriptors", "inherited_override_descriptors_unsupported", "Inherited override descriptors are unsupported", `0x${descriptor.toString(16)}`));
|
|
77
|
+
}
|
|
67
78
|
}
|
|
68
79
|
catch (cause) {
|
|
69
|
-
|
|
80
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
81
|
+
failures.push(`0x${field.toString(16)}: ${message}`);
|
|
82
|
+
issues.push(issue("swift_class_vtable_descriptors", "vtable_decode_failed", message, `0x${field.toString(16)}`));
|
|
70
83
|
}
|
|
71
84
|
}
|
|
72
|
-
|
|
73
|
-
result.coverage.push({
|
|
85
|
+
return {
|
|
74
86
|
facet: "swift_class_vtable_descriptors",
|
|
75
87
|
examined,
|
|
76
|
-
decoded
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
: "complete",
|
|
81
|
-
reason: failures.join("; ") ||
|
|
82
|
-
(slots.some((slot) => slot.decode.status !== "decoded")
|
|
83
|
-
? "vtable_implementations_unresolved"
|
|
84
|
-
: null),
|
|
85
|
-
});
|
|
88
|
+
decoded,
|
|
89
|
+
exhaustive: issues.length === 0,
|
|
90
|
+
issues,
|
|
91
|
+
};
|
|
86
92
|
};
|