rea-agents 6.2.0 → 6.4.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 +24 -23
- package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
- package/bridge/ghidra/ReaGhidraBridge.java +597 -209
- package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
- package/bridge/hopper_bridge.py +2 -0
- package/dist/adb/AdbConfiguration.js +88 -0
- package/dist/adb/AdbDeviceOutput.js +186 -0
- package/dist/adb/AdbProvider.js +1190 -0
- package/dist/adb/AdbShellOutput.js +309 -0
- package/dist/android/AndroidTargetSnapshot.js +104 -22
- package/dist/android/JadxConfiguration.js +44 -24
- package/dist/android/JadxProvider.js +59 -21
- package/dist/android/JadxSession.js +51 -9
- package/dist/apktool/ApktoolConfiguration.js +84 -0
- package/dist/apktool/ApktoolDecodeOutput.js +59 -0
- package/dist/apktool/ApktoolProvider.js +506 -0
- package/dist/application/AnalysisProvider.js +8 -2
- package/dist/application/AppBundleExecutable.js +27 -22
- package/dist/application/BinaryTargetResolver.js +85 -19
- package/dist/application/BrowserScenarioEvidence.js +2 -2
- package/dist/application/CapabilityInventory.js +11 -1
- package/dist/application/ClientConfigurationDocument.js +98 -0
- package/dist/application/ClientConfigurationFiles.js +91 -0
- package/dist/application/ClientRegistrationEnvironment.js +35 -0
- package/dist/application/ClientRegistrationStatus.js +75 -27
- package/dist/application/DirectAnalysis.js +14 -8
- package/dist/application/DirectAnalysisCleanup.js +1 -2
- package/dist/application/DirectAnalysisStatus.js +3 -6
- package/dist/application/Doctor.js +27 -34
- package/dist/application/DoctorDiagnostics.js +1 -1
- package/dist/application/EvidenceBundleCommands.js +6 -12
- package/dist/application/EvidenceBundleFiles.js +1 -1
- package/dist/application/GeminiClientSettings.js +139 -0
- package/dist/application/HermesClientHome.js +115 -0
- package/dist/application/HopperDownload.js +39 -0
- package/dist/application/InvestigationProviders.js +10 -4
- package/dist/application/JsonFiles.js +16 -15
- package/dist/application/JsonInputFile.js +252 -0
- package/dist/application/LinuxHopper.js +6 -13
- package/dist/application/MacHopper.js +172 -149
- package/dist/application/MipsElfAbiFlags.js +140 -0
- package/dist/application/ProviderOperationExecution.js +31 -0
- package/dist/application/ReconstructionObligationCandidates.js +16 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImport.js +76 -29
- package/dist/application/ReferenceSourceImportEntries.js +18 -9
- package/dist/application/ReferenceSourceImportPolicy.js +99 -23
- package/dist/application/ReferenceSourceImportTypes.js +30 -22
- package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
- package/dist/application/RegularFileRead.js +103 -0
- package/dist/application/Setup.js +69 -10
- package/dist/application/SetupClientConfiguration.js +134 -23
- package/dist/application/SetupHost.js +102 -22
- package/dist/application/SetupPlan.js +18 -17
- package/dist/application/SetupSkill.js +81 -13
- package/dist/application/SupportedClients.js +305 -37
- package/dist/application/Uninstall.js +172 -8
- package/dist/application/UpdateMaintenance.js +23 -23
- package/dist/application/Utf8JsonInput.js +71 -0
- package/dist/application/WebScriptExportService.js +130 -57
- package/dist/application/WebSourceLocationService.js +3 -0
- package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
- package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
- package/dist/application/analysisView/AnalysisViewService.js +40 -2
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
- package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
- package/dist/application/binary/AnalysisClientCleanup.js +0 -24
- package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
- package/dist/application/binary/BinarySession.js +18 -1
- package/dist/application/binary/BinarySessionOpen.js +9 -1
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
- package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
- package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
- package/dist/application/evm/EvmInterfaceService.js +3 -0
- package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
- package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
- package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
- package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
- package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
- package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
- package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/jeb/JebAnalysisPort.js +1 -0
- package/dist/application/jeb/JebAnalysisService.js +13 -0
- package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/native/NativeUiActionTrace.js +16 -8
- package/dist/application/native/NativeValueTrace.js +23 -6
- package/dist/application/process/ProcessCli.js +25 -20
- package/dist/artifacts/ArtifactPaths.js +129 -8
- package/dist/artifacts/ArtifactProvider.js +34 -31
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +23 -0
- package/dist/artifacts/ArtifactResourceScope.js +100 -0
- package/dist/artifacts/AsarArtifactReader.js +218 -80
- package/dist/artifacts/AsarHeader.js +24 -0
- package/dist/artifacts/DirectoryArtifactReader.js +168 -65
- package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
- package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/SafeOutputTree.js +245 -70
- package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
- package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
- package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
- package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
- package/dist/artifacts/ZipArtifactReader.js +77 -27
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
- package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
- package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
- package/dist/artifacts/inventory/classify.js +87 -25
- package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
- package/dist/artifacts/inventory/reader.js +13 -5
- package/dist/artifacts/inventory/scanCanonical.js +73 -30
- package/dist/artifacts/inventory/scanReader.js +43 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
- package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
- package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
- package/dist/browser/BrowserScenarioSecrets.js +52 -37
- package/dist/browser/CdpBrowserProvider.js +9 -3
- package/dist/browser/CdpCaptureDocuments.js +40 -6
- package/dist/browser/CdpCaptureDomSvg.js +210 -0
- package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
- package/dist/browser/CdpCaptureEventHandlers.js +26 -9
- package/dist/browser/CdpCaptureEvents.js +4 -9
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpConnection.js +22 -5
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -3
- package/dist/browser/CdpElectronScripts.js +2 -2
- package/dist/browser/CdpPageCapture.js +1 -1
- package/dist/browser/CdpTargetSession.js +30 -34
- package/dist/browser/CdpWebMcpDiscovery.js +48 -23
- package/dist/browser/ElectronFileScope.js +99 -9
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
- package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
- package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
- package/dist/browser/PlaywrightScenarioSession.js +130 -65
- package/dist/browser/PlaywrightScenarioStorage.js +507 -0
- package/dist/browser/PngVisualDiff.js +198 -29
- package/dist/browser/WebSourceMapFetcher.js +35 -9
- package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
- package/dist/browser/assets/PublishWebScripts.js +75 -20
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/browser/assets/WebArtifactReads.js +23 -1
- package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
- package/dist/browser/execution/CdpExecutionCapture.js +3 -3
- package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
- package/dist/browser/history/HarCapture.js +14 -0
- package/dist/browser/history/HarCaptureProcess.js +2 -10
- package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
- package/dist/browser/modules/WebModuleArtifacts.js +1 -0
- package/dist/cli/adbCommands.js +337 -0
- package/dist/cli/analysisViewCommands.js +39 -1
- package/dist/cli/apktoolCommands.js +53 -0
- package/dist/cli/artifactCommands.js +8 -11
- package/dist/cli/binaryDiagnosticsCommands.js +19 -1
- package/dist/cli/browserAdvancedCommands.js +65 -36
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +12 -13
- package/dist/cli/coreNativeCommands.js +1 -14
- package/dist/cli/electronCommands.js +14 -10
- package/dist/cli/evmCommands.js +13 -4
- package/dist/cli/firmwareCommands.js +7 -2
- package/dist/cli/javascriptApplicationAnalysis.js +19 -13
- package/dist/cli/javascriptRecoveryCommands.js +22 -15
- package/dist/cli/jebCommands.js +99 -0
- package/dist/cli/jsonOutput.js +12 -4
- package/dist/cli/referenceSourceImportStatus.js +7 -0
- package/dist/cli/setupCommands.js +15 -3
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +68 -22
- package/dist/cli/webScriptCommands.js +20 -1
- package/dist/cli/webSourceLocationCommands.js +21 -9
- package/dist/cli.js +11 -2
- package/dist/cliBrowserScenarioCommands.js +2 -1
- package/dist/cliCommandNames.js +32 -0
- package/dist/cliJsonInput.js +47 -34
- package/dist/cliObservationOptions.js +7 -0
- package/dist/composition/adb.js +3 -0
- package/dist/composition/apktool.js +3 -0
- package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
- package/dist/composition/binaryDiagnostics.js +4 -0
- package/dist/composition/browserScenario.js +2 -2
- package/dist/composition/directAnalysis.js +14 -7
- package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
- package/dist/composition/jeb.js +6 -0
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraLanguageOverride.js +9 -0
- package/dist/config/mcpInputSchemaProfile.js +27 -0
- package/dist/config/parseConfig.js +28 -1
- package/dist/contracts/adb/adbToolContracts.js +353 -0
- package/dist/contracts/advertisedInputExamples.js +48 -0
- package/dist/contracts/analysisDetail.js +10 -0
- package/dist/contracts/analysisViewToolContracts.js +17 -2
- package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
- package/dist/contracts/artifactComparisonExample.js +5 -5
- package/dist/contracts/artifactToolContracts.js +8 -5
- package/dist/contracts/browserToolContracts.js +1 -1
- package/dist/contracts/compactInputSchema.js +256 -0
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +104 -13
- package/dist/contracts/javascript/electronToolContracts.js +16 -3
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
- package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/jeb/jebToolContracts.js +64 -0
- package/dist/contracts/managed/managedToolContracts.js +3 -2
- package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
- package/dist/contracts/native/nativeToolContracts.js +1 -1
- package/dist/contracts/officialToolContracts.js +5 -5
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +5 -4
- package/dist/contracts/sessionToolSchemas.js +9 -4
- package/dist/contracts/toolContractExamples.js +6 -0
- package/dist/contracts/toolContractTypes.js +3 -0
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +167 -0
- package/dist/contracts/toolOutputSchemaGroups.js +7 -5
- package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
- package/dist/contracts/toolSchemaMetadata.js +82 -7
- package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCleanup.js +29 -0
- package/dist/domain/analysisErrorPresentation.js +18 -4
- package/dist/domain/analysisErrorProjection.js +4 -1
- package/dist/domain/analysisSnapshot.js +5 -2
- package/dist/domain/analysisView/analysisView.js +53 -5
- package/dist/domain/analysisView/binaryLayoutView.js +2 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
- package/dist/domain/analysisView/nativeFunctionView.js +155 -0
- package/dist/domain/android/androidApplication.js +25 -20
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
- package/dist/domain/apple/appleApplication.js +40 -23
- package/dist/domain/apple/appleBundleAnatomy.js +95 -28
- package/dist/domain/apple/dyldPaths.js +9 -1
- package/dist/domain/apple/dylibResolution.js +3 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
- package/dist/domain/artifactComparison.js +39 -11
- package/dist/domain/artifactGraph.js +6 -4
- package/dist/domain/artifactIdentity.js +37 -9
- package/dist/domain/artifactInspection.js +10 -50
- package/dist/domain/artifactIntegrityPolicy.js +10 -0
- package/dist/domain/artifactInventoryEvidence.js +16 -17
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/binaryTarget.js +16 -0
- package/dist/domain/binaryTargetTypes.js +8 -1
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserObservationSchemas.js +8 -4
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +3 -2
- package/dist/domain/callPath.js +8 -10
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalJsonDigestSteps.js +34 -12
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +2 -3
- package/dist/domain/compactStringIdentity.js +9 -0
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +12 -6
- package/dist/domain/evidenceBundle.js +51 -33
- package/dist/domain/evidenceRecordSummary.js +144 -0
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +2 -1
- package/dist/domain/functionComparisonNormalization.js +4 -3
- package/dist/domain/functionComparisonResults.js +2 -2
- package/dist/domain/functionDossierEvidence.js +2 -1
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/inputIssueProjection.js +16 -1
- package/dist/domain/javascript/electronActiveObservation.js +4 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
- package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
- package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
- package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
- package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
- package/dist/domain/javascript/javascriptAstValues.js +54 -0
- package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
- package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
- package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
- package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
- package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
- package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
- package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
- package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
- package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
- package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
- package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
- package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
- package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
- package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
- package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
- package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
- package/dist/domain/javascript/javascriptSemanticState.js +22 -2
- package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
- package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
- package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
- package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
- package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
- package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
- package/dist/domain/jeb/jebAnalysis.js +114 -0
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +69 -31
- package/dist/domain/jsonValue.js +3 -0
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +47 -6
- package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
- package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
- package/dist/domain/managed/managedArtifact.js +1 -0
- package/dist/domain/managed/managedInspectionEvidence.js +13 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/native/nativeAotPe.js +1408 -0
- package/dist/domain/native/nativeCallObservation.js +2 -4
- package/dist/domain/native/nativeInstruction.js +21 -0
- package/dist/domain/native/nativeMetadataRecovery.js +79 -6
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/peResources.js +94 -0
- package/dist/domain/nativeConvention.js +33 -0
- package/dist/domain/process/processCapture.js +102 -11
- package/dist/domain/process/processCaptureCoverage.js +8 -5
- package/dist/domain/process/processCaptureExample.js +67 -0
- package/dist/domain/process/processCaptureValidation.js +83 -3
- package/dist/domain/process/processComparison.js +0 -23
- package/dist/domain/process/processScenario.js +62 -10
- package/dist/domain/process/processTraceEvaluation.js +4 -4
- package/dist/domain/process/processTraceSpecification.js +1 -3
- package/dist/domain/propertyListKeys.js +3 -1
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +3 -2
- package/dist/domain/referenceSourceGraph.js +32 -23
- package/dist/domain/referenceSourceImportParsing.js +40 -48
- package/dist/domain/referenceSourcePathIdentity.js +22 -0
- package/dist/domain/referenceSourceRequireBindings.js +137 -0
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +2 -1
- package/dist/domain/swiftSymbolClassification.js +6 -1
- package/dist/domain/symbolAnalysis.js +17 -2
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +23 -3
- package/dist/domain/webCaptureDiff.js +170 -30
- package/dist/domain/webCaptureDiffSchemas.js +2 -8
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webScriptExportError.js +10 -4
- package/dist/domain/webScriptExportPlan.js +7 -13
- package/dist/domain/zipPackageFormat.js +4 -1
- package/dist/domain/zodCollectionSteps.js +24 -0
- package/dist/dotnet/ManagedArtifactInspector.js +55 -43
- package/dist/dotnet/ManagedDecodeBudget.js +80 -0
- package/dist/dotnet/ManagedMemberInspector.js +13 -6
- package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
- package/dist/dotnet/ManagedMemberRows.js +9 -4
- package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
- package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
- package/dist/dotnet/ManagedMetadataLayout.js +10 -4
- package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
- package/dist/dotnet/ManagedPeReader.js +41 -25
- package/dist/dotnet/ManagedReaderFailure.js +2 -1
- package/dist/dotnet/ManagedStaticProvider.js +65 -31
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/evaluation/AgentEvaluationReport.js +9 -5
- package/dist/evaluation/CodexAgentEval.js +43 -13
- package/dist/evm/EvmoleFailures.js +0 -2
- package/dist/evm/EvmoleInterfaceProvider.js +67 -2
- package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
- package/dist/filesystem/OwnedFileHandle.js +36 -0
- package/dist/filesystem/RegularFile.js +73 -0
- package/dist/filesystem/StableFileHash.js +46 -0
- package/dist/filesystem/readFileHandleChunks.js +26 -0
- package/dist/firmware/FirmwareCommand.js +25 -3
- package/dist/firmware/FirmwareFiles.js +23 -8
- package/dist/firmware/FirmwareProvider.js +156 -32
- package/dist/firmware/FirmwarePublication.js +24 -3
- package/dist/firmware/FirmwareRelease.js +1 -0
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
- package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
- package/dist/ghidra/GhidraClient.js +90 -8
- package/dist/ghidra/GhidraDiagnostics.js +11 -8
- package/dist/ghidra/GhidraFunctionValues.js +26 -2
- package/dist/ghidra/GhidraInstallation.js +111 -10
- package/dist/ghidra/GhidraInventoryValues.js +23 -1
- package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
- package/dist/ghidra/GhidraLauncher.js +123 -58
- package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
- package/dist/ghidra/GhidraMipsProfile.js +79 -0
- package/dist/ghidra/GhidraProvider.js +57 -9
- package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
- package/dist/ghidra/GhidraProviderClient.js +282 -21
- package/dist/ghidra/GhidraSessionValues.js +9 -2
- package/dist/hopper/HopperAnalysisProfile.js +2 -0
- package/dist/hopper/HopperCleanup.js +1 -1
- package/dist/hopper/HopperClient.js +15 -6
- package/dist/hopper/HopperMachOImage.js +2 -0
- package/dist/hopper/HopperProvider.js +13 -2
- package/dist/ida/IdaOperationRunner.js +10 -2
- package/dist/ida/IdaProvider.js +7 -0
- package/dist/ida/IdaSessionClient.js +7 -3
- package/dist/ida/IdaWorkspace.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
- package/dist/inspector/V8InspectorProvider.js +60 -8
- package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
- package/dist/javascript/recovery/RecoveryFiles.js +18 -7
- package/dist/javascript/recovery/WakaruCommand.js +22 -9
- package/dist/javascript/recovery/WakaruExecution.js +11 -7
- package/dist/javascript/recovery/WakaruProvider.js +139 -16
- package/dist/javascript/recovery/WakaruPublication.js +14 -4
- package/dist/javascript/recovery/WakaruRelease.js +10 -3
- package/dist/javascript/recovery/WakaruReport.js +12 -7
- package/dist/javascript/recovery/WakaruVersion.js +24 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
- package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
- package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
- package/dist/jeb/JebMcpConnection.js +179 -0
- package/dist/jeb/JebMcpEndpoint.js +40 -0
- package/dist/jeb/JebProvider.js +299 -0
- package/dist/main/shutdown.js +76 -32
- package/dist/main/transport.js +1 -1
- package/dist/mcpDoctor.js +15 -6
- package/dist/native/AppleDispatchCoverage.js +25 -12
- package/dist/native/AppleDispatchMetadata.js +14 -7
- package/dist/native/AppleMachoFixups.js +71 -15
- package/dist/native/AppleMachoSelection.js +23 -3
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/LldbCallTracer.js +241 -75
- package/dist/native/NativeMacOSProvider.js +100 -20
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/native/NativeMachoInspection.js +11 -7
- package/dist/native/NativeUiHelperRuntime.js +6 -1
- package/dist/native/NativeUiObservation.js +4 -3
- package/dist/native/pe/PeResourceLayout.js +120 -0
- package/dist/native/pe/PeResourceParser.js +286 -0
- package/dist/native/pe/PeResourcesProvider.js +63 -0
- package/dist/process/BoundedFileBytes.js +30 -7
- package/dist/process/DarwinProcessRunTokenReader.js +8 -3
- package/dist/process/OwnedCommand.js +4 -3
- package/dist/process/ProcessOwnership.js +104 -112
- package/dist/process/ProcessOwnershipObservation.js +104 -51
- package/dist/process/ProcessOwnershipProcessTree.js +4 -4
- package/dist/process/ProcessRunTokenObservations.js +48 -0
- package/dist/process/ProviderDiagnosticRedaction.js +17 -0
- package/dist/process/ProviderProcess.js +4 -3
- package/dist/process/capture/FilesystemSnapshot.js +116 -22
- package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
- package/dist/process/capture/ProcessCaptureProgress.js +62 -0
- package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
- package/dist/process/capture/ProcessHarness.js +202 -47
- package/dist/process/capture/ProcessNormalization.js +3 -1
- package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
- package/dist/process/capture/TerminalRenderer.js +24 -7
- package/dist/reference/ReferenceSourceReader.js +22 -5
- package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
- package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
- package/dist/reference/ReferenceSourceReaderFile.js +50 -10
- package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
- package/dist/server/EvidenceMcpServer.js +36 -1
- package/dist/server/admittedToolOperation.js +9 -0
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/contractToolHandler.js +21 -0
- package/dist/server/createServer.js +118 -47
- package/dist/server/registerAdbTools.js +36 -0
- package/dist/server/registerAnalysisViewTool.js +4 -9
- package/dist/server/registerAndroidTools.js +3 -12
- package/dist/server/registerApktoolTools.js +14 -0
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +3 -2
- package/dist/server/registerApplicationTools/coverage.js +3 -2
- package/dist/server/registerApplicationTools/helpers.js +3 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +3 -2
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +5 -2
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
- package/dist/server/registerBrowserScenarioTool.js +10 -7
- package/dist/server/registerBrowserTools.js +12 -9
- package/dist/server/registerBundleComparisonTool.js +16 -2
- package/dist/server/registerCloseLifecycleTool.js +36 -5
- package/dist/server/registerElectronTools.js +28 -10
- package/dist/server/registerEnhancedTools.js +78 -73
- package/dist/server/registerEvidenceTools.js +54 -46
- package/dist/server/registerEvmTools.js +4 -9
- package/dist/server/registerFirmwareTools.js +3 -11
- package/dist/server/registerFunctionComparisonTool.js +5 -2
- package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
- package/dist/server/registerJebTools.js +16 -0
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
- package/dist/server/registerOfficialTools.js +31 -25
- package/dist/server/registerPeResourcesTool.js +9 -0
- package/dist/server/registerProcessComparisonTool.js +5 -2
- package/dist/server/registerRecordedCrashTools.js +4 -9
- package/dist/server/registerSessionRecordTools.js +2 -1
- package/dist/server/registerSessionTools.js +58 -21
- package/dist/server/registerWebModuleTool.js +4 -9
- package/dist/server/registerWebNetworkCaptureTool.js +4 -9
- package/dist/server/registerWebRuntimeTools.js +6 -5
- package/dist/server/registerWebScriptTool.js +6 -3
- package/dist/server/registerWebSourceLocationTool.js +4 -9
- package/dist/server/toolResult.js +21 -2
- package/dist/windows/WindowsPrivateRuntime.js +12 -5
- package/install.sh +7 -4
- package/licenses/nativeaot-parser-MIT.txt +28 -0
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +38 -7
- package/scripts/rea.mjs +16 -1
- package/skills/reverse-engineer-anything/SKILL.md +52 -51
- package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
- package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/server/registerNativeTools.js +0 -6
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { managedFailure } from "./ManagedReaderFailure.js";
|
|
3
|
+
/** Per-inspection capacity for eagerly retained metadata and its JSON projection. */
|
|
4
|
+
const MAX_METADATA_REPRESENTATION_BYTES = 64 * 1024 * 1024;
|
|
5
|
+
/** The layout owns decoding capacity and heap identity for all of its consumers. */
|
|
6
|
+
export class ManagedDecodeBudget {
|
|
7
|
+
#remaining = MAX_METADATA_REPRESENTATION_BYTES;
|
|
8
|
+
#strings = new Map();
|
|
9
|
+
#digests = new WeakMap();
|
|
10
|
+
reserve(bytes, offset) {
|
|
11
|
+
if (!Number.isSafeInteger(bytes) || bytes < 0 || bytes > this.#remaining)
|
|
12
|
+
throw managedFailure("resource-limit", "metadata.representation", `Managed metadata exceeds the ${String(MAX_METADATA_REPRESENTATION_BYTES)} byte representation budget`, offset);
|
|
13
|
+
this.#remaining -= bytes;
|
|
14
|
+
}
|
|
15
|
+
/** UTF-8 cannot decode to more UTF-16 units than bytes; JSON uses at most six bytes per unit. */
|
|
16
|
+
reserveString(encodedBytes, offset) {
|
|
17
|
+
this.reserve(encodedBytes * 6 + 2, offset);
|
|
18
|
+
}
|
|
19
|
+
/** Snapshot buffers are immutable within a layout; cache exact backing-buffer ranges. */
|
|
20
|
+
digest(bytes, algorithm) {
|
|
21
|
+
let ranges = this.#digests.get(bytes.buffer);
|
|
22
|
+
if (ranges === undefined) {
|
|
23
|
+
ranges = new Map();
|
|
24
|
+
this.#digests.set(bytes.buffer, ranges);
|
|
25
|
+
}
|
|
26
|
+
const key = `${algorithm}:${String(bytes.byteOffset)}:${String(bytes.byteLength)}`;
|
|
27
|
+
const cached = ranges.get(key);
|
|
28
|
+
if (cached !== undefined)
|
|
29
|
+
return cached;
|
|
30
|
+
this.reserve(256, null);
|
|
31
|
+
const digest = createHash(algorithm).update(bytes).digest("hex");
|
|
32
|
+
ranges.set(key, digest);
|
|
33
|
+
return digest;
|
|
34
|
+
}
|
|
35
|
+
cachedString(index) {
|
|
36
|
+
return this.#strings.get(index);
|
|
37
|
+
}
|
|
38
|
+
cacheString(index, value, encodedBytes) {
|
|
39
|
+
this.#strings.set(index, { value, encodedBytes });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const budgets = new WeakMap();
|
|
43
|
+
/** Transfer metadata-root admission capacity to its completed immutable layout. */
|
|
44
|
+
export const attachManagedDecodeBudget = (layout, budget) => {
|
|
45
|
+
budgets.set(layout, budget);
|
|
46
|
+
};
|
|
47
|
+
/** Share one owner for the lifetime of the admitted layout, including all inspection facets. */
|
|
48
|
+
export const managedDecodeBudget = (layout) => {
|
|
49
|
+
let budget = budgets.get(layout);
|
|
50
|
+
if (budget === undefined) {
|
|
51
|
+
budget = new ManagedDecodeBudget();
|
|
52
|
+
budgets.set(layout, budget);
|
|
53
|
+
}
|
|
54
|
+
return budget;
|
|
55
|
+
};
|
|
56
|
+
/** Admit repeated values too: shared heap strings still expand at the JSON boundary. */
|
|
57
|
+
export const admitManagedProjection = (value, budget = new ManagedDecodeBudget()) => {
|
|
58
|
+
const visit = (item) => {
|
|
59
|
+
if (typeof item === "string") {
|
|
60
|
+
budget.reserveString(item.length, null);
|
|
61
|
+
}
|
|
62
|
+
else if (Array.isArray(item)) {
|
|
63
|
+
budget.reserve(item.length + 2, null);
|
|
64
|
+
for (const child of item)
|
|
65
|
+
visit(child);
|
|
66
|
+
}
|
|
67
|
+
else if (item !== null && typeof item === "object") {
|
|
68
|
+
budget.reserve(2, null);
|
|
69
|
+
for (const key of Object.keys(item)) {
|
|
70
|
+
budget.reserve(key.length * 6 + 4, null);
|
|
71
|
+
visit(Reflect.get(item, key));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
budget.reserve(32, null);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
visit(value);
|
|
79
|
+
return value;
|
|
80
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { admitManagedProjection, managedDecodeBudget, } from "./ManagedDecodeBudget.js";
|
|
1
2
|
import { managedMemberInspectionSchema, } from "../domain/managed/managedArtifact.js";
|
|
2
3
|
import { readManagedPeLayout, } from "./ManagedPeReader.js";
|
|
3
4
|
import { readManagedResourceDirectory, managedTableRowCounts, readManagedMetadataInventory, } from "./ManagedMetadataInventory.js";
|
|
@@ -5,7 +6,7 @@ import { readManagedMetadataLayout } from "./ManagedMetadataLayout.js";
|
|
|
5
6
|
import { ManagedReaderFailure, uniqueManagedParseIssues, } from "./ManagedReaderFailure.js";
|
|
6
7
|
import { parseTypes, typeRanges } from "./ManagedMemberInspectorCore.js";
|
|
7
8
|
import { edges, parseFields, parseMemberRefs, parseMethods, } from "./ManagedMemberRows.js";
|
|
8
|
-
const unavailable = (target, bytes, issue) => managedMemberInspectionSchema.parse({
|
|
9
|
+
const unavailable = (target, bytes, issue) => managedMemberInspectionSchema.parse(admitManagedProjection({
|
|
9
10
|
artifact: {
|
|
10
11
|
path: target.path,
|
|
11
12
|
sha256: target.sha256,
|
|
@@ -14,7 +15,11 @@ const unavailable = (target, bytes, issue) => managedMemberInspectionSchema.pars
|
|
|
14
15
|
},
|
|
15
16
|
module: null,
|
|
16
17
|
metadata: {
|
|
17
|
-
status: issue === null
|
|
18
|
+
status: issue === null
|
|
19
|
+
? "absent"
|
|
20
|
+
: issue.code === "resource-limit"
|
|
21
|
+
? "partial"
|
|
22
|
+
: "malformed",
|
|
18
23
|
version: null,
|
|
19
24
|
table_row_counts: {},
|
|
20
25
|
},
|
|
@@ -38,7 +43,7 @@ const unavailable = (target, bytes, issue) => managedMemberInspectionSchema.pars
|
|
|
38
43
|
? "The PE has no admitted CLI metadata; managed member inspection is unavailable."
|
|
39
44
|
: "The CLI metadata could not be admitted; managed member inspection is unavailable.",
|
|
40
45
|
],
|
|
41
|
-
});
|
|
46
|
+
}));
|
|
42
47
|
const readMemberInventory = (bytes, pe, issues) => {
|
|
43
48
|
const cli = pe.cli;
|
|
44
49
|
if (cli === null)
|
|
@@ -75,7 +80,7 @@ export const inspectManagedMembersBytes = (bytes, target) => {
|
|
|
75
80
|
methods.methods.some((method) => method.body.status === "partial" ||
|
|
76
81
|
method.body.status === "malformed");
|
|
77
82
|
const related = edges(methods.methods, methods.core, fields.core, memberRefs.core);
|
|
78
|
-
return managedMemberInspectionSchema.parse({
|
|
83
|
+
return managedMemberInspectionSchema.parse(admitManagedProjection({
|
|
79
84
|
artifact: {
|
|
80
85
|
path: target.path,
|
|
81
86
|
sha256: target.sha256,
|
|
@@ -100,7 +105,9 @@ export const inspectManagedMembersBytes = (bytes, target) => {
|
|
|
100
105
|
call_edges: related.callEdges,
|
|
101
106
|
field_accesses: related.fieldAccesses,
|
|
102
107
|
coverage: {
|
|
103
|
-
state: issues.length === 0 && !incompleteMembers
|
|
108
|
+
state: issues.length === 0 && !incompleteMembers
|
|
109
|
+
? "complete"
|
|
110
|
+
: "partial",
|
|
104
111
|
issues: coverageIssues,
|
|
105
112
|
},
|
|
106
113
|
limitations: [
|
|
@@ -108,7 +115,7 @@ export const inspectManagedMembersBytes = (bytes, target) => {
|
|
|
108
115
|
"CIL instruction anchors are decoded from file-backed method bodies only; no target assembly is loaded or executed.",
|
|
109
116
|
"Signatures are decoded for common ECMA-335 primitive, class, valuetype, pointer, byref, array, and generic variable forms; unsupported forms retain raw signature hashes.",
|
|
110
117
|
],
|
|
111
|
-
});
|
|
118
|
+
}, managedDecodeBudget(layout)));
|
|
112
119
|
}
|
|
113
120
|
catch (cause) {
|
|
114
121
|
if (cause instanceof ManagedReaderFailure)
|
|
@@ -233,10 +233,10 @@ const callingConvention = (value) => {
|
|
|
233
233
|
: `unknown:${String(base)}`;
|
|
234
234
|
return flags.length === 0 ? name : `${name} ${flags.join(" ")}`;
|
|
235
235
|
};
|
|
236
|
-
export const signature = (blob) => {
|
|
236
|
+
export const signature = (blob, rawSha256) => {
|
|
237
237
|
const raw = {
|
|
238
238
|
raw_length: blob.length,
|
|
239
|
-
raw_sha256: sha256Bytes(blob),
|
|
239
|
+
raw_sha256: rawSha256 ?? sha256Bytes(blob),
|
|
240
240
|
};
|
|
241
241
|
try {
|
|
242
242
|
if (blob.length === 0)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const opcode = (code) => OPCODES.get(code);
|
|
2
1
|
const PREFIX_OPCODES = new Set([
|
|
3
2
|
"unaligned.",
|
|
4
3
|
"volatile.",
|
|
@@ -361,7 +360,7 @@ export const decodeInstructions = (il) => {
|
|
|
361
360
|
const first = il.readUInt8(offset);
|
|
362
361
|
offset += 1;
|
|
363
362
|
const code = first === 0xfe ? 0xfe00 + il.readUInt8(offset++) : first;
|
|
364
|
-
const descriptor =
|
|
363
|
+
const descriptor = OPCODES.get(code);
|
|
365
364
|
if (descriptor === undefined) {
|
|
366
365
|
issue = `Unsupported CIL opcode 0x${code.toString(16)} at IL offset ${String(start)}`;
|
|
367
366
|
break;
|
|
@@ -394,7 +393,7 @@ export const decodeInstructions = (il) => {
|
|
|
394
393
|
const truncated = offset < il.length && issue === null ? 1 : 0;
|
|
395
394
|
return { parsed, instructionStarts, count: parsed.length, truncated, issue };
|
|
396
395
|
};
|
|
397
|
-
export const parseExceptionRegions = (bytes, offset, methodEnd) => {
|
|
396
|
+
export const parseExceptionRegions = (bytes, offset, methodEnd, budget) => {
|
|
398
397
|
const regions = [];
|
|
399
398
|
let sectionOffset = offset;
|
|
400
399
|
let hasMoreSections = true;
|
|
@@ -424,7 +423,9 @@ export const parseExceptionRegions = (bytes, offset, methodEnd) => {
|
|
|
424
423
|
(bytes[sectionOffset + 2] !== 0 || bytes[sectionOffset + 3] !== 0))
|
|
425
424
|
return malformedExceptionRegions("Small exception section reserved bytes are nonzero", regions);
|
|
426
425
|
const count = (size - 4) / clauseSize;
|
|
427
|
-
|
|
426
|
+
budget?.reserve(count * 256, sectionOffset);
|
|
427
|
+
for (const region of readExceptionClauses(bytes, sectionOffset + 4, count, fat))
|
|
428
|
+
regions.push(region);
|
|
428
429
|
hasMoreSections = (kind & 0x80) !== 0;
|
|
429
430
|
sectionOffset += size;
|
|
430
431
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { managedDecodeBudget } from "./ManagedDecodeBudget.js";
|
|
1
2
|
import { createDeclaringTypeLookup, signature, } from "./ManagedMemberInspectorCore.js";
|
|
2
3
|
import { metadataToken, metadataRowCursor, metadataCodedToken, metadataCodedTokenInvalidReason, readMetadataBlob, readMetadataString, } from "./ManagedMetadataHeaps.js";
|
|
3
4
|
import { readManagedValue } from "./ManagedReaderFailure.js";
|
|
@@ -23,7 +24,7 @@ export const parseFields = (bytes, layout, ranges) => {
|
|
|
23
24
|
declaring_type: declared?.fullName ?? null,
|
|
24
25
|
name,
|
|
25
26
|
flags,
|
|
26
|
-
signature:
|
|
27
|
+
signature: budgetedSignature(sig, layout),
|
|
27
28
|
});
|
|
28
29
|
core.set(token, { token, name });
|
|
29
30
|
}, issues);
|
|
@@ -57,7 +58,7 @@ export const parseMemberRefs = (bytes, layout) => {
|
|
|
57
58
|
row_offset: cursor.start,
|
|
58
59
|
parent_token: metadataCodedToken(parentRaw, 3, [2, 1, 26, 6, 27], layout.rowCounts),
|
|
59
60
|
name,
|
|
60
|
-
signature:
|
|
61
|
+
signature: budgetedSignature(sig, layout),
|
|
61
62
|
});
|
|
62
63
|
core.set(token, { token, name });
|
|
63
64
|
}, issues);
|
|
@@ -90,8 +91,8 @@ export const parseMethods = ({ bytes, layout, pe, ranges, }) => {
|
|
|
90
91
|
rva,
|
|
91
92
|
impl_flags: implFlags,
|
|
92
93
|
flags,
|
|
93
|
-
signature:
|
|
94
|
-
body: methodBody(bytes, pe, rva, { implFlags, flags }),
|
|
94
|
+
signature: budgetedSignature(sig, layout),
|
|
95
|
+
body: methodBody(bytes, pe, rva, { implFlags, flags }, managedDecodeBudget(layout)),
|
|
95
96
|
});
|
|
96
97
|
core.set(token, {
|
|
97
98
|
token,
|
|
@@ -146,3 +147,7 @@ export const edges = (methods, methodCore, fieldCore, refCore) => {
|
|
|
146
147
|
}
|
|
147
148
|
return { callEdges, fieldAccesses };
|
|
148
149
|
};
|
|
150
|
+
const budgetedSignature = (bytes, layout) => {
|
|
151
|
+
managedDecodeBudget(layout).reserve(bytes.length * 256, layout.blob.offset);
|
|
152
|
+
return signature(bytes, managedDecodeBudget(layout).digest(bytes, "sha256"));
|
|
153
|
+
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { managedDecodeBudget } from "./ManagedDecodeBudget.js";
|
|
2
3
|
import { metadataRowOffset, } from "./ManagedMetadataLayout.js";
|
|
3
4
|
import { managedFailure } from "./ManagedReaderFailure.js";
|
|
4
5
|
const requireRange = (bytes, offset, length, scope) => {
|
|
@@ -73,14 +74,25 @@ export const readMetadataString = (bytes, layout, index, heapExtent) => {
|
|
|
73
74
|
if (index < 0 || index >= layout.strings.size)
|
|
74
75
|
throw managedFailure("invalid-heap-index", "metadata.#Strings", "String heap index is outside #Strings", layout.strings.offset + Math.max(index, 0));
|
|
75
76
|
const start = layout.strings.offset + index;
|
|
77
|
+
const cached = managedDecodeBudget(layout).cachedString(index);
|
|
78
|
+
if (cached !== undefined && cached.encodedBytes <= heapExtent) {
|
|
79
|
+
managedDecodeBudget(layout).reserveString(cached.encodedBytes, start);
|
|
80
|
+
return cached.value;
|
|
81
|
+
}
|
|
76
82
|
const maximum = Math.min(layout.strings.offset + layout.strings.size, start + heapExtent + 1);
|
|
77
83
|
let end = start;
|
|
78
84
|
while (end < maximum && bytes[end] !== 0)
|
|
79
85
|
end += 1;
|
|
80
86
|
if (end === maximum)
|
|
81
87
|
throw managedFailure("invalid-string", "metadata.#Strings", "String heap item has no terminator within #Strings", start);
|
|
88
|
+
managedDecodeBudget(layout).reserveString(end - start, start);
|
|
82
89
|
try {
|
|
83
|
-
|
|
90
|
+
const value = new TextDecoder("utf-8", {
|
|
91
|
+
fatal: true,
|
|
92
|
+
ignoreBOM: true,
|
|
93
|
+
}).decode(bytes.subarray(start, end));
|
|
94
|
+
managedDecodeBudget(layout).cacheString(index, value, end - start);
|
|
95
|
+
return value;
|
|
84
96
|
}
|
|
85
97
|
catch (cause) {
|
|
86
98
|
void cause;
|
|
@@ -127,16 +139,14 @@ export const readMetadataGuid = (bytes, layout, index) => {
|
|
|
127
139
|
export const metadataToken = (table, row) => `0x${(table * 0x01_00_00_00 + row).toString(16).padStart(8, "0")}`;
|
|
128
140
|
/** Hash bytes without exposing their contents. */
|
|
129
141
|
export const sha256Bytes = (bytes) => createHash("sha256").update(bytes).digest("hex");
|
|
130
|
-
/** Derive the conventional strong-name token from a full public key. */
|
|
131
|
-
export const strongNameToken = (publicKey) => Buffer.from(createHash("sha1").update(publicKey).digest().subarray(-8))
|
|
132
|
-
.reverse()
|
|
133
|
-
.toString("hex");
|
|
134
142
|
/** Create a cursor bounded to one admitted metadata table row. */
|
|
135
143
|
export const metadataRowCursor = (bytes, layout, table, row) => {
|
|
136
144
|
const descriptor = layout.table(table);
|
|
137
145
|
const start = metadataRowOffset(layout, table, row);
|
|
138
146
|
if (descriptor === undefined)
|
|
139
147
|
throw managedFailure("invalid-row", `metadata.${String(table)}`, "Metadata table is absent", start);
|
|
148
|
+
// Reserve per-row object/index bookkeeping before readers retain decoded facts.
|
|
149
|
+
managedDecodeBudget(layout).reserve(256, start);
|
|
140
150
|
return new MetadataRowCursor(bytes, start, start + descriptor.rowSize, `metadata.${descriptor.name}`);
|
|
141
151
|
};
|
|
142
152
|
/** Decode a metadata coded index without signed 32-bit coercion. */
|
|
@@ -1,14 +1,20 @@
|
|
|
1
|
+
import { managedDecodeBudget } from "./ManagedDecodeBudget.js";
|
|
1
2
|
import { metadataRowOffset, } from "./ManagedMetadataLayout.js";
|
|
2
|
-
import { metadataRowCursor, metadataCodedToken, metadataCodedTokenInvalidReason, metadataToken, readMetadataBlob, readMetadataGuid, readMetadataString,
|
|
3
|
+
import { metadataRowCursor, metadataCodedToken, metadataCodedTokenInvalidReason, metadataToken, readMetadataBlob, readMetadataGuid, readMetadataString, } from "./ManagedMetadataHeaps.js";
|
|
3
4
|
import { managedFailure } from "./ManagedReaderFailure.js";
|
|
4
|
-
const publicKeyIdentity = (bytes, kind) => ({
|
|
5
|
+
const publicKeyIdentity = (bytes, kind, layout) => ({
|
|
5
6
|
kind: bytes.length === 0 ? "none" : kind,
|
|
6
7
|
byte_length: bytes.length,
|
|
7
|
-
sha256: bytes.length === 0
|
|
8
|
+
sha256: bytes.length === 0
|
|
9
|
+
? null
|
|
10
|
+
: managedDecodeBudget(layout).digest(bytes, "sha256"),
|
|
8
11
|
token: bytes.length === 0
|
|
9
12
|
? null
|
|
10
13
|
: kind === "public-key"
|
|
11
|
-
?
|
|
14
|
+
? Buffer.from(managedDecodeBudget(layout).digest(bytes, "sha1"), "hex")
|
|
15
|
+
.subarray(-8)
|
|
16
|
+
.reverse()
|
|
17
|
+
.toString("hex")
|
|
12
18
|
: bytes.length === 8
|
|
13
19
|
? bytes.toString("hex")
|
|
14
20
|
: null,
|
|
@@ -55,7 +61,7 @@ export const readAssembly = (bytes, layout, heapExtent) => {
|
|
|
55
61
|
culture: culture.length === 0 ? null : culture,
|
|
56
62
|
flags,
|
|
57
63
|
hash_algorithm: hashAlgorithm,
|
|
58
|
-
public_key: publicKeyIdentity(key, (flags & 1) === 0 ? "public-key-token" : "public-key"),
|
|
64
|
+
public_key: publicKeyIdentity(key, (flags & 1) === 0 ? "public-key-token" : "public-key", layout),
|
|
59
65
|
token: metadataToken(32, 1),
|
|
60
66
|
row_offset: table.offset,
|
|
61
67
|
};
|
|
@@ -78,8 +84,10 @@ export const readAssemblyReference = (bytes, layout, row, heapExtent) => {
|
|
|
78
84
|
version,
|
|
79
85
|
culture: culture.length === 0 ? null : culture,
|
|
80
86
|
flags,
|
|
81
|
-
public_key_or_token: publicKeyIdentity(keyOrToken, (flags & 1) === 0 ? "public-key-token" : "public-key"),
|
|
82
|
-
hash_value_sha256: hashValue.length === 0
|
|
87
|
+
public_key_or_token: publicKeyIdentity(keyOrToken, (flags & 1) === 0 ? "public-key-token" : "public-key", layout),
|
|
88
|
+
hash_value_sha256: hashValue.length === 0
|
|
89
|
+
? null
|
|
90
|
+
: managedDecodeBudget(layout).digest(hashValue, "sha256"),
|
|
83
91
|
hash_value_length: hashValue.length,
|
|
84
92
|
token: metadataToken(35, row),
|
|
85
93
|
row_offset: metadataRowOffset(layout, 35, row),
|
|
@@ -191,7 +199,7 @@ const decodeCompressedLength = (blob, offset) => {
|
|
|
191
199
|
};
|
|
192
200
|
return undefined;
|
|
193
201
|
};
|
|
194
|
-
const decodeFixedString = (blob) => {
|
|
202
|
+
const decodeFixedString = (blob, layout) => {
|
|
195
203
|
if (blob.length < 3 || blob.readUInt16LE(0) !== 1 || blob[2] === 0xff)
|
|
196
204
|
return null;
|
|
197
205
|
const length = decodeCompressedLength(blob, 2);
|
|
@@ -200,6 +208,7 @@ const decodeFixedString = (blob) => {
|
|
|
200
208
|
const start = 2 + length.prefix;
|
|
201
209
|
if (start > blob.length - length.length)
|
|
202
210
|
return null;
|
|
211
|
+
managedDecodeBudget(layout).reserveString(length.length, layout.blob.offset);
|
|
203
212
|
try {
|
|
204
213
|
return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(blob.subarray(start, start + length.length));
|
|
205
214
|
}
|
|
@@ -236,9 +245,9 @@ export const readCustomAttribute = (bytes, layout, row, heapExtent) => {
|
|
|
236
245
|
constructor_token: metadataCodedToken(typeRaw, 3, [undefined, undefined, 6, 10], layout.rowCounts),
|
|
237
246
|
type_name: typeName,
|
|
238
247
|
value_length: value.length,
|
|
239
|
-
value_sha256:
|
|
248
|
+
value_sha256: managedDecodeBudget(layout).digest(value, "sha256"),
|
|
240
249
|
decoded_fixed_string: typeName === "System.Runtime.Versioning.TargetFrameworkAttribute"
|
|
241
|
-
? decodeFixedString(value)
|
|
250
|
+
? decodeFixedString(value, layout)
|
|
242
251
|
: null,
|
|
243
252
|
token: metadataToken(12, row),
|
|
244
253
|
row_offset: cursor.start,
|
|
@@ -283,7 +292,7 @@ export const readResource = ({ bytes, layout, row, directory, issues, }) => {
|
|
|
283
292
|
});
|
|
284
293
|
}
|
|
285
294
|
else {
|
|
286
|
-
dataSha256 =
|
|
295
|
+
dataSha256 = managedDecodeBudget(layout).digest(bytes.subarray(start + 4, start + 4 + dataLength), "sha256");
|
|
287
296
|
}
|
|
288
297
|
}
|
|
289
298
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { attachManagedDecodeBudget, ManagedDecodeBudget, } from "./ManagedDecodeBudget.js";
|
|
1
2
|
import { managedFailure } from "./ManagedReaderFailure.js";
|
|
2
3
|
import { computeRowSize, } from "./ManagedMetadataRowSizes.js";
|
|
3
4
|
export const METADATA_TABLE_NAMES = [
|
|
@@ -115,15 +116,17 @@ const codedSize = (name, rowCounts) => {
|
|
|
115
116
|
return maximum < 2 ** (16 - descriptor.bits) ? 2 : 4;
|
|
116
117
|
};
|
|
117
118
|
const tableSize = (index, rows) => (rows[index] ?? 0) < 0x1_0000 ? 2 : 4;
|
|
118
|
-
const readMetadataStreams = (bytes, rootOffset) => {
|
|
119
|
+
const readMetadataStreams = (bytes, rootOffset, budget) => {
|
|
119
120
|
if (bytes.readUInt32LE(0) !== 0x424a_5342)
|
|
120
121
|
throw managedFailure("invalid-metadata-root", "metadata.signature", "CLI metadata signature is not BSJB", rootOffset);
|
|
121
122
|
const versionLength = bytes.readUInt32LE(12);
|
|
122
123
|
requireRange(bytes, 16, versionLength, "metadata.version");
|
|
123
124
|
const versionBytes = bytes.subarray(16, 16 + versionLength);
|
|
124
125
|
const zero = versionBytes.indexOf(0);
|
|
126
|
+
const decodedVersionLength = zero < 0 ? versionBytes.length : zero;
|
|
127
|
+
budget.reserveString(decodedVersionLength, rootOffset + 16);
|
|
125
128
|
const version = versionBytes
|
|
126
|
-
.subarray(0,
|
|
129
|
+
.subarray(0, decodedVersionLength)
|
|
127
130
|
.toString("utf8");
|
|
128
131
|
let cursor = align4(16 + versionLength);
|
|
129
132
|
requireRange(bytes, cursor, 4, "metadata.stream-count");
|
|
@@ -220,7 +223,8 @@ export const readManagedMetadataLayout = (artifact, rootOffset, size) => {
|
|
|
220
223
|
if (size < 20 || rootOffset < 0 || rootOffset > artifact.length - size)
|
|
221
224
|
throw managedFailure("invalid-metadata-root", "metadata.root", "CLI metadata directory leaves the artifact byte range", rootOffset);
|
|
222
225
|
const bytes = artifact.subarray(rootOffset, rootOffset + size);
|
|
223
|
-
const
|
|
226
|
+
const budget = new ManagedDecodeBudget();
|
|
227
|
+
const { streams, version } = readMetadataStreams(bytes, rootOffset, budget);
|
|
224
228
|
const { tableBytes, tablesOffset, heaps, valid } = readTablesHeader(artifact, streams);
|
|
225
229
|
const rowCounts = readRowCounts(tableBytes, valid);
|
|
226
230
|
const tables = buildMetadataTables({
|
|
@@ -230,7 +234,7 @@ export const readManagedMetadataLayout = (artifact, rootOffset, size) => {
|
|
|
230
234
|
valid,
|
|
231
235
|
tablesOffset,
|
|
232
236
|
});
|
|
233
|
-
|
|
237
|
+
const layout = {
|
|
234
238
|
rootOffset,
|
|
235
239
|
size,
|
|
236
240
|
version,
|
|
@@ -247,6 +251,8 @@ export const readManagedMetadataLayout = (artifact, rootOffset, size) => {
|
|
|
247
251
|
tableIndexSize: (index) => tableSize(index, rowCounts),
|
|
248
252
|
codedIndexSize: (name) => codedSize(name, rowCounts),
|
|
249
253
|
};
|
|
254
|
+
attachManagedDecodeBudget(layout, budget);
|
|
255
|
+
return layout;
|
|
250
256
|
};
|
|
251
257
|
/** Resolve a one-based metadata row to its exact file offset. */
|
|
252
258
|
export const metadataRowOffset = (layout, table, row) => {
|
|
@@ -40,12 +40,11 @@ const readMethodBodyHeader = (bytes, offset) => {
|
|
|
40
40
|
localSig: bytes.readUInt32LE(offset + 8),
|
|
41
41
|
};
|
|
42
42
|
};
|
|
43
|
-
const readExceptionRegions = (bytes, sectionOffset, methodEnd, ilSize, instructionOffsets) => validateExceptionRegionRanges(parseExceptionRegions(bytes, sectionOffset, methodEnd), ilSize, instructionOffsets);
|
|
44
43
|
/** Decode admitted managed CIL, retaining unavailable implementation metadata as partial. */
|
|
45
44
|
export const methodBody = (bytes, pe, rva, implementation = {
|
|
46
45
|
implFlags: 0,
|
|
47
46
|
flags: 0,
|
|
48
|
-
}) => {
|
|
47
|
+
}, budget) => {
|
|
49
48
|
if (rva === 0)
|
|
50
49
|
return emptyMethodBody(rva, "absent", null);
|
|
51
50
|
if ((implementation.implFlags & 7) !== 0 ||
|
|
@@ -62,6 +61,9 @@ export const methodBody = (bytes, pe, rva, implementation = {
|
|
|
62
61
|
if (ilOffset > bytes.length - header.ilSize)
|
|
63
62
|
throw new RangeError("Method IL bytes leave artifact");
|
|
64
63
|
const il = bytes.subarray(ilOffset, ilOffset + header.ilSize);
|
|
64
|
+
// One byte can produce an instruction record, start index, normalized tuple,
|
|
65
|
+
// and anchor. Reserve conservative bookkeeping capacity before decoding.
|
|
66
|
+
budget?.reserve(il.length * 256, ilOffset);
|
|
65
67
|
const decoded = decodeInstructions(il);
|
|
66
68
|
const opcodeCounts = {};
|
|
67
69
|
for (const instruction of decoded.parsed)
|
|
@@ -83,7 +85,7 @@ export const methodBody = (bytes, pe, rva, implementation = {
|
|
|
83
85
|
const methodEnd = ilOffset + header.ilSize;
|
|
84
86
|
const sectionOffset = (methodEnd + 3) & ~3;
|
|
85
87
|
const exceptionRegions = header.format === "fat" && (header.flags & 8) !== 0
|
|
86
|
-
?
|
|
88
|
+
? validateExceptionRegionRanges(parseExceptionRegions(bytes, sectionOffset, offset + methodExtent, budget), header.ilSize, decoded.instructionStarts)
|
|
87
89
|
: null;
|
|
88
90
|
const status = bodyStatus(decoded.issue, decoded.truncated, exceptionRegions);
|
|
89
91
|
return {
|
|
@@ -115,6 +117,9 @@ export const methodBody = (bytes, pe, rva, implementation = {
|
|
|
115
117
|
};
|
|
116
118
|
}
|
|
117
119
|
catch (cause) {
|
|
120
|
+
if (cause instanceof ManagedReaderFailure &&
|
|
121
|
+
cause.issue.code === "resource-limit")
|
|
122
|
+
throw cause;
|
|
118
123
|
if (!(cause instanceof ManagedReaderFailure) &&
|
|
119
124
|
!(cause instanceof RangeError))
|
|
120
125
|
throw cause;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { admitManagedProjection, managedDecodeBudget, } from "./ManagedDecodeBudget.js";
|
|
1
2
|
import { managedNativeBoundaryInspectionSchema, } from "../domain/managed/managedArtifact.js";
|
|
2
3
|
import {} from "./ManagedMetadataLayout.js";
|
|
3
4
|
import { metadataRowCursor, metadataCodedToken, metadataCodedTokenInvalidReason, metadataToken, readMetadataString, } from "./ManagedMetadataHeaps.js";
|
|
@@ -275,7 +276,7 @@ export const nativeBoundarySummary = (native, counts) => ({
|
|
|
275
276
|
native.managed_native_header_size !== 0 ||
|
|
276
277
|
native.native_entry_point,
|
|
277
278
|
});
|
|
278
|
-
export const buildNativeBoundaryInspection = ({ target, bytes, layout, inventory, moduleRefs, imports, implementations, native, issues, }) => managedNativeBoundaryInspectionSchema.parse({
|
|
279
|
+
export const buildNativeBoundaryInspection = ({ target, bytes, layout, inventory, moduleRefs, imports, implementations, native, issues, }) => managedNativeBoundaryInspectionSchema.parse(admitManagedProjection({
|
|
279
280
|
artifact: {
|
|
280
281
|
path: target.path,
|
|
281
282
|
sha256: target.sha256,
|
|
@@ -311,4 +312,4 @@ export const buildNativeBoundaryInspection = ({ target, bytes, layout, inventory
|
|
|
311
312
|
"Managed metadata tokens are build-local coordinates and are only meaningful with the reported artifact SHA-256 and MVID.",
|
|
312
313
|
"ReadyToRun, NativeAOT, C++/CLI, and IL2CPP native semantics require separately selected native-provider evidence; this tool does not translate managed tokens into native addresses.",
|
|
313
314
|
],
|
|
314
|
-
});
|
|
315
|
+
}, managedDecodeBudget(layout)));
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { admitManagedProjection } from "./ManagedDecodeBudget.js";
|
|
1
2
|
import { managedNativeBoundaryInspectionSchema, } from "../domain/managed/managedArtifact.js";
|
|
2
3
|
import { readManagedMetadataInventory, readManagedResourceDirectory, } from "./ManagedMetadataInventory.js";
|
|
3
4
|
import { readManagedMetadataLayout, } from "./ManagedMetadataLayout.js";
|
|
@@ -10,7 +11,7 @@ import { buildNativeBoundaryInspection, cliNative, nativeBoundarySummary, native
|
|
|
10
11
|
* the header is absent (`not-managed`) or unreadable (`malformed`).
|
|
11
12
|
*/
|
|
12
13
|
const emptyInspection = (target, bytes, classification, { native = null, issues = [], } = {}) => {
|
|
13
|
-
return managedNativeBoundaryInspectionSchema.parse({
|
|
14
|
+
return managedNativeBoundaryInspectionSchema.parse(admitManagedProjection({
|
|
14
15
|
artifact: {
|
|
15
16
|
path: target.path,
|
|
16
17
|
sha256: target.sha256,
|
|
@@ -19,7 +20,11 @@ const emptyInspection = (target, bytes, classification, { native = null, issues
|
|
|
19
20
|
},
|
|
20
21
|
module: null,
|
|
21
22
|
metadata: {
|
|
22
|
-
status:
|
|
23
|
+
status: issues.some((issue) => issue.code === "resource-limit")
|
|
24
|
+
? "partial"
|
|
25
|
+
: classification === "malformed"
|
|
26
|
+
? "malformed"
|
|
27
|
+
: "absent",
|
|
23
28
|
version: null,
|
|
24
29
|
table_row_counts: {},
|
|
25
30
|
},
|
|
@@ -42,7 +47,7 @@ const emptyInspection = (target, bytes, classification, { native = null, issues
|
|
|
42
47
|
"No CLI metadata was admitted; native boundary declarations are unavailable.",
|
|
43
48
|
"Static inspection does not load or execute target code, so native export resolution is not performed.",
|
|
44
49
|
],
|
|
45
|
-
});
|
|
50
|
+
}));
|
|
46
51
|
};
|
|
47
52
|
const readBoundaryInventory = (bytes, pe, cli, issues) => {
|
|
48
53
|
const metadataOffset = pe.rvaToOffset(cli.metadata.rva, cli.metadata.size, "cli.metadata");
|
|
@@ -79,35 +84,45 @@ export const inspectManagedNativeBoundariesBytes = (bytes, target) => {
|
|
|
79
84
|
issues: [cause.issue],
|
|
80
85
|
});
|
|
81
86
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
87
|
+
try {
|
|
88
|
+
const heapExtent = Math.max(layout.strings.size, layout.blob.size);
|
|
89
|
+
issues.push(...inventory.issues);
|
|
90
|
+
const moduleRefs = parseModuleRefs(bytes, layout, heapExtent, issues);
|
|
91
|
+
const members = new Map([
|
|
92
|
+
...parseFields(bytes, layout, heapExtent, issues),
|
|
93
|
+
...parseMethods(bytes, layout, heapExtent, issues),
|
|
94
|
+
]);
|
|
95
|
+
const imports = parseImplMaps({
|
|
96
|
+
bytes,
|
|
97
|
+
layout,
|
|
98
|
+
heapExtent,
|
|
99
|
+
modules: moduleRefs,
|
|
100
|
+
members,
|
|
101
|
+
issues,
|
|
102
|
+
});
|
|
103
|
+
const pinvokeTokens = new Set(imports
|
|
104
|
+
.map(({ member_token }) => member_token)
|
|
105
|
+
.filter((token) => token !== null));
|
|
106
|
+
const implementations = nativeImplementations(members.values(), pinvokeTokens);
|
|
107
|
+
return buildNativeBoundaryInspection({
|
|
108
|
+
target,
|
|
109
|
+
bytes,
|
|
110
|
+
pe,
|
|
111
|
+
layout,
|
|
112
|
+
inventory,
|
|
113
|
+
moduleRefs,
|
|
114
|
+
imports,
|
|
115
|
+
implementations,
|
|
116
|
+
native: cliNative(pe),
|
|
117
|
+
issues,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch (cause) {
|
|
121
|
+
if (!(cause instanceof ManagedReaderFailure))
|
|
122
|
+
throw cause;
|
|
123
|
+
return emptyInspection(target, bytes, "malformed", {
|
|
124
|
+
native: cliNative(pe),
|
|
125
|
+
issues: [...issues, cause.issue],
|
|
126
|
+
});
|
|
127
|
+
}
|
|
113
128
|
};
|