rea-agents 3.1.0 → 3.2.1
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 +72 -95
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
- package/dist/application/ArtifactInventory/scanReader.js +69 -51
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +41 -13
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +5 -93
- package/dist/application/BinarySessionStatus.js +5 -16
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +42 -58
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityInventory.js +10 -15
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +3 -8
- package/dist/application/ElectronActiveObservationService.js +3 -6
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +76 -44
- package/dist/application/EvidenceBundleCommands.js +11 -11
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +6 -41
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +6 -32
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +5 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +6 -16
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +52 -17
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -96
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +19 -45
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -93
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +36 -58
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +15 -24
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +26 -50
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +9 -14
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
- package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +14 -30
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +0 -17
- package/dist/browser/V8InspectorCaptureProjection.js +7 -8
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +0 -54
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +5 -270
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +42 -112
- package/dist/cliBrowserAdvancedCommands.js +10 -106
- package/dist/cliBrowserCommands.js +15 -127
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +4 -5
- package/dist/cliElectronCommands.js +8 -72
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +9 -91
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -96
- package/dist/cliPolicyCommands.js +2 -17
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +2 -2
- package/dist/config/environment.js +0 -9
- package/dist/config/parseConfig.js +1 -33
- package/dist/config/parsers.js +6 -27
- package/dist/config/passiveObservation.js +7 -77
- package/dist/config/permissions.js +0 -7
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +56 -109
- package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +20 -67
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +8 -73
- package/dist/contracts/electronToolContracts.js +8 -108
- package/dist/contracts/enhancedInputs.js +23 -54
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +2 -2
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +6 -95
- package/dist/contracts/managedWorkflowExamples.js +77 -128
- package/dist/contracts/managedWorkflowToolContracts.js +51 -77
- package/dist/contracts/nativeToolContracts.js +7 -11
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +6 -15
- package/dist/contracts/toolContractExamples.js +11 -11
- package/dist/contracts/toolContractHelpers.js +0 -4
- package/dist/contracts/toolContracts.js +60 -71
- package/dist/contracts/toolEffects.js +5 -13
- package/dist/contracts/toolOutputSchemaGroups.js +37 -91
- package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
- package/dist/contracts/toolSchemaMetadata.js +8 -19
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -54
- package/dist/domain/appleApplication.js +24 -67
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -221
- package/dist/domain/browserCaptureComparison.js +47 -24
- package/dist/domain/browserObservation.js +28 -193
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +20 -19
- package/dist/domain/callPath.js +47 -167
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +36 -8
- package/dist/domain/conformanceTrustGate.js +23 -14
- package/dist/domain/customProtocolCapture.js +1 -1
- package/dist/domain/electronActiveObservation.js +70 -103
- package/dist/domain/electronObservation.js +14 -80
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +10 -17
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +20 -12
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +4 -11
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -156
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +15 -136
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +24 -41
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +42 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
- package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +2 -7
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +1 -5
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureValidation.js +1 -7
- package/dist/domain/processComparison.js +3 -12
- package/dist/domain/processReactiveMatching.js +29 -50
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +33 -18
- package/dist/domain/processScenario.js +56 -90
- package/dist/domain/processTraceComparison.js +0 -8
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +3 -3
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +36 -38
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +1 -5
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +41 -41
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +9 -85
- package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
- package/dist/domain/sourceToBundleSignals.js +4 -15
- package/dist/domain/staticRuntimeCorrelation.js +37 -49
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +33 -73
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +4 -12
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +65 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +16 -85
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +15 -22
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +2 -2
- package/dist/hopper/BridgeLauncher.js +112 -36
- package/dist/hopper/HopperAnalysisProfile.js +1 -1
- package/dist/hopper/HopperCleanup.js +6 -3
- package/dist/hopper/HopperClient.js +4 -7
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -16
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +0 -3
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -9
- package/dist/main/transport.js +0 -5
- package/dist/mcpDoctor.js +25 -45
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/ProcessOwnership.js +3 -2
- package/dist/process/ProcessOwnershipObservation.js +0 -1
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +3 -5
- package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +1 -3
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +0 -2
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +6 -44
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +4 -8
- package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
- package/dist/server/registerApplicationTools/compareVersions.js +5 -10
- package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
- package/dist/server/registerApplicationTools/coverage.js +6 -71
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +5 -9
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +23 -27
- package/dist/server/registerBrowserScenarioTool.js +4 -4
- package/dist/server/registerBrowserTools.js +5 -8
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +2 -16
- package/dist/server/registerElectronTools.js +10 -29
- package/dist/server/registerEnhancedTools.js +10 -11
- package/dist/server/registerEvidenceTools.js +15 -22
- package/dist/server/registerFunctionComparisonTool.js +30 -25
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +20 -116
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
- package/dist/server/registerOfficialTools.js +1 -43
- package/dist/server/registerProcessComparisonTool.js +33 -23
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerSessionRecordTools.js +10 -156
- package/dist/server/registerSessionStatusTool.js +6 -69
- package/dist/server/registerSessionTools.js +10 -51
- package/dist/server/sessionAvailabilityPolicy.js +0 -2
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +0 -8
- package/dist/server/toolResult.js +14 -50
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +11 -7
- package/scripts/electron-active-hook.cjs +23 -55
- package/scripts/hopper-demo-x11.py +13 -32
- package/skills/reverse-engineer-anything/SKILL.md +47 -12
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -129
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -347
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -29
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -50
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { metadataToken, readMetadataBlob, readMetadataString, } from "./ManagedMetadataHeaps.js";
|
|
1
|
+
import { declaringType, signature, } from "./ManagedMemberInspectorCore.js";
|
|
2
|
+
import { metadataToken, metadataRowCursor, metadataCodedToken, readMetadataBlob, readMetadataString, } from "./ManagedMetadataHeaps.js";
|
|
3
3
|
import { methodBody } from "./ManagedMethodBodyReader.js";
|
|
4
|
-
export const parseFields = (bytes, layout, ranges
|
|
4
|
+
export const parseFields = (bytes, layout, ranges) => {
|
|
5
5
|
const fields = [];
|
|
6
6
|
const core = new Map();
|
|
7
7
|
const table = layout.table(4);
|
|
8
8
|
for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
|
|
9
|
-
const cursor =
|
|
9
|
+
const cursor = metadataRowCursor(bytes, layout, 4, row);
|
|
10
10
|
const flags = cursor.readUInt16();
|
|
11
|
-
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
12
|
-
const sig = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize),
|
|
11
|
+
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), layout.strings.size);
|
|
12
|
+
const sig = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), layout.blob.size);
|
|
13
13
|
const declared = declaringType(ranges, "field", row);
|
|
14
14
|
const token = metadataToken(4, row);
|
|
15
15
|
fields.push({
|
|
@@ -25,20 +25,20 @@ export const parseFields = (bytes, layout, ranges, maxBytes) => {
|
|
|
25
25
|
}
|
|
26
26
|
return { fields, core };
|
|
27
27
|
};
|
|
28
|
-
export const parseMemberRefs = (bytes, layout
|
|
28
|
+
export const parseMemberRefs = (bytes, layout) => {
|
|
29
29
|
const refs = [];
|
|
30
30
|
const core = new Map();
|
|
31
31
|
const table = layout.table(10);
|
|
32
32
|
for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
|
|
33
|
-
const cursor =
|
|
33
|
+
const cursor = metadataRowCursor(bytes, layout, 10, row);
|
|
34
34
|
const parentRaw = cursor.readIndex(layout.codedIndexSize("MemberRefParent"));
|
|
35
|
-
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
36
|
-
const sig = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize),
|
|
35
|
+
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), layout.strings.size);
|
|
36
|
+
const sig = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), layout.blob.size);
|
|
37
37
|
const token = metadataToken(10, row);
|
|
38
38
|
refs.push({
|
|
39
39
|
token,
|
|
40
40
|
row_offset: cursor.start,
|
|
41
|
-
parent_token:
|
|
41
|
+
parent_token: metadataCodedToken(parentRaw, 3, [2, 1, 26, 6, 27]),
|
|
42
42
|
name,
|
|
43
43
|
signature: signature(sig),
|
|
44
44
|
});
|
|
@@ -46,17 +46,17 @@ export const parseMemberRefs = (bytes, layout, maxBytes) => {
|
|
|
46
46
|
}
|
|
47
47
|
return { refs, core };
|
|
48
48
|
};
|
|
49
|
-
export const parseMethods = ({ bytes, layout, pe, ranges,
|
|
49
|
+
export const parseMethods = ({ bytes, layout, pe, ranges, }) => {
|
|
50
50
|
const methods = [];
|
|
51
51
|
const core = new Map();
|
|
52
52
|
const table = layout.table(6);
|
|
53
53
|
for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
|
|
54
|
-
const cursor =
|
|
54
|
+
const cursor = metadataRowCursor(bytes, layout, 6, row);
|
|
55
55
|
const rva = cursor.readUInt32();
|
|
56
56
|
const implFlags = cursor.readUInt16();
|
|
57
57
|
const flags = cursor.readUInt16();
|
|
58
|
-
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
59
|
-
const sig = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize),
|
|
58
|
+
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), layout.strings.size);
|
|
59
|
+
const sig = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), layout.blob.size);
|
|
60
60
|
cursor.readIndex(layout.tableIndexSize(8));
|
|
61
61
|
const declared = declaringType(ranges, "method", row);
|
|
62
62
|
const token = metadataToken(6, row);
|
|
@@ -70,7 +70,7 @@ export const parseMethods = ({ bytes, layout, pe, ranges, maxBytes, limits, }) =
|
|
|
70
70
|
impl_flags: implFlags,
|
|
71
71
|
flags,
|
|
72
72
|
signature: signature(sig),
|
|
73
|
-
body: methodBody(bytes, pe, rva
|
|
73
|
+
body: methodBody(bytes, pe, rva),
|
|
74
74
|
});
|
|
75
75
|
core.set(token, { token, name, declaringType: declared?.fullName ?? null });
|
|
76
76
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { metadataRowOffset, } from "./ManagedMetadataLayout.js";
|
|
2
3
|
import { managedFailure } from "./ManagedReaderFailure.js";
|
|
3
4
|
const requireRange = (bytes, offset, length, scope) => {
|
|
4
5
|
if (offset < 0 || length < 0 || offset > bytes.length - length)
|
|
@@ -65,19 +66,19 @@ const compressedLength = (bytes, offset, scope) => {
|
|
|
65
66
|
}
|
|
66
67
|
throw managedFailure("invalid-blob", scope, "Metadata blob uses a reserved compressed-length prefix", offset);
|
|
67
68
|
};
|
|
68
|
-
/** Read one
|
|
69
|
-
export const readMetadataString = (bytes, layout, index,
|
|
69
|
+
/** Read one UTF-8 value from #Strings within its PE/CLI stream extent. */
|
|
70
|
+
export const readMetadataString = (bytes, layout, index, heapExtent) => {
|
|
70
71
|
if (index === 0)
|
|
71
72
|
return "";
|
|
72
73
|
if (index < 0 || index >= layout.strings.size)
|
|
73
74
|
throw managedFailure("invalid-heap-index", "metadata.#Strings", "String heap index is outside #Strings", layout.strings.offset + Math.max(index, 0));
|
|
74
75
|
const start = layout.strings.offset + index;
|
|
75
|
-
const maximum = Math.min(layout.strings.offset + layout.strings.size, start +
|
|
76
|
+
const maximum = Math.min(layout.strings.offset + layout.strings.size, start + heapExtent + 1);
|
|
76
77
|
let end = start;
|
|
77
78
|
while (end < maximum && bytes[end] !== 0)
|
|
78
79
|
end += 1;
|
|
79
80
|
if (end === maximum)
|
|
80
|
-
throw managedFailure("
|
|
81
|
+
throw managedFailure("invalid-string", "metadata.#Strings", "String heap item has no terminator within #Strings", start);
|
|
81
82
|
try {
|
|
82
83
|
return new TextDecoder("utf-8", { fatal: true }).decode(bytes.subarray(start, end));
|
|
83
84
|
}
|
|
@@ -85,16 +86,16 @@ export const readMetadataString = (bytes, layout, index, maxBytes) => {
|
|
|
85
86
|
throw managedFailure("invalid-string", "metadata.#Strings", "String heap item is not valid UTF-8", start);
|
|
86
87
|
}
|
|
87
88
|
};
|
|
88
|
-
/** Read one
|
|
89
|
-
export const readMetadataBlob = (bytes, layout, index,
|
|
89
|
+
/** Read one #Blob item while validating its encoded extent against the heap. */
|
|
90
|
+
export const readMetadataBlob = (bytes, layout, index, heapExtent) => {
|
|
90
91
|
if (index === 0)
|
|
91
92
|
return Buffer.alloc(0);
|
|
92
93
|
if (index < 0 || index >= layout.blob.size)
|
|
93
94
|
throw managedFailure("invalid-heap-index", "metadata.#Blob", "Blob heap index is outside #Blob", layout.blob.offset + Math.max(index, 0));
|
|
94
95
|
const start = layout.blob.offset + index;
|
|
95
96
|
const decoded = compressedLength(bytes, start, "metadata.#Blob");
|
|
96
|
-
if (decoded.length >
|
|
97
|
-
throw managedFailure("
|
|
97
|
+
if (decoded.length > heapExtent)
|
|
98
|
+
throw managedFailure("invalid-blob", "metadata.#Blob", "Blob length exceeds the admitted heap extent", start);
|
|
98
99
|
const content = start + decoded.prefix;
|
|
99
100
|
if (content > layout.blob.offset + layout.blob.size - decoded.length)
|
|
100
101
|
throw managedFailure("invalid-blob", "metadata.#Blob", "Blob heap item leaves #Blob", start);
|
|
@@ -129,3 +130,20 @@ export const sha256Bytes = (bytes) => createHash("sha256").update(bytes).digest(
|
|
|
129
130
|
export const strongNameToken = (publicKey) => Buffer.from(createHash("sha1").update(publicKey).digest().subarray(-8))
|
|
130
131
|
.reverse()
|
|
131
132
|
.toString("hex");
|
|
133
|
+
/** Create a cursor bounded to one admitted metadata table row. */
|
|
134
|
+
export const metadataRowCursor = (bytes, layout, table, row) => {
|
|
135
|
+
const descriptor = layout.table(table);
|
|
136
|
+
const start = metadataRowOffset(layout, table, row);
|
|
137
|
+
if (descriptor === undefined)
|
|
138
|
+
throw managedFailure("invalid-row", `metadata.${String(table)}`, "Metadata table is absent", start);
|
|
139
|
+
return new MetadataRowCursor(bytes, start, start + descriptor.rowSize, `metadata.${descriptor.name}`);
|
|
140
|
+
};
|
|
141
|
+
/** Decode a metadata coded index without signed 32-bit coercion. */
|
|
142
|
+
export const metadataCodedToken = (raw, bits, tables) => {
|
|
143
|
+
if (raw === 0)
|
|
144
|
+
return null;
|
|
145
|
+
const tag = raw & (2 ** bits - 1);
|
|
146
|
+
const row = Math.floor(raw / 2 ** bits);
|
|
147
|
+
const table = tables[tag];
|
|
148
|
+
return table === undefined || row === 0 ? null : metadataToken(table, row);
|
|
149
|
+
};
|
|
@@ -13,53 +13,44 @@ const safeRead = (operation, issues) => {
|
|
|
13
13
|
return undefined;
|
|
14
14
|
}
|
|
15
15
|
};
|
|
16
|
-
const
|
|
16
|
+
const readRows = (descriptor, read) => {
|
|
17
17
|
const total = descriptor?.rowCount ?? 0;
|
|
18
18
|
const items = [];
|
|
19
|
-
|
|
20
|
-
for (let index = offset; index < end; index += 1) {
|
|
19
|
+
for (let index = 0; index < total; index += 1) {
|
|
21
20
|
const item = read(index + 1);
|
|
22
21
|
if (item !== undefined)
|
|
23
22
|
items.push(item);
|
|
24
23
|
}
|
|
25
|
-
return
|
|
26
|
-
items,
|
|
27
|
-
offset,
|
|
28
|
-
limit,
|
|
29
|
-
total,
|
|
30
|
-
returned: items.length,
|
|
31
|
-
dropped: total - items.length,
|
|
32
|
-
complete: offset === 0 && end === total && items.length === total,
|
|
33
|
-
};
|
|
24
|
+
return items;
|
|
34
25
|
};
|
|
35
26
|
const uniqueIssues = (issues) => [
|
|
36
27
|
...new Map(issues.map((issue) => [JSON.stringify(issue), issue])).values(),
|
|
37
28
|
];
|
|
38
|
-
const
|
|
39
|
-
const
|
|
29
|
+
const heapExtent = (layout) => Math.max(layout.strings.size, layout.blob.size);
|
|
30
|
+
const readReferences = (bytes, layout, issues) => readRows(layout.table(35), (row) => safeRead(() => readAssemblyReference(bytes, layout, row, heapExtent(layout)), issues));
|
|
31
|
+
const readResources = ({ bytes, layout, resourceDirectory, issues, }) => readRows(layout.table(40), (row) => safeRead(() => readResource({
|
|
40
32
|
bytes,
|
|
41
33
|
layout,
|
|
42
34
|
row,
|
|
43
|
-
maxBytes: input.maxHeapItemBytes,
|
|
44
35
|
directory: resourceDirectory,
|
|
45
36
|
issues,
|
|
46
37
|
}), issues));
|
|
47
|
-
const
|
|
48
|
-
const collectReferenceNames = (bytes, layout,
|
|
38
|
+
const readAttributes = (bytes, layout, issues) => readRows(layout.table(12), (row) => safeRead(() => readCustomAttribute(bytes, layout, row, heapExtent(layout)), issues));
|
|
39
|
+
const collectReferenceNames = (bytes, layout, issues) => {
|
|
49
40
|
const names = [];
|
|
50
41
|
const referenceTable = layout.table(35);
|
|
51
42
|
for (let row = 1; row <= (referenceTable?.rowCount ?? 0); row += 1) {
|
|
52
|
-
const reference = safeRead(() => readAssemblyReference(bytes, layout, row,
|
|
43
|
+
const reference = safeRead(() => readAssemblyReference(bytes, layout, row, heapExtent(layout)), issues);
|
|
53
44
|
if (reference !== undefined)
|
|
54
45
|
names.push(reference.name);
|
|
55
46
|
}
|
|
56
47
|
return names;
|
|
57
48
|
};
|
|
58
|
-
const collectTargetFrameworks = (bytes, layout,
|
|
49
|
+
const collectTargetFrameworks = (bytes, layout, issues) => {
|
|
59
50
|
const targetFrameworks = [];
|
|
60
51
|
const attributeTable = layout.table(12);
|
|
61
52
|
for (let row = 1; row <= (attributeTable?.rowCount ?? 0); row += 1) {
|
|
62
|
-
const attribute = safeRead(() => readCustomAttribute(bytes, layout, row,
|
|
53
|
+
const attribute = safeRead(() => readCustomAttribute(bytes, layout, row, heapExtent(layout)), issues);
|
|
63
54
|
if (attribute?.parent_token === metadataToken(32, 1) &&
|
|
64
55
|
attribute.type_name ===
|
|
65
56
|
"System.Runtime.Versioning.TargetFrameworkAttribute" &&
|
|
@@ -69,23 +60,23 @@ const collectTargetFrameworks = (bytes, layout, maxBytes, issues) => {
|
|
|
69
60
|
}
|
|
70
61
|
return targetFrameworks;
|
|
71
62
|
};
|
|
72
|
-
/** Inventory
|
|
73
|
-
export const readManagedMetadataInventory = (bytes, layout,
|
|
63
|
+
/** Inventory identity tables without CLR reflection or execution. */
|
|
64
|
+
export const readManagedMetadataInventory = (bytes, layout, resourceDirectory) => {
|
|
74
65
|
const issues = [];
|
|
75
|
-
const module = safeRead(() => readModule(bytes, layout,
|
|
66
|
+
const module = safeRead(() => readModule(bytes, layout, heapExtent(layout)), issues) ??
|
|
67
|
+
null;
|
|
68
|
+
const assembly = safeRead(() => readAssembly(bytes, layout, heapExtent(layout)), issues) ??
|
|
76
69
|
null;
|
|
77
|
-
const
|
|
78
|
-
const
|
|
79
|
-
const resources = readPagedResources({
|
|
70
|
+
const references = readReferences(bytes, layout, issues);
|
|
71
|
+
const resources = readResources({
|
|
80
72
|
bytes,
|
|
81
73
|
layout,
|
|
82
|
-
input,
|
|
83
74
|
resourceDirectory,
|
|
84
75
|
issues,
|
|
85
76
|
});
|
|
86
|
-
const attributes =
|
|
87
|
-
const referenceNames = collectReferenceNames(bytes, layout,
|
|
88
|
-
const targetFrameworks = collectTargetFrameworks(bytes, layout,
|
|
77
|
+
const attributes = readAttributes(bytes, layout, issues);
|
|
78
|
+
const referenceNames = collectReferenceNames(bytes, layout, issues);
|
|
79
|
+
const targetFrameworks = collectTargetFrameworks(bytes, layout, issues);
|
|
89
80
|
return {
|
|
90
81
|
module,
|
|
91
82
|
assembly,
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import { metadataRowOffset, } from "./ManagedMetadataLayout.js";
|
|
2
|
-
import {
|
|
2
|
+
import { metadataRowCursor, metadataCodedToken, metadataToken, readMetadataBlob, readMetadataGuid, readMetadataString, sha256Bytes, strongNameToken, } from "./ManagedMetadataHeaps.js";
|
|
3
3
|
import { managedFailure } from "./ManagedReaderFailure.js";
|
|
4
|
-
const rowCursor = ({ bytes, layout, table, row, }) => {
|
|
5
|
-
const descriptor = layout.table(table);
|
|
6
|
-
const start = metadataRowOffset(layout, table, row);
|
|
7
|
-
if (descriptor === undefined)
|
|
8
|
-
throw managedFailure("invalid-row", `metadata.${String(table)}`, "Metadata table is absent", start);
|
|
9
|
-
return new MetadataRowCursor(bytes, start, start + descriptor.rowSize, `metadata.${descriptor.name}`);
|
|
10
|
-
};
|
|
11
4
|
const publicKeyIdentity = (bytes, kind) => ({
|
|
12
5
|
kind: bytes.length === 0 ? "none" : kind,
|
|
13
6
|
byte_length: bytes.length,
|
|
@@ -20,13 +13,13 @@ const publicKeyIdentity = (bytes, kind) => ({
|
|
|
20
13
|
? bytes.toString("hex")
|
|
21
14
|
: null,
|
|
22
15
|
});
|
|
23
|
-
export const readModule = (bytes, layout,
|
|
16
|
+
export const readModule = (bytes, layout, heapExtent) => {
|
|
24
17
|
const table = layout.table(0);
|
|
25
18
|
if (table === undefined || table.rowCount === 0)
|
|
26
19
|
return null;
|
|
27
|
-
const cursor =
|
|
20
|
+
const cursor = metadataRowCursor(bytes, layout, 0, 1);
|
|
28
21
|
const generation = cursor.readUInt16();
|
|
29
|
-
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
22
|
+
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
|
|
30
23
|
const mvid = readMetadataGuid(bytes, layout, cursor.readIndex(layout.guidIndexSize));
|
|
31
24
|
const encId = readMetadataGuid(bytes, layout, cursor.readIndex(layout.guidIndexSize));
|
|
32
25
|
const encBaseId = readMetadataGuid(bytes, layout, cursor.readIndex(layout.guidIndexSize));
|
|
@@ -40,11 +33,11 @@ export const readModule = (bytes, layout, maxBytes) => {
|
|
|
40
33
|
row_offset: table.offset,
|
|
41
34
|
};
|
|
42
35
|
};
|
|
43
|
-
export const readAssembly = (bytes, layout,
|
|
36
|
+
export const readAssembly = (bytes, layout, heapExtent) => {
|
|
44
37
|
const table = layout.table(32);
|
|
45
38
|
if (table === undefined || table.rowCount === 0)
|
|
46
39
|
return null;
|
|
47
|
-
const cursor =
|
|
40
|
+
const cursor = metadataRowCursor(bytes, layout, 32, 1);
|
|
48
41
|
const hashAlgorithm = cursor.readUInt32();
|
|
49
42
|
const version = [
|
|
50
43
|
cursor.readUInt16(),
|
|
@@ -53,9 +46,9 @@ export const readAssembly = (bytes, layout, maxBytes) => {
|
|
|
53
46
|
cursor.readUInt16(),
|
|
54
47
|
].join(".");
|
|
55
48
|
const flags = cursor.readUInt32();
|
|
56
|
-
const key = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize),
|
|
57
|
-
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
58
|
-
const culture = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
49
|
+
const key = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), heapExtent);
|
|
50
|
+
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
|
|
51
|
+
const culture = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
|
|
59
52
|
return {
|
|
60
53
|
name,
|
|
61
54
|
version,
|
|
@@ -67,8 +60,8 @@ export const readAssembly = (bytes, layout, maxBytes) => {
|
|
|
67
60
|
row_offset: table.offset,
|
|
68
61
|
};
|
|
69
62
|
};
|
|
70
|
-
export const readAssemblyReference = (bytes, layout, row,
|
|
71
|
-
const cursor =
|
|
63
|
+
export const readAssemblyReference = (bytes, layout, row, heapExtent) => {
|
|
64
|
+
const cursor = metadataRowCursor(bytes, layout, 35, row);
|
|
72
65
|
const version = [
|
|
73
66
|
cursor.readUInt16(),
|
|
74
67
|
cursor.readUInt16(),
|
|
@@ -76,10 +69,10 @@ export const readAssemblyReference = (bytes, layout, row, maxBytes) => {
|
|
|
76
69
|
cursor.readUInt16(),
|
|
77
70
|
].join(".");
|
|
78
71
|
const flags = cursor.readUInt32();
|
|
79
|
-
const keyOrToken = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize),
|
|
80
|
-
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
81
|
-
const culture = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
82
|
-
const hashValue = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize),
|
|
72
|
+
const keyOrToken = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), heapExtent);
|
|
73
|
+
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
|
|
74
|
+
const culture = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
|
|
75
|
+
const hashValue = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), heapExtent);
|
|
83
76
|
return {
|
|
84
77
|
name,
|
|
85
78
|
version,
|
|
@@ -92,34 +85,26 @@ export const readAssemblyReference = (bytes, layout, row, maxBytes) => {
|
|
|
92
85
|
row_offset: metadataRowOffset(layout, 35, row),
|
|
93
86
|
};
|
|
94
87
|
};
|
|
95
|
-
const
|
|
96
|
-
if (raw === 0)
|
|
97
|
-
return null;
|
|
98
|
-
const tag = raw & (2 ** bits - 1);
|
|
99
|
-
const row = Math.floor(raw / 2 ** bits);
|
|
100
|
-
const table = tables[tag];
|
|
101
|
-
return table === undefined || row === 0 ? null : metadataToken(table, row);
|
|
102
|
-
};
|
|
103
|
-
const readTypeName = ({ bytes, layout, table, row, maxBytes, }) => {
|
|
88
|
+
const readTypeName = ({ bytes, layout, table, row, heapExtent, }) => {
|
|
104
89
|
const descriptor = layout.table(table);
|
|
105
90
|
if (descriptor === undefined || row < 1 || row > descriptor.rowCount)
|
|
106
91
|
return null;
|
|
107
|
-
const cursor =
|
|
92
|
+
const cursor = metadataRowCursor(bytes, layout, table, row);
|
|
108
93
|
if (table === 1)
|
|
109
94
|
cursor.readIndex(layout.codedIndexSize("ResolutionScope"));
|
|
110
95
|
else
|
|
111
96
|
cursor.readUInt32();
|
|
112
|
-
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
113
|
-
const namespace = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
97
|
+
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
|
|
98
|
+
const namespace = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
|
|
114
99
|
return namespace.length === 0 ? name : `${namespace}.${name}`;
|
|
115
100
|
};
|
|
116
|
-
const declaringTypeForMethod = (bytes, layout, methodRow,
|
|
101
|
+
const declaringTypeForMethod = (bytes, layout, methodRow, heapExtent) => {
|
|
117
102
|
const types = layout.table(2);
|
|
118
103
|
const methods = layout.table(6);
|
|
119
104
|
if (types === undefined || methods === undefined)
|
|
120
105
|
return null;
|
|
121
106
|
for (let row = 1; row <= types.rowCount; row += 1) {
|
|
122
|
-
const cursor =
|
|
107
|
+
const cursor = metadataRowCursor(bytes, layout, 2, row);
|
|
123
108
|
cursor.readUInt32();
|
|
124
109
|
const nameIndex = cursor.readIndex(layout.stringIndexSize);
|
|
125
110
|
const namespaceIndex = cursor.readIndex(layout.stringIndexSize);
|
|
@@ -131,14 +116,14 @@ const declaringTypeForMethod = (bytes, layout, methodRow, maxBytes) => {
|
|
|
131
116
|
: methodListForType(bytes, layout, row + 1);
|
|
132
117
|
if (methodRow < methodStart || methodRow >= methodEnd)
|
|
133
118
|
continue;
|
|
134
|
-
const name = readMetadataString(bytes, layout, nameIndex,
|
|
135
|
-
const namespace = readMetadataString(bytes, layout, namespaceIndex,
|
|
119
|
+
const name = readMetadataString(bytes, layout, nameIndex, heapExtent);
|
|
120
|
+
const namespace = readMetadataString(bytes, layout, namespaceIndex, heapExtent);
|
|
136
121
|
return namespace.length === 0 ? name : `${namespace}.${name}`;
|
|
137
122
|
}
|
|
138
123
|
return null;
|
|
139
124
|
};
|
|
140
125
|
const methodListForType = (bytes, layout, row) => {
|
|
141
|
-
const cursor =
|
|
126
|
+
const cursor = metadataRowCursor(bytes, layout, 2, row);
|
|
142
127
|
cursor.readUInt32();
|
|
143
128
|
cursor.readIndex(layout.stringIndexSize);
|
|
144
129
|
cursor.readIndex(layout.stringIndexSize);
|
|
@@ -146,28 +131,40 @@ const methodListForType = (bytes, layout, row) => {
|
|
|
146
131
|
cursor.readIndex(layout.tableIndexSize(4));
|
|
147
132
|
return cursor.readIndex(layout.tableIndexSize(6));
|
|
148
133
|
};
|
|
149
|
-
const attributeTypeName = (bytes, layout, rawType,
|
|
134
|
+
const attributeTypeName = (bytes, layout, rawType, heapExtent) => {
|
|
150
135
|
const tag = rawType & 7;
|
|
151
136
|
const row = Math.floor(rawType / 8);
|
|
152
137
|
if (row === 0)
|
|
153
138
|
return null;
|
|
154
139
|
if (tag === 2)
|
|
155
|
-
return declaringTypeForMethod(bytes, layout, row,
|
|
140
|
+
return declaringTypeForMethod(bytes, layout, row, heapExtent);
|
|
156
141
|
if (tag !== 3)
|
|
157
142
|
return null;
|
|
158
143
|
const memberRefs = layout.table(10);
|
|
159
144
|
if (memberRefs === undefined || row > memberRefs.rowCount)
|
|
160
145
|
return null;
|
|
161
|
-
const cursor =
|
|
146
|
+
const cursor = metadataRowCursor(bytes, layout, 10, row);
|
|
162
147
|
const parent = cursor.readIndex(layout.codedIndexSize("MemberRefParent"));
|
|
163
148
|
const parentTag = parent & 7;
|
|
164
149
|
const parentRow = Math.floor(parent / 8);
|
|
165
150
|
if (parentTag === 0)
|
|
166
|
-
return readTypeName({
|
|
151
|
+
return readTypeName({
|
|
152
|
+
bytes,
|
|
153
|
+
layout,
|
|
154
|
+
table: 2,
|
|
155
|
+
row: parentRow,
|
|
156
|
+
heapExtent,
|
|
157
|
+
});
|
|
167
158
|
if (parentTag === 1)
|
|
168
|
-
return readTypeName({
|
|
159
|
+
return readTypeName({
|
|
160
|
+
bytes,
|
|
161
|
+
layout,
|
|
162
|
+
table: 1,
|
|
163
|
+
row: parentRow,
|
|
164
|
+
heapExtent,
|
|
165
|
+
});
|
|
169
166
|
if (parentTag === 3)
|
|
170
|
-
return declaringTypeForMethod(bytes, layout, parentRow,
|
|
167
|
+
return declaringTypeForMethod(bytes, layout, parentRow, heapExtent);
|
|
171
168
|
return null;
|
|
172
169
|
};
|
|
173
170
|
const decodeCompressedLength = (blob, offset) => {
|
|
@@ -210,21 +207,26 @@ const decodeFixedString = (blob) => {
|
|
|
210
207
|
return null;
|
|
211
208
|
}
|
|
212
209
|
};
|
|
213
|
-
export const readCustomAttribute = (bytes, layout, row,
|
|
214
|
-
const cursor =
|
|
210
|
+
export const readCustomAttribute = (bytes, layout, row, heapExtent) => {
|
|
211
|
+
const cursor = metadataRowCursor(bytes, layout, 12, row);
|
|
215
212
|
const parentRaw = cursor.readIndex(layout.codedIndexSize("HasCustomAttribute"));
|
|
216
213
|
const typeRaw = cursor.readIndex(layout.codedIndexSize("CustomAttributeType"));
|
|
217
|
-
const value = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize),
|
|
218
|
-
const parent =
|
|
214
|
+
const value = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), heapExtent);
|
|
215
|
+
const parent = metadataCodedToken(parentRaw, 5, [
|
|
219
216
|
6, 4, 1, 2, 8, 9, 10, 0, 14, 23, 20, 17, 26, 27, 32, 35, 38, 39, 40, 42,
|
|
220
217
|
44, 43,
|
|
221
218
|
]);
|
|
222
219
|
if (parent === null)
|
|
223
220
|
throw managedFailure("invalid-row", "metadata.CustomAttribute", "CustomAttribute parent coded index is invalid", cursor.start);
|
|
224
|
-
const typeName = attributeTypeName(bytes, layout, typeRaw,
|
|
221
|
+
const typeName = attributeTypeName(bytes, layout, typeRaw, heapExtent);
|
|
225
222
|
return {
|
|
226
223
|
parent_token: parent,
|
|
227
|
-
constructor_token:
|
|
224
|
+
constructor_token: metadataCodedToken(typeRaw, 3, [
|
|
225
|
+
undefined,
|
|
226
|
+
undefined,
|
|
227
|
+
6,
|
|
228
|
+
10,
|
|
229
|
+
]),
|
|
228
230
|
type_name: typeName,
|
|
229
231
|
value_length: value.length,
|
|
230
232
|
value_sha256: sha256Bytes(value),
|
|
@@ -235,13 +237,13 @@ export const readCustomAttribute = (bytes, layout, row, maxBytes) => {
|
|
|
235
237
|
row_offset: cursor.start,
|
|
236
238
|
};
|
|
237
239
|
};
|
|
238
|
-
export const readResource = ({ bytes, layout, row,
|
|
239
|
-
const cursor =
|
|
240
|
+
export const readResource = ({ bytes, layout, row, directory, issues, }) => {
|
|
241
|
+
const cursor = metadataRowCursor(bytes, layout, 40, row);
|
|
240
242
|
const declaredOffset = cursor.readUInt32();
|
|
241
243
|
const flags = cursor.readUInt32();
|
|
242
|
-
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
244
|
+
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), Math.max(layout.strings.size, layout.blob.size));
|
|
243
245
|
const implementationRaw = cursor.readIndex(layout.codedIndexSize("Implementation"));
|
|
244
|
-
const implementationToken =
|
|
246
|
+
const implementationToken = metadataCodedToken(implementationRaw, 2, [38, 35, 39]);
|
|
245
247
|
let dataLength = null;
|
|
246
248
|
let dataSha256 = null;
|
|
247
249
|
if (implementationRaw === 0) {
|
|
@@ -264,14 +266,6 @@ export const readResource = ({ bytes, layout, row, maxBytes, directory, issues,
|
|
|
264
266
|
detail: "Embedded resource length leaves the CLI resources directory",
|
|
265
267
|
});
|
|
266
268
|
}
|
|
267
|
-
else if (dataLength > maxBytes) {
|
|
268
|
-
issues.push({
|
|
269
|
-
code: "limit-exceeded",
|
|
270
|
-
scope: `metadata.ManifestResource:${metadataToken(40, row)}`,
|
|
271
|
-
offset: start + 4,
|
|
272
|
-
detail: `Embedded resource exceeds max_heap_item_bytes ${String(maxBytes)}; digest omitted`,
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
269
|
else {
|
|
276
270
|
dataSha256 = sha256Bytes(bytes.subarray(start + 4, start + 4 + dataLength));
|
|
277
271
|
}
|
|
@@ -166,7 +166,7 @@ const readTablesHeader = (bytes, streams) => {
|
|
|
166
166
|
throw managedFailure("invalid-tables", "metadata.valid-mask", "Metadata valid mask names unsupported tables outside the admitted ECMA-335 range", tablesStream.offset + 8);
|
|
167
167
|
return { tableBytes, tablesOffset: tablesStream.offset, heaps, valid };
|
|
168
168
|
};
|
|
169
|
-
const readRowCounts = (tableBytes, valid
|
|
169
|
+
const readRowCounts = (tableBytes, valid) => {
|
|
170
170
|
const rowCounts = Array(METADATA_TABLE_NAMES.length).fill(0);
|
|
171
171
|
let tableCursor = 24;
|
|
172
172
|
for (let index = 0; index < METADATA_TABLE_NAMES.length; index += 1) {
|
|
@@ -174,8 +174,6 @@ const readRowCounts = (tableBytes, valid, maxTableRows, tablesOffset) => {
|
|
|
174
174
|
continue;
|
|
175
175
|
requireRange(tableBytes, tableCursor, 4, "metadata.table-row-count");
|
|
176
176
|
const count = tableBytes.readUInt32LE(tableCursor);
|
|
177
|
-
if (count > maxTableRows)
|
|
178
|
-
throw managedFailure("limit-exceeded", `metadata.${METADATA_TABLE_NAMES[index] ?? String(index)}`, `Metadata table row count ${String(count)} exceeds max_table_rows ${String(maxTableRows)}`, tablesOffset + tableCursor);
|
|
179
177
|
rowCounts[index] = count;
|
|
180
178
|
tableCursor += 4;
|
|
181
179
|
}
|
|
@@ -218,13 +216,13 @@ const buildMetadataTables = ({ tableBytes, rowCounts, heaps, valid, tablesOffset
|
|
|
218
216
|
return tables;
|
|
219
217
|
};
|
|
220
218
|
/** Parse ECMA-335 stream and table layout with checked byte extents. */
|
|
221
|
-
export const readManagedMetadataLayout = (artifact, rootOffset, size
|
|
219
|
+
export const readManagedMetadataLayout = (artifact, rootOffset, size) => {
|
|
222
220
|
if (size < 20 || rootOffset < 0 || rootOffset > artifact.length - size)
|
|
223
221
|
throw managedFailure("invalid-metadata-root", "metadata.root", "CLI metadata directory leaves the artifact byte range", rootOffset);
|
|
224
222
|
const bytes = artifact.subarray(rootOffset, rootOffset + size);
|
|
225
223
|
const { streams, version } = readMetadataStreams(bytes, rootOffset);
|
|
226
224
|
const { tableBytes, tablesOffset, heaps, valid } = readTablesHeader(artifact, streams);
|
|
227
|
-
const rowCounts = readRowCounts(tableBytes, valid
|
|
225
|
+
const rowCounts = readRowCounts(tableBytes, valid);
|
|
228
226
|
const tables = buildMetadataTables({
|
|
229
227
|
tableBytes,
|
|
230
228
|
rowCounts,
|
|
@@ -31,28 +31,24 @@ const readMethodBodyHeader = (bytes, offset) => {
|
|
|
31
31
|
localSig: bytes.readUInt32LE(offset + 8),
|
|
32
32
|
};
|
|
33
33
|
};
|
|
34
|
-
export const methodBody = (bytes, pe, rva
|
|
34
|
+
export const methodBody = (bytes, pe, rva) => {
|
|
35
35
|
if (rva === 0)
|
|
36
36
|
return emptyMethodBody(rva, "absent", null);
|
|
37
37
|
try {
|
|
38
38
|
const offset = pe.rvaToOffset(rva, 1, "method.body");
|
|
39
39
|
const header = readMethodBodyHeader(bytes, offset);
|
|
40
|
-
if (header.ilSize > limits.maxMethodBodyBytes)
|
|
41
|
-
return oversizedMethodBody(header, rva, offset, limits);
|
|
42
40
|
const ilOffset = offset + header.size;
|
|
43
41
|
if (ilOffset > bytes.length - header.ilSize)
|
|
44
42
|
throw new RangeError("Method IL bytes leave artifact");
|
|
45
43
|
const il = bytes.subarray(ilOffset, ilOffset + header.ilSize);
|
|
46
|
-
const decoded = decodeInstructions(il
|
|
44
|
+
const decoded = decodeInstructions(il);
|
|
47
45
|
const opcodeCounts = {};
|
|
48
46
|
for (const instruction of decoded.parsed)
|
|
49
47
|
opcodeCounts[instruction.opcode] =
|
|
50
48
|
(opcodeCounts[instruction.opcode] ?? 0) + 1;
|
|
51
49
|
const anchors = decoded.parsed
|
|
52
|
-
.
|
|
53
|
-
.
|
|
54
|
-
.slice(0, limits.instructionAnchorLimit)
|
|
55
|
-
.map(({ instruction }) => ({
|
|
50
|
+
.filter((instruction) => instruction.operandKind !== "none")
|
|
51
|
+
.map((instruction) => ({
|
|
56
52
|
il_offset: instruction.offset,
|
|
57
53
|
opcode: instruction.opcode,
|
|
58
54
|
operand_kind: instruction.operandKind,
|
|
@@ -93,7 +89,7 @@ export const methodBody = (bytes, pe, rva, limits) => {
|
|
|
93
89
|
: [],
|
|
94
90
|
issue: decoded.issue ??
|
|
95
91
|
(decoded.truncated > 0
|
|
96
|
-
?
|
|
92
|
+
? "Instruction decoding stopped before the end of the method body"
|
|
97
93
|
: null),
|
|
98
94
|
};
|
|
99
95
|
}
|
|
@@ -120,24 +116,3 @@ const emptyMethodBody = (rva, status, issue) => ({
|
|
|
120
116
|
exception_regions: [],
|
|
121
117
|
issue,
|
|
122
118
|
});
|
|
123
|
-
const oversizedMethodBody = (header, rva, offset, limits) => ({
|
|
124
|
-
status: "too-large",
|
|
125
|
-
header_format: header.format,
|
|
126
|
-
rva,
|
|
127
|
-
file_offset: offset,
|
|
128
|
-
max_stack: header.maxStack,
|
|
129
|
-
init_locals: (header.flags & 0x10) !== 0,
|
|
130
|
-
local_var_sig_token: header.localSig === 0
|
|
131
|
-
? null
|
|
132
|
-
: `0x${header.localSig.toString(16).padStart(8, "0")}`,
|
|
133
|
-
il_size: header.ilSize,
|
|
134
|
-
il_sha256: null,
|
|
135
|
-
normalized_il_sha256: null,
|
|
136
|
-
instruction_count: 0,
|
|
137
|
-
decoded_instruction_count: 0,
|
|
138
|
-
truncated_instructions: 0,
|
|
139
|
-
opcode_counts: {},
|
|
140
|
-
anchors: [],
|
|
141
|
-
exception_regions: [],
|
|
142
|
-
issue: `Method body exceeds max_method_body_bytes ${String(limits.maxMethodBodyBytes)}`,
|
|
143
|
-
});
|