rea-agents 3.0.0 → 3.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 +83 -108
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisContextQueries.js +21 -9
- 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/policy.js +17 -0
- package/dist/application/ArtifactInventory/reader.js +1 -4
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
- package/dist/application/ArtifactInventory/scanReader.js +76 -58
- package/dist/application/ArtifactInventory/types.js +1 -5
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +54 -28
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +24 -86
- package/dist/application/BinarySessionStatus.js +16 -21
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +39 -57
- 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/CapabilityClientRequirements.js +26 -0
- package/dist/application/CapabilityInventory.js +143 -77
- 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 +50 -0
- package/dist/application/ElectronActiveObservationPort.js +1 -0
- package/dist/application/ElectronActiveObservationService.js +78 -0
- 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 +98 -64
- package/dist/application/EvidenceBundleCommands.js +16 -12
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +14 -42
- 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/JavaScriptReplayPermission.js +1 -1
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +29 -47
- 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 +14 -13
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
- 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 +10 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +8 -17
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +60 -20
- package/dist/application/ProcessNormalization.js +2 -1
- 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 -95
- 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 +21 -47
- 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 -88
- 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/application/WindowsCapabilities.js +5 -4
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +43 -67
- 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 +21 -31
- 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 -95
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +29 -51
- 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 +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
- 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 +7 -9
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +18 -34
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +1 -18
- package/dist/browser/V8InspectorCaptureProjection.js +7 -7
- 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 +12 -60
- 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 +6 -271
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +44 -114
- package/dist/cliBrowserAdvancedCommands.js +12 -102
- package/dist/cliBrowserCommands.js +19 -124
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +5 -5
- package/dist/cliElectronCommands.js +49 -71
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +18 -92
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -92
- package/dist/cliPolicyCommands.js +2 -16
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +77 -0
- package/dist/config/electronAutomation.js +35 -0
- package/dist/config/environment.js +6 -9
- package/dist/config/javascriptReplay.js +41 -0
- package/dist/config/managedRuntime.js +25 -0
- package/dist/config/parseConfig.js +56 -232
- package/dist/config/parsers.js +16 -28
- package/dist/config/passiveObservation.js +87 -0
- package/dist/config/permissions.js +0 -7
- package/dist/config/processCapture.js +47 -0
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +58 -114
- package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +37 -91
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +10 -75
- package/dist/contracts/electronToolContracts.js +27 -98
- package/dist/contracts/enhancedInputs.js +31 -78
- 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 +4 -5
- 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 +10 -104
- package/dist/contracts/managedWorkflowExamples.js +77 -125
- package/dist/contracts/managedWorkflowToolContracts.js +51 -74
- package/dist/contracts/nativeToolContracts.js +9 -14
- 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 +52 -0
- package/dist/contracts/toolContractExamples.js +11 -10
- package/dist/contracts/toolContractHelpers.js +19 -0
- package/dist/contracts/toolContracts.js +60 -143
- package/dist/contracts/toolEffects.js +16 -9
- package/dist/contracts/toolOutputSchemaGroups.js +47 -86
- package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
- package/dist/contracts/toolSchemaMetadata.js +117 -0
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/doctorRuntime.js +1 -1
- 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 -52
- package/dist/domain/appleApplication.js +24 -65
- 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 -219
- package/dist/domain/binaryTargetTypes.js +1 -0
- package/dist/domain/browserCaptureComparison.js +35 -60
- package/dist/domain/browserObservation.js +45 -197
- 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 +53 -54
- package/dist/domain/callPath.js +50 -169
- 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 +39 -11
- package/dist/domain/conformanceTrustGate.js +174 -30
- package/dist/domain/customProtocolCapture.js +4 -4
- package/dist/domain/electronActiveObservation.js +244 -0
- package/dist/domain/electronObservation.js +21 -83
- 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 +14 -18
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +101 -90
- 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 +8 -8
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -151
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +17 -141
- package/dist/domain/inputIssueProjection.js +4 -1
- 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 +70 -77
- 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 +100 -101
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +43 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
- package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
- 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 +17 -14
- 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 +15 -18
- 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/processCaptureReactiveValidation.js +8 -3
- package/dist/domain/processCaptureValidation.js +8 -10
- package/dist/domain/processComparison.js +12 -16
- package/dist/domain/processObservation.js +5 -6
- package/dist/domain/processReactiveMatching.js +32 -46
- 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 +42 -21
- package/dist/domain/processScenario.js +62 -93
- package/dist/domain/processTraceComparison.js +0 -7
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +11 -9
- 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 +66 -40
- 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 +3 -7
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +46 -44
- 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 +11 -87
- package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
- package/dist/domain/sourceToBundleSignals.js +11 -16
- package/dist/domain/staticRuntimeCorrelation.js +44 -54
- 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 +48 -85
- 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 -42
- 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 +5 -13
- package/dist/ghidra/GhidraClientStartup.js +1 -1
- 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 +67 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +18 -77
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +32 -31
- package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraSocketConnection.js +1 -1
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +19 -42
- package/dist/hopper/BridgeLauncher.js +115 -37
- package/dist/hopper/HopperAnalysisProfile.js +3 -5
- package/dist/hopper/HopperCleanup.js +11 -9
- package/dist/hopper/HopperClient.js +5 -8
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -30
- 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 +21 -26
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +1 -9
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -23
- package/dist/main/transport.js +27 -39
- package/dist/main.js +17 -15
- package/dist/mcpDoctor.js +27 -69
- 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/PrivateRuntimeRoot.js +17 -0
- package/dist/process/ProcessOwnership.js +67 -130
- package/dist/process/ProcessOwnershipIdentity.js +13 -0
- package/dist/process/ProcessOwnershipObservation.js +87 -0
- package/dist/process/ProcessOwnershipProcessTree.js +22 -0
- package/dist/process/ProviderDeadline.js +8 -12
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/process/WindowsAuthority.js +32 -0
- 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 +95 -13
- package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
- package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +27 -18
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +33 -30
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +145 -119
- package/dist/server/mcpClientMetadata.js +32 -0
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +10 -21
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
- package/dist/server/registerApplicationTools/compareVersions.js +6 -16
- package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
- package/dist/server/registerApplicationTools/coverage.js +7 -78
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
- package/dist/server/registerApplicationTools/traceFeature.js +6 -15
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +27 -35
- package/dist/server/registerBrowserScenarioTool.js +3 -8
- package/dist/server/registerBrowserTools.js +36 -81
- package/dist/server/registerBundleComparisonTool.js +10 -16
- package/dist/server/registerCloseLifecycleTool.js +5 -27
- package/dist/server/registerElectronTools.js +29 -65
- package/dist/server/registerEnhancedTools.js +118 -127
- package/dist/server/registerEvidenceTools.js +19 -30
- package/dist/server/registerFunctionComparisonTool.js +35 -34
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +36 -148
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
- package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
- package/dist/server/registerOfficialTools.js +8 -51
- package/dist/server/registerProcessComparisonTool.js +43 -38
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerReplayMachineTool.js +4 -10
- package/dist/server/registerSessionRecordTools.js +36 -153
- package/dist/server/registerSessionStatusTool.js +18 -96
- package/dist/server/registerSessionTools.js +34 -91
- package/dist/server/sessionAvailabilityPolicy.js +2 -3
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +1 -13
- package/dist/server/toolRegistrationOptions.js +4 -192
- package/dist/server/toolResult.js +15 -67
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +27 -15
- package/scripts/electron-active-hook-boundaries.cjs +394 -0
- package/scripts/electron-active-hook.cjs +469 -0
- package/scripts/hopper-demo-x11.py +13 -32
- package/scripts/rea.mjs +1 -11
- package/skills/reverse-engineer-anything/SKILL.md +46 -11
- 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 -180
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -128
- 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 -346
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -21
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/DynamicToolAvailability.js +0 -70
- package/dist/server/LazyToolCatalog.js +0 -134
- package/dist/server/hydrateServerTools.js +0 -191
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -55
- 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
- package/dist/server/toolInputValidation.js +0 -77
- package/scripts/package-runner-bootstrap.mjs +0 -72
|
@@ -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
|
-
});
|
|
@@ -1,57 +1,28 @@
|
|
|
1
1
|
import { managedNativeBoundaryInspectionSchema, } from "../domain/managedArtifact.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import {} from "./ManagedMetadataLayout.js";
|
|
3
|
+
import { metadataRowCursor, metadataCodedToken, metadataToken, readMetadataString, } from "./ManagedMetadataHeaps.js";
|
|
4
4
|
import { managedTableRowCounts } from "./ManagedMetadataInventory.js";
|
|
5
|
-
import { managedFailure } from "./ManagedReaderFailure.js";
|
|
6
|
-
const rowCursor = ({ bytes, layout, table, row, }) => {
|
|
7
|
-
const descriptor = layout.table(table);
|
|
8
|
-
const start = metadataRowOffset(layout, table, row);
|
|
9
|
-
if (descriptor === undefined)
|
|
10
|
-
throw managedFailure("invalid-row", `metadata.${String(table)}`, "Metadata table is absent", start);
|
|
11
|
-
return new MetadataRowCursor(bytes, start, start + descriptor.rowSize, `metadata.${descriptor.name}`);
|
|
12
|
-
};
|
|
13
|
-
const codedToken = (raw, tagBits, tables) => {
|
|
14
|
-
const tagMask = (1 << tagBits) - 1;
|
|
15
|
-
const table = tables[raw & tagMask];
|
|
16
|
-
const row = raw >> tagBits;
|
|
17
|
-
if (table === undefined || row === 0)
|
|
18
|
-
return null;
|
|
19
|
-
return metadataToken(table, row);
|
|
20
|
-
};
|
|
21
5
|
const flagsHex = (value) => `0x${value.toString(16).padStart(4, "0")}`;
|
|
22
|
-
const
|
|
23
|
-
const safeOffset = Math.min(offset, items.length);
|
|
24
|
-
const selected = items.slice(safeOffset, safeOffset + limit);
|
|
25
|
-
return {
|
|
26
|
-
items: selected,
|
|
27
|
-
offset,
|
|
28
|
-
limit,
|
|
29
|
-
total: items.length,
|
|
30
|
-
returned: selected.length,
|
|
31
|
-
dropped: Math.max(0, items.length - safeOffset - selected.length),
|
|
32
|
-
complete: safeOffset === 0 && selected.length === items.length,
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
|
-
export const parseModuleRefs = (bytes, layout, maxBytes) => {
|
|
6
|
+
export const parseModuleRefs = (bytes, layout, heapExtent) => {
|
|
36
7
|
const refs = [];
|
|
37
8
|
const table = layout.table(26);
|
|
38
9
|
for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
|
|
39
|
-
const cursor =
|
|
10
|
+
const cursor = metadataRowCursor(bytes, layout, 26, row);
|
|
40
11
|
refs.push({
|
|
41
12
|
token: metadataToken(26, row),
|
|
42
13
|
row_offset: cursor.start,
|
|
43
|
-
name: readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
14
|
+
name: readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent),
|
|
44
15
|
});
|
|
45
16
|
}
|
|
46
17
|
return refs;
|
|
47
18
|
};
|
|
48
|
-
export const parseFields = (bytes, layout,
|
|
19
|
+
export const parseFields = (bytes, layout, heapExtent) => {
|
|
49
20
|
const fields = new Map();
|
|
50
21
|
const table = layout.table(4);
|
|
51
22
|
for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
|
|
52
|
-
const cursor =
|
|
23
|
+
const cursor = metadataRowCursor(bytes, layout, 4, row);
|
|
53
24
|
const flags = cursor.readUInt16();
|
|
54
|
-
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
25
|
+
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
|
|
55
26
|
cursor.readIndex(layout.blobIndexSize);
|
|
56
27
|
const token = metadataToken(4, row);
|
|
57
28
|
fields.set(token, {
|
|
@@ -66,15 +37,15 @@ export const parseFields = (bytes, layout, maxBytes) => {
|
|
|
66
37
|
}
|
|
67
38
|
return fields;
|
|
68
39
|
};
|
|
69
|
-
export const parseMethods = (bytes, layout,
|
|
40
|
+
export const parseMethods = (bytes, layout, heapExtent) => {
|
|
70
41
|
const methods = new Map();
|
|
71
42
|
const table = layout.table(6);
|
|
72
43
|
for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
|
|
73
|
-
const cursor =
|
|
44
|
+
const cursor = metadataRowCursor(bytes, layout, 6, row);
|
|
74
45
|
const rva = cursor.readUInt32();
|
|
75
46
|
const implFlags = cursor.readUInt16();
|
|
76
47
|
const flags = cursor.readUInt16();
|
|
77
|
-
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
48
|
+
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
|
|
78
49
|
cursor.readIndex(layout.blobIndexSize);
|
|
79
50
|
cursor.readIndex(layout.tableIndexSize(8));
|
|
80
51
|
const token = metadataToken(6, row);
|
|
@@ -90,15 +61,15 @@ export const parseMethods = (bytes, layout, maxBytes) => {
|
|
|
90
61
|
}
|
|
91
62
|
return methods;
|
|
92
63
|
};
|
|
93
|
-
export const parseImplMaps = ({ bytes, layout,
|
|
64
|
+
export const parseImplMaps = ({ bytes, layout, heapExtent, modules, members, }) => {
|
|
94
65
|
const moduleNames = new Map(modules.map((module) => [module.token, module]));
|
|
95
66
|
const imports = [];
|
|
96
67
|
const table = layout.table(28);
|
|
97
68
|
for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
|
|
98
|
-
const cursor =
|
|
69
|
+
const cursor = metadataRowCursor(bytes, layout, 28, row);
|
|
99
70
|
const mappingFlags = cursor.readUInt16();
|
|
100
|
-
const memberToken =
|
|
101
|
-
const importName = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize),
|
|
71
|
+
const memberToken = metadataCodedToken(cursor.readIndex(layout.codedIndexSize("MemberForwarded")), 1, [4, 6]);
|
|
72
|
+
const importName = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
|
|
102
73
|
const importScopeRow = cursor.readIndex(layout.tableIndexSize(26));
|
|
103
74
|
const importScopeToken = importScopeRow === 0 ? null : metadataToken(26, importScopeRow);
|
|
104
75
|
const member = memberToken === null ? undefined : members.get(memberToken);
|
|
@@ -267,8 +238,7 @@ export const cliNative = (pe) => {
|
|
|
267
238
|
managed_native_header_size: pe.cli.managedNativeHeader.size,
|
|
268
239
|
};
|
|
269
240
|
};
|
|
270
|
-
export const buildNativeBoundaryInspection = ({ target, bytes,
|
|
271
|
-
schema_version: 1,
|
|
241
|
+
export const buildNativeBoundaryInspection = ({ target, bytes, layout, inventory, moduleRefs, imports, implementations, native, issues, }) => managedNativeBoundaryInspectionSchema.parse({
|
|
272
242
|
artifact: {
|
|
273
243
|
path: target.path,
|
|
274
244
|
sha256: target.sha256,
|
|
@@ -287,9 +257,9 @@ export const buildNativeBoundaryInspection = ({ target, bytes, limits, layout, i
|
|
|
287
257
|
requires_mvid: inventory.module?.mvid ?? null,
|
|
288
258
|
},
|
|
289
259
|
cli_native: native,
|
|
290
|
-
module_refs:
|
|
291
|
-
pinvoke_imports:
|
|
292
|
-
native_implementations:
|
|
260
|
+
module_refs: moduleRefs,
|
|
261
|
+
pinvoke_imports: imports,
|
|
262
|
+
native_implementations: implementations,
|
|
293
263
|
summary: {
|
|
294
264
|
module_ref_count: moduleRefs.length,
|
|
295
265
|
pinvoke_import_count: imports.length,
|
|
@@ -4,17 +4,7 @@ import { readManagedMetadataLayout, } from "./ManagedMetadataLayout.js";
|
|
|
4
4
|
import { readManagedPeLayout, } from "./ManagedPeReader.js";
|
|
5
5
|
import { ManagedReaderFailure } from "./ManagedReaderFailure.js";
|
|
6
6
|
import { buildNativeBoundaryInspection, cliNative, nativeImplementations, parseFields, parseImplMaps, parseMethods, parseModuleRefs, } from "./ManagedNativeBoundaryHelpers.js";
|
|
7
|
-
const emptyPage = () => ({
|
|
8
|
-
items: [],
|
|
9
|
-
offset: 0,
|
|
10
|
-
limit: 0,
|
|
11
|
-
total: 0,
|
|
12
|
-
returned: 0,
|
|
13
|
-
dropped: 0,
|
|
14
|
-
complete: true,
|
|
15
|
-
});
|
|
16
7
|
const emptyInspection = (target, bytes, classification, issues = []) => managedNativeBoundaryInspectionSchema.parse({
|
|
17
|
-
schema_version: 1,
|
|
18
8
|
artifact: {
|
|
19
9
|
path: target.path,
|
|
20
10
|
sha256: target.sha256,
|
|
@@ -43,9 +33,9 @@ const emptyInspection = (target, bytes, classification, issues = []) => managedN
|
|
|
43
33
|
managed_native_header_rva: 0,
|
|
44
34
|
managed_native_header_size: 0,
|
|
45
35
|
},
|
|
46
|
-
module_refs:
|
|
47
|
-
pinvoke_imports:
|
|
48
|
-
native_implementations:
|
|
36
|
+
module_refs: [],
|
|
37
|
+
pinvoke_imports: [],
|
|
38
|
+
native_implementations: [],
|
|
49
39
|
summary: {
|
|
50
40
|
module_ref_count: 0,
|
|
51
41
|
pinvoke_import_count: 0,
|
|
@@ -59,33 +49,18 @@ const emptyInspection = (target, bytes, classification, issues = []) => managedN
|
|
|
59
49
|
"Static inspection does not load or execute target code, so native export resolution is not performed.",
|
|
60
50
|
],
|
|
61
51
|
});
|
|
62
|
-
const readBoundaryInventory = (bytes, pe,
|
|
63
|
-
const cli = pe.cli;
|
|
52
|
+
const readBoundaryInventory = (bytes, pe, cli) => {
|
|
64
53
|
const metadataOffset = pe.rvaToOffset(cli.metadata.rva, cli.metadata.size, "cli.metadata");
|
|
65
|
-
const layout = readManagedMetadataLayout(bytes, metadataOffset, cli.metadata.size
|
|
54
|
+
const layout = readManagedMetadataLayout(bytes, metadataOffset, cli.metadata.size);
|
|
66
55
|
const resourceDirectory = {
|
|
67
56
|
offset: pe.rvaToOffset(cli.resources.rva, cli.resources.size, "cli.resources"),
|
|
68
57
|
size: cli.resources.size,
|
|
69
58
|
};
|
|
70
|
-
const inventory = readManagedMetadataInventory(bytes, layout,
|
|
71
|
-
referenceOffset: 0,
|
|
72
|
-
referenceLimit: 0,
|
|
73
|
-
resourceOffset: 0,
|
|
74
|
-
resourceLimit: 0,
|
|
75
|
-
attributeOffset: 0,
|
|
76
|
-
attributeLimit: 0,
|
|
77
|
-
maxHeapItemBytes: limits.maxHeapItemBytes,
|
|
78
|
-
}, resourceDirectory);
|
|
59
|
+
const inventory = readManagedMetadataInventory(bytes, layout, resourceDirectory);
|
|
79
60
|
return { layout, inventory };
|
|
80
61
|
};
|
|
81
|
-
const metadataLimitIssue = (cli, maxBytes) => ({
|
|
82
|
-
code: "limit-exceeded",
|
|
83
|
-
scope: "cli.metadata",
|
|
84
|
-
offset: cli.headerOffset + 8,
|
|
85
|
-
detail: `CLI metadata size exceeds max_metadata_bytes ${String(maxBytes)}`,
|
|
86
|
-
});
|
|
87
62
|
/** Inspect managed/native boundary declarations from PE metadata without execution. */
|
|
88
|
-
export const inspectManagedNativeBoundariesBytes = (bytes, target
|
|
63
|
+
export const inspectManagedNativeBoundariesBytes = (bytes, target) => {
|
|
89
64
|
let pe;
|
|
90
65
|
try {
|
|
91
66
|
pe = readManagedPeLayout(bytes);
|
|
@@ -97,29 +72,26 @@ export const inspectManagedNativeBoundariesBytes = (bytes, target, limits) => {
|
|
|
97
72
|
}
|
|
98
73
|
if (pe.cli === null)
|
|
99
74
|
return emptyInspection(target, bytes, pe.cliDirectoryPresent ? "malformed" : "not-managed", pe.cliIssue === null ? [] : [pe.cliIssue]);
|
|
100
|
-
if (pe.cli.metadata.size > limits.maxMetadataBytes)
|
|
101
|
-
return emptyInspection(target, bytes, "malformed", [
|
|
102
|
-
metadataLimitIssue(pe.cli, limits.maxMetadataBytes),
|
|
103
|
-
]);
|
|
104
75
|
let layout;
|
|
105
76
|
let inventory;
|
|
106
77
|
try {
|
|
107
|
-
({ layout, inventory } = readBoundaryInventory(bytes, pe,
|
|
78
|
+
({ layout, inventory } = readBoundaryInventory(bytes, pe, pe.cli));
|
|
108
79
|
}
|
|
109
80
|
catch (cause) {
|
|
110
81
|
if (!(cause instanceof ManagedReaderFailure))
|
|
111
82
|
throw cause;
|
|
112
83
|
return emptyInspection(target, bytes, "malformed", [cause.issue]);
|
|
113
84
|
}
|
|
114
|
-
const
|
|
85
|
+
const heapExtent = Math.max(layout.strings.size, layout.blob.size);
|
|
86
|
+
const moduleRefs = parseModuleRefs(bytes, layout, heapExtent);
|
|
115
87
|
const members = new Map([
|
|
116
|
-
...parseFields(bytes, layout,
|
|
117
|
-
...parseMethods(bytes, layout,
|
|
88
|
+
...parseFields(bytes, layout, heapExtent),
|
|
89
|
+
...parseMethods(bytes, layout, heapExtent),
|
|
118
90
|
]);
|
|
119
91
|
const imports = parseImplMaps({
|
|
120
92
|
bytes,
|
|
121
93
|
layout,
|
|
122
|
-
|
|
94
|
+
heapExtent,
|
|
123
95
|
modules: moduleRefs,
|
|
124
96
|
members,
|
|
125
97
|
});
|
|
@@ -130,7 +102,6 @@ export const inspectManagedNativeBoundariesBytes = (bytes, target, limits) => {
|
|
|
130
102
|
return buildNativeBoundaryInspection({
|
|
131
103
|
target,
|
|
132
104
|
bytes,
|
|
133
|
-
limits,
|
|
134
105
|
pe,
|
|
135
106
|
layout,
|
|
136
107
|
inventory,
|
|
@@ -104,8 +104,8 @@ const readCoffHeader = (bytes) => {
|
|
|
104
104
|
const coff = peOffset + 4;
|
|
105
105
|
const machine = bytes.readUInt16LE(coff);
|
|
106
106
|
const sectionCount = bytes.readUInt16LE(coff + 2);
|
|
107
|
-
if (sectionCount === 0
|
|
108
|
-
throw managedFailure("invalid-directory", "pe.sections", "PE section count
|
|
107
|
+
if (sectionCount === 0)
|
|
108
|
+
throw managedFailure("invalid-directory", "pe.sections", "PE section count must be positive", coff + 2);
|
|
109
109
|
const optionalSize = bytes.readUInt16LE(coff + 16);
|
|
110
110
|
const characteristics = bytes.readUInt16LE(coff + 18);
|
|
111
111
|
return { coff, machine, sectionCount, optionalSize, characteristics };
|