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,99 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { DOMParser, onWarningStopParsing } from "@xmldom/xmldom";
|
|
4
|
+
import { ConfigurationError } from "../domain/configurationErrors.js";
|
|
5
|
+
// Language definitions are small XML files; refuse anything implausibly large.
|
|
6
|
+
const MAX_LDEFS_BYTES = 4 * 1024 * 1024;
|
|
7
|
+
// Processor modules ship under Processors; installed extensions may add more.
|
|
8
|
+
const LANGUAGE_ROOTS = ["Ghidra/Processors", "Ghidra/Extensions"];
|
|
9
|
+
/** Parse the `<language>` elements of one `.ldefs` document. */
|
|
10
|
+
export const parseGhidraLanguageDefinitions = (text) => {
|
|
11
|
+
const definitions = [];
|
|
12
|
+
const document = new DOMParser({
|
|
13
|
+
onError: onWarningStopParsing,
|
|
14
|
+
}).parseFromString(text, "application/xml");
|
|
15
|
+
const root = document.documentElement;
|
|
16
|
+
if (root?.tagName !== "language_definitions")
|
|
17
|
+
throw new SyntaxError("Expected Ghidra language_definitions XML root");
|
|
18
|
+
for (const language of Array.from(root.getElementsByTagName("language"))) {
|
|
19
|
+
if (language.parentNode !== root)
|
|
20
|
+
continue;
|
|
21
|
+
const id = language.getAttribute("id");
|
|
22
|
+
if (id === null)
|
|
23
|
+
continue;
|
|
24
|
+
const compilerSpecIds = [];
|
|
25
|
+
for (const compiler of Array.from(language.getElementsByTagName("compiler"))) {
|
|
26
|
+
if (compiler.parentNode !== language)
|
|
27
|
+
continue;
|
|
28
|
+
const compilerId = compiler.getAttribute("id");
|
|
29
|
+
if (compilerId !== null)
|
|
30
|
+
compilerSpecIds.push(compilerId);
|
|
31
|
+
}
|
|
32
|
+
definitions.push({ id, compilerSpecIds });
|
|
33
|
+
}
|
|
34
|
+
return definitions;
|
|
35
|
+
};
|
|
36
|
+
const languageDirectories = async (installDir) => {
|
|
37
|
+
const directories = [];
|
|
38
|
+
for (const root of LANGUAGE_ROOTS) {
|
|
39
|
+
let modules;
|
|
40
|
+
try {
|
|
41
|
+
modules = await readdir(join(installDir, root));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
for (const module of modules.sort())
|
|
47
|
+
directories.push(join(installDir, root, module, "data", "languages"));
|
|
48
|
+
}
|
|
49
|
+
return directories;
|
|
50
|
+
};
|
|
51
|
+
/** Read every language definition shipped by one Ghidra installation. */
|
|
52
|
+
export const readGhidraLanguageCatalog = async (installDir) => {
|
|
53
|
+
const definitions = [];
|
|
54
|
+
for (const directory of await languageDirectories(installDir)) {
|
|
55
|
+
let entries;
|
|
56
|
+
try {
|
|
57
|
+
entries = await readdir(directory);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
for (const entry of entries.sort()) {
|
|
63
|
+
if (!entry.endsWith(".ldefs"))
|
|
64
|
+
continue;
|
|
65
|
+
const bytes = await readFile(join(directory, entry));
|
|
66
|
+
if (bytes.length > MAX_LDEFS_BYTES)
|
|
67
|
+
continue;
|
|
68
|
+
definitions.push(...parseGhidraLanguageDefinitions(bytes.toString("utf8")));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return definitions;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Check a configured import language against the installation before launch,
|
|
75
|
+
* so an unknown ID fails as configuration instead of as a failed import.
|
|
76
|
+
*/
|
|
77
|
+
export const admitGhidraLanguageOverride = (override, catalog, providerVersion) => {
|
|
78
|
+
const language = catalog.find((value) => value.id === override.languageId);
|
|
79
|
+
if (language === undefined)
|
|
80
|
+
return new ConfigurationError("Invalid REA environment configuration", {
|
|
81
|
+
settings: [
|
|
82
|
+
{
|
|
83
|
+
setting: "REA_GHIDRA_LANGUAGE_ID",
|
|
84
|
+
constraint: `is not a language defined by Ghidra ${providerVersion}`,
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
});
|
|
88
|
+
if (override.compilerSpecId !== undefined &&
|
|
89
|
+
!language.compilerSpecIds.includes(override.compilerSpecId))
|
|
90
|
+
return new ConfigurationError("Invalid REA environment configuration", {
|
|
91
|
+
settings: [
|
|
92
|
+
{
|
|
93
|
+
setting: "REA_GHIDRA_COMPILER_SPEC_ID",
|
|
94
|
+
constraint: `must be one of the selected language's compiler specs: ${language.compilerSpecIds.join(", ")}`,
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
});
|
|
98
|
+
return null;
|
|
99
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { GHIDRA_SEED_SCRIPT, snapshotGhidraAnalysisSeeds, } from "./GhidraAnalysisSeeds.js";
|
|
1
2
|
import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
|
|
2
3
|
import { mkdir } from "node:fs/promises";
|
|
3
|
-
import { basename, dirname, join, win32 } from "node:path";
|
|
4
|
+
import { basename, dirname, join, posix, win32 } from "node:path";
|
|
4
5
|
import writeFileAtomic from "write-file-atomic";
|
|
5
6
|
import { windowsPrivateRuntime } from "../windows/WindowsPrivateRuntime.js";
|
|
6
7
|
import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
|
|
@@ -12,9 +13,16 @@ import { ghidraJavaLaunch } from "./GhidraJavaLaunch.js";
|
|
|
12
13
|
import { snapshotGhidraExtensions, } from "./extensions/GhidraExtensions.js";
|
|
13
14
|
/** Local launch failure retained as the cause of a provider-neutral error. */
|
|
14
15
|
export class GhidraLaunchError extends Error {
|
|
16
|
+
#partialLaunch;
|
|
15
17
|
constructor(message, options) {
|
|
16
|
-
|
|
18
|
+
const { partialLaunch, ...errorOptions } = options ?? {};
|
|
19
|
+
super(message, errorOptions);
|
|
17
20
|
this.name = "GhidraLaunchError";
|
|
21
|
+
this.#partialLaunch = partialLaunch;
|
|
22
|
+
}
|
|
23
|
+
/** Process ownership retained for the client to retry an incomplete rollback. */
|
|
24
|
+
get partialLaunch() {
|
|
25
|
+
return this.#partialLaunch;
|
|
18
26
|
}
|
|
19
27
|
}
|
|
20
28
|
/** Launch Ghidra without copying scripts into or modifying its installation. */
|
|
@@ -34,6 +42,9 @@ export class GhidraHeadlessLauncher {
|
|
|
34
42
|
let started;
|
|
35
43
|
try {
|
|
36
44
|
await createGhidraRuntimeDirectories(paths, platform);
|
|
45
|
+
const seedPath = this.options.analysisSeeds === undefined
|
|
46
|
+
? undefined
|
|
47
|
+
: await snapshotGhidraAnalysisSeeds(this.options.analysisSeeds, session.runtimeRoot);
|
|
37
48
|
const extensions = await snapshotGhidraExtensions(this.options.analysisExtensions ?? [], session.runtimeRoot);
|
|
38
49
|
await writeGhidraRuntimeFile(paths.descriptorPath, `${JSON.stringify({
|
|
39
50
|
transport: session.transport,
|
|
@@ -50,6 +61,7 @@ export class GhidraHeadlessLauncher {
|
|
|
50
61
|
if (isAborted(options.signal))
|
|
51
62
|
return err(new AnalysisCancelledError("open_binary"));
|
|
52
63
|
const headlessArguments = ghidraHeadlessArguments({
|
|
64
|
+
platform,
|
|
53
65
|
projectRoot: paths.projectRoot,
|
|
54
66
|
targetPath: session.targetPath,
|
|
55
67
|
bridgeScriptPath: this.options.bridgeScriptPath,
|
|
@@ -62,6 +74,10 @@ export class GhidraHeadlessLauncher {
|
|
|
62
74
|
...(this.options.dosMz === undefined
|
|
63
75
|
? {}
|
|
64
76
|
: { dosMz: this.options.dosMz }),
|
|
77
|
+
...(this.options.languageOverride === undefined
|
|
78
|
+
? {}
|
|
79
|
+
: { languageOverride: this.options.languageOverride }),
|
|
80
|
+
...(seedPath === undefined ? {} : { seedPath }),
|
|
65
81
|
});
|
|
66
82
|
const scriptCommand = ghidraHeadlessCommand({
|
|
67
83
|
environment: this.options.environment,
|
|
@@ -89,7 +105,7 @@ export class GhidraHeadlessLauncher {
|
|
|
89
105
|
: { signal: options.signal }),
|
|
90
106
|
})
|
|
91
107
|
: { ...scriptCommand, environment };
|
|
92
|
-
started = await spawnOwnedProviderProcess({
|
|
108
|
+
started = await (this.options.spawnProcess ?? spawnOwnedProviderProcess)({
|
|
93
109
|
command: command.command,
|
|
94
110
|
arguments: command.arguments,
|
|
95
111
|
runId: session.runId,
|
|
@@ -102,6 +118,7 @@ export class GhidraHeadlessLauncher {
|
|
|
102
118
|
hostEnvironment: {},
|
|
103
119
|
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
104
120
|
});
|
|
121
|
+
const partialLaunch = ownedGhidraLaunch(started, paths, platform);
|
|
105
122
|
await writeGhidraRuntimeFile(paths.ownershipPath, `${JSON.stringify({
|
|
106
123
|
run_id: session.runId,
|
|
107
124
|
transport: session.transport,
|
|
@@ -115,29 +132,45 @@ export class GhidraHeadlessLauncher {
|
|
|
115
132
|
created_at: new Date().toISOString(),
|
|
116
133
|
})}\n`, platform);
|
|
117
134
|
if (isAborted(options.signal)) {
|
|
118
|
-
|
|
119
|
-
return err(new AnalysisCancelledError("open_binary"));
|
|
135
|
+
throw new AnalysisCancelledError("open_binary");
|
|
120
136
|
}
|
|
121
|
-
|
|
122
|
-
return ok({
|
|
123
|
-
...ownedGhidraProcess(spawned, platform),
|
|
124
|
-
projectRoot: paths.projectRoot,
|
|
125
|
-
ghidraLogPath: paths.ghidraLogPath,
|
|
126
|
-
scriptLogPath: paths.scriptLogPath,
|
|
127
|
-
});
|
|
137
|
+
return ok(partialLaunch);
|
|
128
138
|
}
|
|
129
139
|
catch (cause) {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
140
|
+
const primary = isAborted(options.signal)
|
|
141
|
+
? new AnalysisCancelledError("open_binary", { cause })
|
|
142
|
+
: new GhidraLaunchError("Ghidra headless launch failed", { cause });
|
|
143
|
+
if (started === undefined)
|
|
144
|
+
return err(primary);
|
|
145
|
+
let cleanupFailure;
|
|
146
|
+
try {
|
|
147
|
+
const cleanup = await cleanupStartedProcess(started, platform);
|
|
148
|
+
if (!cleanup.cleaned)
|
|
149
|
+
cleanupFailure = new Error(`Ghidra process cleanup was incomplete: ${cleanup.reason}`);
|
|
150
|
+
}
|
|
151
|
+
catch (failure) {
|
|
152
|
+
cleanupFailure = failure;
|
|
153
|
+
}
|
|
154
|
+
if (cleanupFailure !== undefined) {
|
|
155
|
+
const partialLaunch = ownedGhidraLaunch(started, paths, platform);
|
|
156
|
+
const primaryMessage = isAborted(options.signal)
|
|
157
|
+
? primary.message
|
|
158
|
+
: `Ghidra headless launch failed: ${cause instanceof Error ? cause.message : String(cause)}`;
|
|
159
|
+
return err(new GhidraLaunchError(`${primaryMessage}; process cleanup remains incomplete`, {
|
|
160
|
+
cause: new AggregateError([primary, cleanupFailure], "Ghidra launch rollback did not release its process", { cause: primary }),
|
|
161
|
+
partialLaunch,
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
return err(primary);
|
|
138
165
|
}
|
|
139
166
|
}
|
|
140
167
|
}
|
|
168
|
+
const ownedGhidraLaunch = (spawned, paths, platform) => ({
|
|
169
|
+
...ownedGhidraProcess(spawned, platform),
|
|
170
|
+
projectRoot: paths.projectRoot,
|
|
171
|
+
ghidraLogPath: paths.ghidraLogPath,
|
|
172
|
+
scriptLogPath: paths.scriptLogPath,
|
|
173
|
+
});
|
|
141
174
|
const ownedGhidraProcess = (spawned, platform) => ({
|
|
142
175
|
process: spawned.process,
|
|
143
176
|
ownsProcessLifetime: true,
|
|
@@ -185,52 +218,84 @@ const cleanupStartedProcess = (started, platform) => started.cleanup !== undefin
|
|
|
185
218
|
? cleanupWindowsProcessTree(started.ownership.leaderPid)
|
|
186
219
|
: cleanupOwnedProcessGroup(started.ownership);
|
|
187
220
|
/** Build the complete read-only headless invocation in deterministic order. */
|
|
188
|
-
export const ghidraHeadlessArguments = (options) =>
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
"
|
|
192
|
-
options.
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
221
|
+
export const ghidraHeadlessArguments = (options) => {
|
|
222
|
+
// Bridge script paths use the target platform's syntax, which differs from
|
|
223
|
+
// the host when building a cross-platform invocation.
|
|
224
|
+
const scriptPath = (options.platform ?? process.platform) === "win32" ? win32 : posix;
|
|
225
|
+
const bridgeDirectory = scriptPath.dirname(options.bridgeScriptPath);
|
|
226
|
+
const override = options.languageOverride;
|
|
227
|
+
if (override !== undefined &&
|
|
228
|
+
(options.dosMz === true || options.dosCom === true))
|
|
229
|
+
throw new Error("A Ghidra language override cannot be combined with a DOS import.");
|
|
230
|
+
return [
|
|
231
|
+
options.projectRoot,
|
|
232
|
+
"rea-project",
|
|
233
|
+
"-import",
|
|
234
|
+
options.targetPath,
|
|
235
|
+
...(options.dosMz === true
|
|
203
236
|
? [
|
|
204
237
|
"-loader",
|
|
205
|
-
"
|
|
206
|
-
"-loader-baseAddr",
|
|
207
|
-
"1000:0100",
|
|
238
|
+
"MzLoader",
|
|
208
239
|
"-processor",
|
|
209
240
|
"x86:LE:16:Real Mode",
|
|
210
241
|
"-cspec",
|
|
211
242
|
"default",
|
|
212
243
|
]
|
|
244
|
+
: options.dosCom === true
|
|
245
|
+
? [
|
|
246
|
+
"-loader",
|
|
247
|
+
"BinaryLoader",
|
|
248
|
+
"-loader-baseAddr",
|
|
249
|
+
"1000:0100",
|
|
250
|
+
"-processor",
|
|
251
|
+
"x86:LE:16:Real Mode",
|
|
252
|
+
"-cspec",
|
|
253
|
+
"default",
|
|
254
|
+
]
|
|
255
|
+
: override !== undefined
|
|
256
|
+
? [
|
|
257
|
+
"-processor",
|
|
258
|
+
override.languageId,
|
|
259
|
+
...(override.compilerSpecId === undefined
|
|
260
|
+
? []
|
|
261
|
+
: ["-cspec", override.compilerSpecId]),
|
|
262
|
+
]
|
|
263
|
+
: []),
|
|
264
|
+
"-readOnly",
|
|
265
|
+
"-deleteProject",
|
|
266
|
+
"-log",
|
|
267
|
+
options.ghidraLogPath,
|
|
268
|
+
"-scriptlog",
|
|
269
|
+
options.scriptLogPath,
|
|
270
|
+
"-scriptPath",
|
|
271
|
+
bridgeDirectory,
|
|
272
|
+
...(options.dosCom === true
|
|
273
|
+
? [
|
|
274
|
+
"-preScript",
|
|
275
|
+
scriptPath.join(bridgeDirectory, "ReaGhidraPrepareCom.java"),
|
|
276
|
+
]
|
|
213
277
|
: []),
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
];
|
|
278
|
+
// Seeds follow any loader preparation and precede default auto-analysis.
|
|
279
|
+
...(options.seedPath === undefined
|
|
280
|
+
? []
|
|
281
|
+
: [
|
|
282
|
+
"-preScript",
|
|
283
|
+
scriptPath.join(bridgeDirectory, GHIDRA_SEED_SCRIPT),
|
|
284
|
+
options.seedPath,
|
|
285
|
+
]),
|
|
286
|
+
...((options.platform ?? process.platform) === "win32"
|
|
287
|
+
? []
|
|
288
|
+
: [
|
|
289
|
+
"-postScript",
|
|
290
|
+
scriptPath.join(bridgeDirectory, "ReaGhidraNoReturnFix.java"),
|
|
291
|
+
]),
|
|
292
|
+
"-postScript",
|
|
293
|
+
// Ghidra checks the caller's cwd before scriptPath for a basename. Select
|
|
294
|
+
// the packaged source explicitly so unrelated entries cannot shadow it.
|
|
295
|
+
options.bridgeScriptPath,
|
|
296
|
+
options.descriptorPath,
|
|
297
|
+
];
|
|
298
|
+
};
|
|
234
299
|
const ghidraRuntimePaths = (runtimeRoot) => ({
|
|
235
300
|
projectRoot: join(runtimeRoot, "project"),
|
|
236
301
|
homeRoot: join(runtimeRoot, "home"),
|
|
@@ -1,11 +1,52 @@
|
|
|
1
|
+
import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
|
|
1
2
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
2
3
|
import { nativeLoadImageObservationSchema, nativeLoadImageSchema, } from "../domain/native/nativeLoadImage.js";
|
|
3
4
|
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
4
5
|
import { err, ok } from "../domain/result.js";
|
|
5
6
|
import { attestGhidraDosComLoadImage, attestGhidraDosLoadImage, } from "./GhidraLoadImageValues.js";
|
|
7
|
+
import {} from "../domain/native/nativeAotPe.js";
|
|
8
|
+
const isSignalAborted = (signal) => signal?.aborted === true;
|
|
6
9
|
/** Independently verify measured load-image observations for admitted DOS targets. */
|
|
7
|
-
export const attestGhidraNativeLoadImage = async (
|
|
10
|
+
export const attestGhidraNativeLoadImage = async (input) => {
|
|
11
|
+
const { target, operation, measured, client, mapSessionError, nativeAotResult, signal, } = input;
|
|
12
|
+
if (isSignalAborted(signal))
|
|
13
|
+
return err(new AnalysisCancelledError(operation));
|
|
8
14
|
const observations = nativeLoadImageObservationSchema.parse(measured);
|
|
15
|
+
if (target.format === "pe") {
|
|
16
|
+
if (nativeAotResult === undefined)
|
|
17
|
+
return err(new ProviderAdapterError("ghidra", operation, {
|
|
18
|
+
diagnostics: {
|
|
19
|
+
reason: "The Ghidra provider did not produce read-only NativeAOT metadata for this admitted PE snapshot.",
|
|
20
|
+
},
|
|
21
|
+
}));
|
|
22
|
+
if (isSignalAborted(signal))
|
|
23
|
+
return err(new AnalysisCancelledError(operation));
|
|
24
|
+
try {
|
|
25
|
+
return ok(jsonValueSchema.parse(nativeLoadImageSchema.parse({
|
|
26
|
+
status: "unsupported",
|
|
27
|
+
reason: "Independent load-image verification currently supports DOS MZ and explicit DOS COM targets only.",
|
|
28
|
+
observations: {
|
|
29
|
+
...observations,
|
|
30
|
+
metadata_recovery: [
|
|
31
|
+
...(observations.metadata_recovery ?? []),
|
|
32
|
+
nativeAotResult.summary,
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
limitations: [
|
|
36
|
+
"Load-image verification is not performed for PE targets; NativeAOT metadata observations are derived separately from the exact admitted snapshot.",
|
|
37
|
+
],
|
|
38
|
+
})));
|
|
39
|
+
}
|
|
40
|
+
catch (cause) {
|
|
41
|
+
return err(new ProviderAdapterError("ghidra", operation, {
|
|
42
|
+
diagnostics: {
|
|
43
|
+
reason: cause instanceof Error
|
|
44
|
+
? cause.message
|
|
45
|
+
: "NativeAOT metadata could not be represented in the load-image result",
|
|
46
|
+
},
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
9
50
|
if (target.format !== "dos-mz" && target.format !== "dos-com") {
|
|
10
51
|
return ok(jsonValueSchema.parse(nativeLoadImageSchema.parse({
|
|
11
52
|
status: "unsupported",
|
|
@@ -25,9 +66,15 @@ export const attestGhidraNativeLoadImage = async (target, operation, measured, c
|
|
|
25
66
|
const snapshot = await client.readTargetSnapshot();
|
|
26
67
|
if (!snapshot.ok)
|
|
27
68
|
return err(mapSessionError(snapshot.error));
|
|
69
|
+
if (snapshot.value.kind !== "captured")
|
|
70
|
+
return err(new ProviderAdapterError("ghidra", operation, {
|
|
71
|
+
diagnostics: {
|
|
72
|
+
reason: "The uncapped DOS load-image snapshot was unexpectedly not captured.",
|
|
73
|
+
},
|
|
74
|
+
}));
|
|
28
75
|
const attested = (target.format === "dos-com"
|
|
29
76
|
? attestGhidraDosComLoadImage
|
|
30
|
-
: attestGhidraDosLoadImage)(snapshot.value, target.sha256 ?? "", observations);
|
|
77
|
+
: attestGhidraDosLoadImage)(snapshot.value.bytes, target.sha256 ?? "", observations);
|
|
31
78
|
if (!attested.ok)
|
|
32
79
|
return err(new ProviderAdapterError("ghidra", operation, {
|
|
33
80
|
diagnostics: { reason: attested.error },
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/** Keep family recognition separate from the deliberately bounded Ghidra lane. */
|
|
2
|
+
export const ghidraMipsUnsupportedReason = (target) => {
|
|
3
|
+
if (target.kind !== "executable" || target.architecture !== "mips")
|
|
4
|
+
return null;
|
|
5
|
+
const metadata = target.mips;
|
|
6
|
+
if (target.format !== "elf" || metadata === undefined)
|
|
7
|
+
return "MIPS analysis requires ELF header metadata; a family name alone does not select an ISA or ABI.";
|
|
8
|
+
if (metadata.elfClass !== 32)
|
|
9
|
+
return "This Ghidra MIPS lane supports ELF32 only; MIPS64 and n64 remain unsupported.";
|
|
10
|
+
if (metadata.type !== 2)
|
|
11
|
+
return "This Ghidra MIPS lane supports ET_EXEC only; relocatable objects, shared images and PSP PRX need separate load verification.";
|
|
12
|
+
if ((metadata.flags & 0x0f000000) !== 0)
|
|
13
|
+
return "MIPS16, microMIPS and other ASE encodings are outside this standard-instruction MIPS lane.";
|
|
14
|
+
if ((metadata.flags & 0x00ff0000) !== 0)
|
|
15
|
+
return "Machine-specific MIPS variants, including PSP Allegrex, need a separately supported processor profile.";
|
|
16
|
+
if ((metadata.flags & 0xf0000000) !== 0x70000000)
|
|
17
|
+
return "This Ghidra MIPS lane requires EF_MIPS_ARCH_32R2; other ISA revisions need separate verification.";
|
|
18
|
+
if ((metadata.flags & 0x0000f000) !== 0x00001000 ||
|
|
19
|
+
(metadata.flags & 0x20) !== 0)
|
|
20
|
+
return "This Ghidra MIPS lane requires an explicit o32 ABI; unspecified, n32 and EABI targets remain unsupported.";
|
|
21
|
+
if ((metadata.flags & 0x00000200) !== 0)
|
|
22
|
+
return "EF_MIPS_FP64 requires separate verification of 64-bit floating-point register semantics in this Ghidra lane.";
|
|
23
|
+
if ((metadata.flags & 0x00000400) !== 0)
|
|
24
|
+
return "EF_MIPS_NAN2008 requires separate verification of NaN encoding semantics in this Ghidra lane.";
|
|
25
|
+
const abi = metadata.abiFlags;
|
|
26
|
+
if (abi === undefined || abi === null)
|
|
27
|
+
return [
|
|
28
|
+
"This Ghidra MIPS lane requires an inspected ABI flags record; header flags alone do not establish the floating-point ABI.",
|
|
29
|
+
...(metadata.limitations ?? []),
|
|
30
|
+
].join(" ");
|
|
31
|
+
if (abi.version !== 0)
|
|
32
|
+
return "This Ghidra MIPS lane requires ABI flags version 0; newer record semantics are unsupported.";
|
|
33
|
+
if (abi.isaLevel !== 32 || abi.isaRevision !== 2)
|
|
34
|
+
return "MIPS ABI flags must agree with the declared MIPS32r2 ISA.";
|
|
35
|
+
if (abi.gprSize !== 1 || abi.cpr1Size !== 1 || abi.cpr2Size !== 0)
|
|
36
|
+
return "This Ghidra MIPS lane requires 32-bit GPR/CPR1 and no CPR2; other register modes need separate verification.";
|
|
37
|
+
if (abi.fpAbi !== 1 && abi.fpAbi !== 5)
|
|
38
|
+
return "This Ghidra MIPS lane admits double-precision or FPXX ABI declarations only; soft-float, FP64 and unspecified modes need separate verification.";
|
|
39
|
+
if (abi.isaExtension !== 0 || abi.ases !== 0)
|
|
40
|
+
return "MIPS ABI flags declare an ISA extension or ASE outside this standard-instruction lane.";
|
|
41
|
+
if ((abi.flags1 & ~1) !== 0 || abi.flags2 !== 0)
|
|
42
|
+
return "MIPS ABI flags contain unsupported general flags.";
|
|
43
|
+
return null;
|
|
44
|
+
};
|
|
45
|
+
/** Commit source ELF interpretation without confusing target ISA with host CPU. */
|
|
46
|
+
export const ghidraMipsProfileParameters = (target) => {
|
|
47
|
+
if (target.kind !== "executable" ||
|
|
48
|
+
target.architecture !== "mips" ||
|
|
49
|
+
target.mips === undefined)
|
|
50
|
+
return {};
|
|
51
|
+
const abi = target.mips.abiFlags;
|
|
52
|
+
return {
|
|
53
|
+
mips_elf: {
|
|
54
|
+
elf_class: target.mips.elfClass,
|
|
55
|
+
byte_order: target.mips.byteOrder,
|
|
56
|
+
type: target.mips.type,
|
|
57
|
+
flags: target.mips.flags,
|
|
58
|
+
...(target.mips.limitations === undefined
|
|
59
|
+
? {}
|
|
60
|
+
: { abi_flags_limitations: [...target.mips.limitations] }),
|
|
61
|
+
abi_flags: abi === undefined || abi === null
|
|
62
|
+
? null
|
|
63
|
+
: {
|
|
64
|
+
version: abi.version,
|
|
65
|
+
isa_level: abi.isaLevel,
|
|
66
|
+
isa_revision: abi.isaRevision,
|
|
67
|
+
gpr_size: abi.gprSize,
|
|
68
|
+
cpr1_size: abi.cpr1Size,
|
|
69
|
+
cpr2_size: abi.cpr2Size,
|
|
70
|
+
fp_abi: abi.fpAbi,
|
|
71
|
+
isa_extension: abi.isaExtension,
|
|
72
|
+
ases: abi.ases,
|
|
73
|
+
flags1: abi.flags1,
|
|
74
|
+
flags2: abi.flags2,
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
mips_support_lane: "elf32-exec-o32-arch32r2-standard-v3",
|
|
78
|
+
};
|
|
79
|
+
};
|
|
@@ -2,15 +2,26 @@ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
|
|
|
2
2
|
import {} from "../application/AnalysisProvider.js";
|
|
3
3
|
import { createAnalysisProfile, } from "../domain/analysisProfile.js";
|
|
4
4
|
import { jsonObjectSchema, jsonValueSchema, } from "../domain/jsonValue.js";
|
|
5
|
-
import { ok } from "../domain/result.js";
|
|
5
|
+
import { err, ok } from "../domain/result.js";
|
|
6
|
+
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
6
7
|
import { GhidraClient } from "./GhidraClient.js";
|
|
7
8
|
import { ghidraInstallationDiagnostics, inspectGhidraInstallation, } from "./GhidraInstallation.js";
|
|
8
9
|
import { resolveGhidraAnalysisProfile } from "./GhidraAnalysisProfile.js";
|
|
10
|
+
import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
|
|
11
|
+
import { resolveGhidraAnalysisSeeds } from "./GhidraAnalysisSeeds.js";
|
|
12
|
+
import { admitGhidraLanguageOverride, readGhidraLanguageCatalog, } from "./GhidraLanguageCatalog.js";
|
|
13
|
+
import { ghidraMipsUnsupportedReason } from "./GhidraMipsProfile.js";
|
|
9
14
|
import { resolveGhidraExtensions } from "./extensions/GhidraExtensions.js";
|
|
10
15
|
import { CAPABILITIES, windowsP0Capabilities, GHIDRA_PROVIDER_IDENTITY, GHIDRA_OPERATIONS, } from "./GhidraProviderCapabilities.js";
|
|
11
16
|
import { createGhidraProviderClient, } from "./GhidraProviderClient.js";
|
|
12
17
|
import { windowsNativeAuthorityUnavailableReason, hasWindowsNativeAuthority, windowsNativeCapabilities, } from "../process/WindowsAuthority.js";
|
|
13
|
-
const SUPPORTED_ARCHITECTURES = new Set([
|
|
18
|
+
const SUPPORTED_ARCHITECTURES = new Set([
|
|
19
|
+
"x86",
|
|
20
|
+
"x86_64",
|
|
21
|
+
"arm",
|
|
22
|
+
"arm64",
|
|
23
|
+
"mips",
|
|
24
|
+
]);
|
|
14
25
|
/** Ghidra candidate backed by an isolated ephemeral headless import. */
|
|
15
26
|
export class GhidraProvider {
|
|
16
27
|
config;
|
|
@@ -85,6 +96,14 @@ export class GhidraProvider {
|
|
|
85
96
|
};
|
|
86
97
|
if (hostPlatform === "win32")
|
|
87
98
|
return inspectWindowsP0TargetSupport(target, diagnostics);
|
|
99
|
+
const mipsReason = ghidraMipsUnsupportedReason(target);
|
|
100
|
+
if (mipsReason !== null)
|
|
101
|
+
return {
|
|
102
|
+
status: "unsupported",
|
|
103
|
+
code: "architecture_unsupported",
|
|
104
|
+
reason: mipsReason,
|
|
105
|
+
diagnostics,
|
|
106
|
+
};
|
|
88
107
|
if (target.format === "mach-o" && target.availableArchitectures.length > 1)
|
|
89
108
|
return {
|
|
90
109
|
status: "unsupported",
|
|
@@ -96,7 +115,7 @@ export class GhidraProvider {
|
|
|
96
115
|
return {
|
|
97
116
|
status: "unsupported",
|
|
98
117
|
code: "architecture_unsupported",
|
|
99
|
-
reason: "Ghidra v1 requires a
|
|
118
|
+
reason: "Ghidra v1 requires a supported x86, x86_64, arm, arm64, or MIPS target profile.",
|
|
100
119
|
diagnostics,
|
|
101
120
|
};
|
|
102
121
|
return {
|
|
@@ -108,19 +127,47 @@ export class GhidraProvider {
|
|
|
108
127
|
}
|
|
109
128
|
async resolveAnalysisProfile(target, options) {
|
|
110
129
|
const installation = this.#inspectInstallation();
|
|
111
|
-
const resolved = await resolveGhidraAnalysisProfile(target, GHIDRA_PROVIDER_IDENTITY, installation, options?.signal);
|
|
130
|
+
const resolved = await resolveGhidraAnalysisProfile(target, GHIDRA_PROVIDER_IDENTITY, installation, options?.signal, this.config.ghidraLanguageOverride);
|
|
112
131
|
if (!resolved.ok || resolved.value.profile === null)
|
|
113
132
|
return resolved;
|
|
133
|
+
const override = this.config.ghidraLanguageOverride;
|
|
134
|
+
if (override !== undefined && installation.status === "available") {
|
|
135
|
+
let catalog;
|
|
136
|
+
try {
|
|
137
|
+
catalog = await readGhidraLanguageCatalog(installation.installDir);
|
|
138
|
+
}
|
|
139
|
+
catch (cause) {
|
|
140
|
+
return err(new ProviderAdapterError("ghidra", "resolve_analysis_profile", {
|
|
141
|
+
cause,
|
|
142
|
+
diagnostics: {
|
|
143
|
+
reason: "Could not read the installed Ghidra language definitions.",
|
|
144
|
+
},
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
147
|
+
const refused = admitGhidraLanguageOverride(override, catalog, installation.providerVersion);
|
|
148
|
+
if (refused !== null)
|
|
149
|
+
return err(refused);
|
|
150
|
+
}
|
|
114
151
|
const extensions = await resolveGhidraExtensions(this.config, target, installation.platform, options?.signal);
|
|
115
152
|
if (!extensions.ok)
|
|
116
153
|
return extensions;
|
|
117
|
-
if (
|
|
154
|
+
if (options?.signal?.aborted === true)
|
|
155
|
+
return err(new AnalysisCancelledError("open_binary"));
|
|
156
|
+
const seeds = await resolveGhidraAnalysisSeeds(this.config.ghidraSeedFile);
|
|
157
|
+
if (!seeds.ok)
|
|
158
|
+
return seeds;
|
|
159
|
+
if (extensions.value.length === 0 && seeds.value === undefined)
|
|
118
160
|
return resolved;
|
|
119
161
|
return ok({
|
|
120
162
|
...resolved.value,
|
|
121
163
|
profile: createAnalysisProfile(resolved.value.profile.provider, {
|
|
122
164
|
...resolved.value.profile.parameters,
|
|
123
|
-
|
|
165
|
+
...(extensions.value.length === 0
|
|
166
|
+
? {}
|
|
167
|
+
: { analysis_extensions: jsonValueSchema.parse(extensions.value) }),
|
|
168
|
+
...(seeds.value === undefined
|
|
169
|
+
? {}
|
|
170
|
+
: { analysis_seeds: jsonValueSchema.parse(seeds.value) }),
|
|
124
171
|
}),
|
|
125
172
|
});
|
|
126
173
|
}
|
|
@@ -174,18 +221,19 @@ const inspectWindowsP0TargetSupport = (target, diagnostics) => {
|
|
|
174
221
|
reason: "Windows Ghidra P0 accepts x86 and x86-64 PE targets only.",
|
|
175
222
|
diagnostics,
|
|
176
223
|
};
|
|
177
|
-
if (target.executableRole !== "application"
|
|
224
|
+
if (target.executableRole !== "application" &&
|
|
225
|
+
target.executableRole !== "shared-library")
|
|
178
226
|
return {
|
|
179
227
|
status: "unsupported",
|
|
180
228
|
code: "target_role_unsupported",
|
|
181
|
-
reason: "Windows Ghidra P0 accepts PE applications, not
|
|
229
|
+
reason: "Windows Ghidra P0 accepts PE applications and DLLs, not non-executable or unclassified images.",
|
|
182
230
|
diagnostics,
|
|
183
231
|
};
|
|
184
232
|
if (target.managed !== false)
|
|
185
233
|
return {
|
|
186
234
|
status: "unsupported",
|
|
187
235
|
code: "managed_target_unsupported",
|
|
188
|
-
reason: "Windows Ghidra P0 accepts native PE applications; managed or unclassified PE targets are unsupported.",
|
|
236
|
+
reason: "Windows Ghidra P0 accepts native PE applications and DLLs; managed or unclassified PE targets are unsupported.",
|
|
189
237
|
diagnostics,
|
|
190
238
|
};
|
|
191
239
|
return {
|