rea-agents 6.3.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 +7 -4
- package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
- package/bridge/ghidra/ReaGhidraBridge.java +597 -209
- package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -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 +51 -19
- 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 +22 -2
- package/dist/application/CapabilityInventory.js +11 -1
- package/dist/application/ClientConfigurationDocument.js +70 -0
- package/dist/application/ClientConfigurationFiles.js +91 -0
- package/dist/application/ClientRegistrationEnvironment.js +35 -0
- package/dist/application/ClientRegistrationStatus.js +66 -31
- package/dist/application/DirectAnalysis.js +2 -2
- package/dist/application/DirectAnalysisCleanup.js +1 -1
- package/dist/application/DirectAnalysisStatus.js +1 -1
- package/dist/application/Doctor.js +5 -3
- package/dist/application/DoctorDiagnostics.js +1 -1
- package/dist/application/EvidenceBundleCommands.js +6 -12
- 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 +6 -0
- package/dist/application/JsonFiles.js +6 -5
- package/dist/{cliJsonFile.js → application/JsonInputFile.js} +108 -35
- package/dist/application/LinuxHopper.js +4 -12
- 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 +9 -3
- 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 +93 -7
- package/dist/application/Setup.js +54 -6
- package/dist/application/SetupClientConfiguration.js +116 -16
- package/dist/application/SetupHost.js +102 -24
- package/dist/application/SetupPlan.js +5 -8
- package/dist/application/SetupSkill.js +58 -39
- package/dist/application/SupportedClients.js +290 -65
- package/dist/application/Uninstall.js +158 -10
- package/dist/application/UpdateMaintenance.js +17 -21
- package/dist/application/Utf8JsonInput.js +7 -0
- package/dist/application/WebScriptExportService.js +131 -65
- 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/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/BinarySession.js +2 -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/ElectronBoundaryGraphContext.js +3 -2
- package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +19 -6
- package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
- package/dist/application/javascript/JavaScriptApplicationService.js +22 -11
- package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -30
- package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +67 -19
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +19 -16
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +258 -235
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +115 -26
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -1
- package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -4
- package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +9 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +199 -61
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +12 -19
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +4 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -3
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +5 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +19 -8
- 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/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 +20 -15
- package/dist/artifacts/ArtifactReader.js +23 -0
- package/dist/artifacts/ArtifactResourceScope.js +100 -0
- package/dist/artifacts/AsarArtifactReader.js +176 -102
- 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 +29 -22
- 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 +32 -13
- package/dist/artifacts/extraction/ArtifactExtraction.js +110 -86
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +110 -43
- package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
- package/dist/artifacts/inventory/classify.js +75 -32
- package/dist/artifacts/inventory/hashStableRootArtifact.js +48 -15
- package/dist/artifacts/inventory/reader.js +13 -5
- package/dist/artifacts/inventory/scanCanonical.js +62 -25
- package/dist/artifacts/inventory/scanReader.js +38 -11
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +15 -9
- 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 +5 -0
- 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/CdpConnection.js +22 -5
- package/dist/browser/CdpPageCapture.js +1 -1
- package/dist/browser/CdpTargetSession.js +30 -34
- package/dist/browser/CdpWebMcpDiscovery.js +32 -10
- package/dist/browser/ElectronFileScope.js +99 -9
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +60 -4
- package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
- package/dist/browser/PlaywrightScenarioBrowser.js +69 -7
- package/dist/browser/PlaywrightScenarioSession.js +127 -54
- package/dist/browser/PlaywrightScenarioStorage.js +507 -0
- package/dist/browser/PngVisualDiff.js +198 -29
- package/dist/browser/WebSourceMapFetcher.js +3 -3
- package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
- package/dist/browser/assets/PublishWebScripts.js +75 -20
- 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/coreBinaryCommands.js +0 -5
- package/dist/cli/coreNativeCommands.js +1 -14
- package/dist/cli/electronCommands.js +6 -1
- package/dist/cli/evmCommands.js +13 -4
- package/dist/cli/firmwareCommands.js +7 -2
- package/dist/cli/javascriptApplicationAnalysis.js +17 -1
- package/dist/cli/javascriptRecoveryCommands.js +22 -15
- package/dist/cli/jebCommands.js +99 -0
- package/dist/cli/jsonOutput.js +11 -4
- package/dist/cli/referenceSourceImportStatus.js +7 -0
- package/dist/cli/setupCommands.js +15 -3
- package/dist/cli/utilityCommands.js +66 -18
- package/dist/cli/webScriptCommands.js +20 -1
- package/dist/cli/webSourceLocationCommands.js +21 -9
- package/dist/cli.js +6 -0
- package/dist/cliBrowserScenarioCommands.js +2 -1
- package/dist/cliCommandNames.js +32 -0
- package/dist/cliJsonInput.js +2 -2
- package/dist/cliObservationOptions.js +3 -0
- package/dist/composition/adb.js +3 -0
- package/dist/composition/apktool.js +3 -0
- package/dist/composition/binaryDiagnostics.js +4 -0
- package/dist/composition/directAnalysis.js +12 -4
- 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/artifactToolContracts.js +8 -5
- package/dist/contracts/browserToolContracts.js +1 -1
- package/dist/contracts/compactInputSchema.js +256 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +10 -10
- package/dist/contracts/javascript/electronToolContracts.js +15 -3
- package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
- package/dist/contracts/jeb/jebToolContracts.js +64 -0
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
- package/dist/contracts/officialToolContracts.js +5 -5
- package/dist/contracts/sessionToolContracts.js +2 -2
- package/dist/contracts/sessionToolSchemas.js +6 -2
- 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 +5 -3
- package/dist/contracts/toolSchemaMetadata.js +82 -7
- package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
- package/dist/domain/analysisErrorCleanup.js +29 -0
- package/dist/domain/analysisErrorPresentation.js +18 -6
- package/dist/domain/analysisErrorProjection.js +4 -1
- package/dist/domain/analysisSnapshot.js +2 -1
- package/dist/domain/analysisView/analysisView.js +52 -2
- 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/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 +2 -2
- package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
- package/dist/domain/artifactComparison.js +35 -7
- package/dist/domain/artifactGraph.js +5 -3
- package/dist/domain/artifactIdentity.js +30 -2
- package/dist/domain/artifactInspection.js +3 -43
- package/dist/domain/artifactIntegrityPolicy.js +10 -0
- package/dist/domain/artifactInventoryEvidence.js +11 -12
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/binaryTarget.js +16 -0
- package/dist/domain/binaryTargetTypes.js +8 -1
- package/dist/domain/browserObservationSchemas.js +8 -4
- package/dist/domain/canonicalJsonDigestSteps.js +34 -12
- package/dist/domain/compactStringIdentity.js +9 -0
- package/dist/domain/evidence.js +2 -1
- package/dist/domain/evidenceRecordSummary.js +144 -0
- package/dist/domain/inputIssueProjection.js +16 -1
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -13
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -20
- package/dist/domain/javascript/electronStaticAnalysisNative.js +70 -40
- package/dist/domain/javascript/electronStaticAnalysisValues.js +16 -0
- package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +4 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +6 -6
- package/dist/domain/javascript/javascriptApplicationGraph.js +79 -18
- package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +28 -12
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -1
- package/dist/domain/javascript/javascriptAstFingerprint.js +58 -31
- package/dist/domain/javascript/javascriptAstValues.js +32 -0
- package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
- package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
- package/dist/domain/javascript/javascriptNativeHandoff.js +6 -1
- package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +7 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +8 -11
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +190 -33
- package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
- package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
- package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
- package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +42 -41
- package/dist/domain/javascript/javascriptSemanticGraph.js +69 -23
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +2 -10
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +40 -7
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +341 -87
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +78 -35
- package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
- package/dist/domain/javascript/javascriptSemanticObjects.js +7 -1
- package/dist/domain/javascript/javascriptSemanticProjection.js +52 -14
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +77 -0
- package/dist/domain/javascript/javascriptSemanticQuery.js +27 -29
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +1 -3
- package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
- package/dist/domain/javascript/javascriptSemanticReturns.js +13 -23
- package/dist/domain/javascript/javascriptSemanticState.js +22 -2
- package/dist/domain/javascript/javascriptSemanticTraversal.js +19 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +47 -19
- package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
- package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +8 -6
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
- package/dist/domain/jeb/jebAnalysis.js +114 -0
- package/dist/domain/jsonShape.js +63 -52
- package/dist/domain/jsonValue.js +3 -0
- package/dist/domain/managed/managedApplicationGraph.js +37 -0
- package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
- package/dist/domain/managed/managedApplicationGraphNodes.js +32 -22
- package/dist/domain/managed/managedArtifact.js +1 -0
- package/dist/domain/managed/managedInspectionEvidence.js +13 -0
- package/dist/domain/native/nativeAotPe.js +1408 -0
- package/dist/domain/native/nativeInstruction.js +21 -0
- package/dist/domain/native/nativeMetadataRecovery.js +79 -6
- package/dist/domain/native/peResources.js +94 -0
- package/dist/domain/nativeConvention.js +33 -0
- package/dist/domain/process/processCapture.js +91 -1
- package/dist/domain/process/processCaptureExample.js +24 -0
- package/dist/domain/process/processCaptureValidation.js +79 -0
- package/dist/domain/process/processScenario.js +59 -7
- package/dist/domain/propertyListKeys.js +3 -1
- package/dist/domain/referenceSourceGraph.js +25 -16
- package/dist/domain/referenceSourceImportParsing.js +6 -3
- package/dist/domain/referenceSourcePathIdentity.js +22 -0
- package/dist/domain/referenceSourceRequireBindings.js +137 -0
- package/dist/domain/webBundleAnalyzerInspection.js +14 -2
- package/dist/domain/webCaptureDiff.js +102 -4
- 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 +4 -2
- 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 +55 -24
- 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 +33 -1
- 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 +76 -4
- package/dist/ghidra/GhidraDiagnostics.js +11 -8
- package/dist/ghidra/GhidraFunctionValues.js +26 -2
- package/dist/ghidra/GhidraInstallation.js +1 -1
- package/dist/ghidra/GhidraInventoryValues.js +23 -1
- package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
- package/dist/ghidra/GhidraLauncher.js +80 -39
- 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/HopperClient.js +15 -6
- package/dist/hopper/HopperMachOImage.js +2 -0
- package/dist/hopper/HopperProvider.js +13 -2
- package/dist/ida/IdaOperationRunner.js +8 -2
- package/dist/ida/IdaProvider.js +7 -0
- package/dist/ida/IdaSessionClient.js +3 -1
- package/dist/ida/IdaWorkspace.js +4 -2
- 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/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/NativeMacOSProvider.js +91 -16
- 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 +96 -39
- 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 +28 -4
- package/dist/process/capture/ProcessCaptureLifecycle.js +350 -59
- package/dist/process/capture/ProcessCaptureProgress.js +62 -0
- package/dist/process/capture/ProcessHarness.js +194 -26
- 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/contractToolHandler.js +21 -0
- package/dist/server/createServer.js +97 -25
- 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 +4 -6
- 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/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/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 +32 -3
- package/dist/server/registerElectronTools.js +28 -10
- 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/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/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 +49 -18
- 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 +33 -5
- 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 +22 -1
|
@@ -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";
|
|
@@ -41,6 +42,9 @@ export class GhidraHeadlessLauncher {
|
|
|
41
42
|
let started;
|
|
42
43
|
try {
|
|
43
44
|
await createGhidraRuntimeDirectories(paths, platform);
|
|
45
|
+
const seedPath = this.options.analysisSeeds === undefined
|
|
46
|
+
? undefined
|
|
47
|
+
: await snapshotGhidraAnalysisSeeds(this.options.analysisSeeds, session.runtimeRoot);
|
|
44
48
|
const extensions = await snapshotGhidraExtensions(this.options.analysisExtensions ?? [], session.runtimeRoot);
|
|
45
49
|
await writeGhidraRuntimeFile(paths.descriptorPath, `${JSON.stringify({
|
|
46
50
|
transport: session.transport,
|
|
@@ -57,6 +61,7 @@ export class GhidraHeadlessLauncher {
|
|
|
57
61
|
if (isAborted(options.signal))
|
|
58
62
|
return err(new AnalysisCancelledError("open_binary"));
|
|
59
63
|
const headlessArguments = ghidraHeadlessArguments({
|
|
64
|
+
platform,
|
|
60
65
|
projectRoot: paths.projectRoot,
|
|
61
66
|
targetPath: session.targetPath,
|
|
62
67
|
bridgeScriptPath: this.options.bridgeScriptPath,
|
|
@@ -69,6 +74,10 @@ export class GhidraHeadlessLauncher {
|
|
|
69
74
|
...(this.options.dosMz === undefined
|
|
70
75
|
? {}
|
|
71
76
|
: { dosMz: this.options.dosMz }),
|
|
77
|
+
...(this.options.languageOverride === undefined
|
|
78
|
+
? {}
|
|
79
|
+
: { languageOverride: this.options.languageOverride }),
|
|
80
|
+
...(seedPath === undefined ? {} : { seedPath }),
|
|
72
81
|
});
|
|
73
82
|
const scriptCommand = ghidraHeadlessCommand({
|
|
74
83
|
environment: this.options.environment,
|
|
@@ -209,52 +218,84 @@ const cleanupStartedProcess = (started, platform) => started.cleanup !== undefin
|
|
|
209
218
|
? cleanupWindowsProcessTree(started.ownership.leaderPid)
|
|
210
219
|
: cleanupOwnedProcessGroup(started.ownership);
|
|
211
220
|
/** Build the complete read-only headless invocation in deterministic order. */
|
|
212
|
-
export const ghidraHeadlessArguments = (options) =>
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
"
|
|
216
|
-
options.
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
|
227
236
|
? [
|
|
228
237
|
"-loader",
|
|
229
|
-
"
|
|
230
|
-
"-loader-baseAddr",
|
|
231
|
-
"1000:0100",
|
|
238
|
+
"MzLoader",
|
|
232
239
|
"-processor",
|
|
233
240
|
"x86:LE:16:Real Mode",
|
|
234
241
|
"-cspec",
|
|
235
242
|
"default",
|
|
236
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
|
+
]
|
|
237
277
|
: []),
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
];
|
|
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
|
+
};
|
|
258
299
|
const ghidraRuntimePaths = (runtimeRoot) => ({
|
|
259
300
|
projectRoot: join(runtimeRoot, "project"),
|
|
260
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 {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { hasWindowsNativeAuthority, windowsNativeAuthorityUnavailableReason, } from "../process/WindowsAuthority.js";
|
|
2
2
|
import { GHIDRA_FUNCTION_OPERATIONS } from "./GhidraFunctionValues.js";
|
|
3
3
|
import { GHIDRA_INVENTORY_OPERATIONS } from "./GhidraInventoryValues.js";
|
|
4
|
+
import { GHIDRA_MUTATING_OPERATIONS } from "./GhidraSessionValues.js";
|
|
4
5
|
/** Public identity committed by every Ghidra-backed observation. */
|
|
5
6
|
export const GHIDRA_PROVIDER_IDENTITY = Object.freeze({
|
|
6
7
|
id: "ghidra",
|
|
@@ -20,10 +21,12 @@ export const healthLimitations = Object.freeze([
|
|
|
20
21
|
]);
|
|
21
22
|
/** Additional limitations applied to the experimental Windows x64 P0 boundary. */
|
|
22
23
|
export const windowsP0Limitations = Object.freeze([
|
|
23
|
-
"Windows Ghidra P0 accepts approved native x86 and x86-64 PE applications
|
|
24
|
+
"Windows Ghidra P0 accepts approved native x86 and x86-64 PE applications and DLLs; managed, hostile, sensitive, and mutable-path targets are unsupported.",
|
|
24
25
|
"The Windows bridge uses authenticated IPv4 loopback because Node path-based IPC does not expose Java AF_UNIX sockets; the endpoint file contains no bearer token.",
|
|
25
26
|
"Windows sessions require the matching packaged Windows x64 native addon, local NTFS targets and runtimes, and Windows 10 or later. Native handles enforce path admission, private DACLs, and Job Object ownership automatically.",
|
|
26
27
|
]);
|
|
28
|
+
const stringInventoryLimitation = "Only Ghidra-defined string Data is observed; packed or undefined string bytes may be absent. Completeness applies to that inventory, and an empty search does not establish that text is absent from the artifact. If an address is known, use read_bytes and xrefs to inspect bytes and references.";
|
|
29
|
+
const searchLimitation = "Regex mode uses Java Pattern semantics. Matcher or compiler stack exhaustion returns a resource constraint without closing the session; literal mode avoids regex recursion and returns complete matching values.";
|
|
27
30
|
/** Limitation text for one admitted operation, including the common base. */
|
|
28
31
|
export const limitationsFor = (operation) => {
|
|
29
32
|
const common = [
|
|
@@ -38,6 +41,14 @@ export const limitationsFor = (operation) => {
|
|
|
38
41
|
"Annotation text rejects NUL and unpaired Unicode surrogates before mutation, with the field and UTF-16 index in the error. Supported Unicode and line endings are preserved.",
|
|
39
42
|
"Metadata edits invalidate immutable analysis snapshots and are discarded on close. CLI returns the updated dossier before session cleanup; this is not a saved Ghidra project.",
|
|
40
43
|
];
|
|
44
|
+
case "set_address_name":
|
|
45
|
+
case "set_addresses_names":
|
|
46
|
+
return [
|
|
47
|
+
...common,
|
|
48
|
+
"Names use Ghidra USER_DEFINED source. A local function entry renames that function; any other mapped address receives a new or renamed primary label. Existing symbols retain their namespace and accept leaf names or qualified names within that namespace; qualified readback can be reused without adding namespace prefixes. Readback compares the primary symbol name.",
|
|
49
|
+
"set_addresses_names applies each address in its own transaction and reports per-address success; invalid names, unmapped addresses, and readback mismatches roll back only that address.",
|
|
50
|
+
"Metadata edits invalidate immutable analysis snapshots and are discarded on close; this is not a saved Ghidra project.",
|
|
51
|
+
];
|
|
41
52
|
case "inspect_native_load_image":
|
|
42
53
|
return [
|
|
43
54
|
...common,
|
|
@@ -72,7 +83,8 @@ export const limitationsFor = (operation) => {
|
|
|
72
83
|
case "list_strings":
|
|
73
84
|
return [
|
|
74
85
|
...common,
|
|
75
|
-
|
|
86
|
+
stringInventoryLimitation,
|
|
87
|
+
"Charset is reported, while a non-missing terminator cannot distinguish a present terminator from a fixed or Pascal layout.",
|
|
76
88
|
];
|
|
77
89
|
case "resolve_containing_procedure":
|
|
78
90
|
return [
|
|
@@ -85,11 +97,9 @@ export const limitationsFor = (operation) => {
|
|
|
85
97
|
"Memory-block end addresses are exclusive; permissions come from Ghidra MemoryBlock flags rather than inference from section names.",
|
|
86
98
|
];
|
|
87
99
|
case "search_procedures":
|
|
100
|
+
return [...common, searchLimitation];
|
|
88
101
|
case "search_strings":
|
|
89
|
-
return [
|
|
90
|
-
...common,
|
|
91
|
-
"Regex mode uses Java Pattern semantics. Matcher or compiler stack exhaustion returns a resource constraint without closing the session; literal mode avoids regex recursion and returns complete matching values.",
|
|
92
|
-
];
|
|
102
|
+
return [...common, stringInventoryLimitation, searchLimitation];
|
|
93
103
|
case "procedure_pseudo_code":
|
|
94
104
|
return [
|
|
95
105
|
...common,
|
|
@@ -148,12 +158,12 @@ export const CAPABILITIES = Object.freeze(GHIDRA_OPERATIONS.map((operation) => {
|
|
|
148
158
|
reason: null,
|
|
149
159
|
// Project writes are private import machinery. Analysis reads are bound
|
|
150
160
|
// to the artifact/profile; session annotations disable snapshot replay.
|
|
151
|
-
...(operation
|
|
161
|
+
...(GHIDRA_MUTATING_OPERATIONS.has(operation) ||
|
|
152
162
|
operation === "list_documents"
|
|
153
163
|
? {}
|
|
154
164
|
: { cachePolicy: "snapshot" }),
|
|
155
165
|
effects: Object.freeze({
|
|
156
|
-
mutatesArtifact: operation
|
|
166
|
+
mutatesArtifact: GHIDRA_MUTATING_OPERATIONS.has(operation),
|
|
157
167
|
launchesProcess: true,
|
|
158
168
|
mayShowUi: false,
|
|
159
169
|
mayAccessNetwork: false,
|