rea-agents 5.0.0 → 6.1.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 +168 -655
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +173 -47
- package/bridge/hopper_bridge.py +310 -128
- package/bridge/mitmproxy/capture.py +208 -0
- package/bridge/native/rea_lldb_tracer.py +839 -0
- package/bridge/process/ProcessRunTokenReader.swift +297 -0
- package/bridge/process/ProcessRunTokenReaderMain.swift +35 -0
- package/bridge/pwndbg/core_context.py +101 -0
- package/bridge/pwndbg/launch.py +39 -0
- package/bridge/pwndbg/launch_impl.py +34 -0
- package/bridge/pwntools/decoder_runtime.py +59 -0
- package/bridge/pwntools/layout.py +39 -0
- package/bridge/pwntools/layout_impl.py +309 -0
- package/bridge/pwntools/recorded_crash.py +39 -0
- package/bridge/pwntools/recorded_crash_impl.py +147 -0
- package/dist/android/JadxConfiguration.js +196 -33
- package/dist/android/JadxMcpTransport.js +4 -0
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +20 -2
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +27 -3
- package/dist/application/ClientConfigurationDocument.js +871 -6
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +97 -33
- package/dist/application/Doctor.js +4 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +13 -11
- package/dist/application/EvidenceBundleFiles.js +24 -12
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +3 -2
- package/dist/application/JsonFiles.js +50 -28
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +5 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/Setup.js +13 -1
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +5 -2
- package/dist/application/SetupPlan.js +5 -3
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +4 -3
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateRuntime.js +46 -25
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCapturePort.js +1 -0
- package/dist/application/WebNetworkCaptureService.js +134 -0
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +2 -2
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WindowsCapabilities.js +1 -1
- package/dist/application/WorkflowEvidence.js +82 -0
- package/dist/application/binary/AnalysisProviderEvaluation.js +21 -5
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -0
- package/dist/application/binary/AnalysisSnapshotCache.js +52 -12
- package/dist/application/binary/BinarySession.js +131 -76
- package/dist/application/binary/BinarySessionOpen.js +19 -6
- package/dist/application/binary/BinarySessionRecords.js +45 -3
- package/dist/application/binary/BinarySessionStatus.js +17 -1
- package/dist/application/binary/CompositeProvider.js +13 -0
- package/dist/application/binary/LazyAnalysisProvider.js +3 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutPort.js +1 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +59 -0
- package/dist/application/binaryDiagnostics/RecordedCrashPort.js +1 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +62 -0
- package/dist/application/evm/EvmInterfacePort.js +1 -0
- package/dist/application/evm/EvmInterfaceService.js +64 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +25 -5
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +34 -14
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +47 -27
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +39 -7
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +26 -2
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +80 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +33 -12
- package/dist/application/javascript/JavaScriptModuleRelationships.js +37 -8
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -1
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +7 -7
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +149 -72
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +14 -15
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +41 -1
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +7 -7
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -9
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +118 -12
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +27 -5
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +7 -4
- package/dist/application/managed/ManagedNativeVerificationService.js +4 -3
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/{ProcessCli.js → process/ProcessCli.js} +23 -15
- package/dist/application/{ProcessEvidence.js → process/ProcessEvidence.js} +8 -7
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +42 -5
- package/dist/artifacts/ArtifactProviderMetadata.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +98 -14
- package/dist/artifacts/NativeDmgArtifactReader.js +13 -6
- package/dist/artifacts/ZipArtifactReader.js +3 -0
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +22 -3
- package/dist/artifacts/apple/DylibResolutionReader.js +259 -0
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +36 -22
- package/dist/artifacts/apple/MachoLoadCommandReader.js +355 -0
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/{application → artifacts/extraction}/ArtifactExtraction.js +10 -10
- package/dist/{application → artifacts/inventory}/ArtifactGraphConstruction.js +16 -11
- package/dist/{application → artifacts/inventory}/ArtifactInventory.js +4 -4
- package/dist/{application/ArtifactInventory → artifacts/inventory}/classify.js +2 -2
- package/dist/{application/ArtifactInventory → artifacts/inventory}/reader.js +5 -5
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanCanonical.js +14 -17
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanReader.js +5 -5
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/artifacts/readStableArtifact.js +20 -4
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +165 -12
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +34 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/PlaywrightElectronActiveActions.js +32 -23
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +130 -122
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/history/CaptureFailures.js +137 -0
- package/dist/browser/history/CaptureFormatError.js +10 -0
- package/dist/browser/history/CaptureRedaction.js +65 -0
- package/dist/browser/history/CaptureRelease.js +17 -0
- package/dist/browser/history/HarCapture.js +165 -0
- package/dist/browser/history/HarCaptureAdapter.js +20 -0
- package/dist/browser/history/HarCaptureProcess.js +57 -0
- package/dist/browser/history/HarJson.js +92 -0
- package/dist/browser/history/HarSchema.js +72 -0
- package/dist/browser/history/HistoricalCaptureDecoder.js +188 -0
- package/dist/browser/history/HistoricalCaptureFormatAdapter.js +1 -0
- package/dist/browser/history/MitmproxyCaptureAdapter.js +42 -0
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +26 -1
- package/dist/cli/binaryDiagnosticsCommands.js +39 -0
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +78 -20
- package/dist/cli/electronCommands.js +21 -13
- package/dist/cli/evmCommands.js +24 -0
- package/dist/cli/firmwareCommands.js +6 -3
- package/dist/cli/javascriptApplicationAnalysis.js +20 -3
- package/dist/cli/jsonOutput.js +38 -0
- package/dist/cli/nativeCallCommands.js +34 -0
- package/dist/cli/processCommands.js +1 -1
- package/dist/cli/streamedJsonOutput.js +56 -0
- package/dist/cli/utilityCommands.js +2 -0
- package/dist/cli/webNetworkCaptureCommands.js +40 -0
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +11 -4
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +6 -1
- package/dist/cliJsonInput.js +35 -1
- package/dist/cliOutput.js +21 -6
- package/dist/composition/binaryDiagnostics.js +8 -0
- package/dist/composition/evm.js +4 -0
- package/dist/composition/webNetworkCaptures.js +6 -0
- package/dist/config/environment.js +4 -0
- package/dist/config/ghidraStartupTimeout.js +17 -0
- package/dist/config/mcpResponseBudget.js +22 -0
- package/dist/config/parseConfig.js +2 -1
- package/dist/contracts/artifactToolContracts.js +6 -0
- package/dist/contracts/browserCaptureToolInputSchema.js +43 -0
- package/dist/contracts/browserToolContracts.js +4 -3
- package/dist/contracts/enhancedInputs.js +5 -3
- package/dist/contracts/enhancedToolContracts.js +3 -3
- package/dist/contracts/errorSchemas.js +8 -1
- package/dist/contracts/evm/evmToolContracts.js +20 -0
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/investigationExamples.js +2 -2
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +8 -6
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +42 -0
- package/dist/contracts/native/nativeToolContracts.js +21 -3
- package/dist/contracts/officialToolContracts.js +26 -24
- package/dist/contracts/process/processCaptureExample.js +2 -0
- package/dist/contracts/promptContracts.js +3 -3
- package/dist/contracts/sessionLifecycleInputs.js +18 -5
- package/dist/contracts/sessionStatusContract.js +8 -2
- package/dist/contracts/sessionToolContracts.js +8 -3
- package/dist/contracts/sessionToolSchemas.js +8 -4
- package/dist/contracts/toolContractExamples.js +1 -2
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +30 -1
- package/dist/contracts/toolOutputSchemaGroups.js +33 -28
- package/dist/contracts/toolOutputSchemaPrimitives.js +19 -1
- package/dist/contracts/toolSchemaMetadata.js +69 -10
- package/dist/contracts/webNetworkCaptureToolContracts.js +24 -0
- package/dist/domain/analysisErrorBase.js +22 -2
- package/dist/domain/analysisErrorCore.js +61 -5
- package/dist/domain/analysisErrorPresentation.js +95 -12
- package/dist/domain/analysisErrorProjection.js +148 -19
- package/dist/domain/analysisSnapshot.js +166 -2
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +17 -9
- package/dist/domain/apple/appleApplication.js +41 -14
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dyldPaths.js +81 -0
- package/dist/domain/apple/dylibResolution.js +478 -0
- package/dist/domain/apple/dylibResolutionFindings.js +77 -0
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -13
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +9 -1
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +19 -24
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserObservation.js +1 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +13 -0
- package/dist/domain/browserScenarioValues.js +5 -2
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPathSchemas.js +1 -1
- package/dist/domain/canonicalDigest.js +13 -1
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/comparisonStatus.js +2 -30
- package/dist/domain/configurationErrors.js +1 -1
- package/dist/domain/conformanceTrustGate.js +0 -16
- package/dist/domain/evidence.js +78 -11
- package/dist/domain/evidenceBundle.js +42 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/evm/evmInterface.js +63 -0
- package/dist/domain/explicitSensitiveFailure.js +108 -0
- package/dist/domain/explicitSensitiveValues.js +10 -0
- package/dist/domain/firmware/firmwareAnalysis.js +10 -4
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +37 -6
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/htmlArtifactReferences.js +40 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationGraph.js +13 -0
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +21 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +0 -10
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +97 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +22 -5
- package/dist/domain/javascript/javascriptSemanticGraph.js +34 -5
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +25 -17
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +83 -11
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +14 -4
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -16
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +91 -3
- package/dist/domain/localPath.js +8 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -9
- package/dist/domain/native/binaryLayout.js +357 -0
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeCallObservation.js +186 -0
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/objcSwiftMetadata.js +0 -39
- package/dist/domain/native/recordedCrash.js +266 -0
- package/dist/domain/native/recordedCrashNoteCoverage.js +73 -0
- package/dist/domain/{processCapture.js → process/processCapture.js} +143 -2
- package/dist/domain/{processCaptureExample.js → process/processCaptureExample.js} +5 -0
- package/dist/domain/process/processCaptureParsing.js +54 -0
- package/dist/domain/{processCaptureValidation.js → process/processCaptureValidation.js} +18 -2
- package/dist/domain/{processComparison.js → process/processComparison.js} +39 -5
- package/dist/domain/{processObservation.js → process/processObservation.js} +1 -1
- package/dist/domain/{processScenario.js → process/processScenario.js} +11 -10
- package/dist/domain/{processTraceSpecification.js → process/processTraceSpecification.js} +1 -1
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +1 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/providerSelectionError.js +4 -2
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +3 -3
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +9 -46
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +1 -0
- package/dist/domain/webNetworkCapture.js +118 -0
- package/dist/domain/webNetworkCaptureCoordinates.js +58 -0
- package/dist/domain/webRuntime.js +19 -5
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedExceptionRegionValidation.js +41 -0
- package/dist/dotnet/ManagedMemberInspector.js +4 -2
- package/dist/dotnet/ManagedMemberInspectorCore.js +38 -32
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +23 -7
- package/dist/dotnet/ManagedMemberRows.js +14 -3
- package/dist/dotnet/ManagedMetadataHeaps.js +20 -2
- package/dist/dotnet/ManagedMetadataInventory.js +38 -28
- package/dist/dotnet/ManagedMetadataInventoryRows.js +24 -10
- package/dist/dotnet/ManagedMethodBodyReader.js +7 -1
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +15 -3
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +3 -1
- package/dist/dotnet/ManagedPeReader.js +11 -0
- package/dist/evm/EvmBytecodeCarrier.js +21 -0
- package/dist/evm/EvmWorkerLimits.js +40 -0
- package/dist/evm/EvmoleFailures.js +126 -0
- package/dist/evm/EvmoleInterfaceAdapter.js +53 -0
- package/dist/evm/EvmoleInterfaceProvider.js +273 -0
- package/dist/evm/EvmoleInterfaceWorker.js +87 -0
- package/dist/evm/EvmoleRelease.js +16 -0
- package/dist/firmware/FirmwareCommand.js +1 -0
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +5 -0
- package/dist/ghidra/GhidraClient.js +47 -14
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraFunctionValues.js +10 -7
- package/dist/ghidra/GhidraInstallation.js +18 -21
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +62 -0
- package/dist/ghidra/GhidraLauncher.js +34 -16
- package/dist/ghidra/GhidraProvider.js +2 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +15 -3
- package/dist/ghidra/GhidraProviderClient.js +23 -12
- package/dist/ghidra/GhidraSessionError.js +11 -7
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/hopper/BridgeLauncher.js +33 -11
- package/dist/hopper/HopperAnalysisProfile.js +62 -4
- package/dist/hopper/HopperCleanup.js +15 -3
- package/dist/hopper/HopperClient.js +222 -14
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +196 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +63 -9
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +137 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +3 -2
- package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +8 -3
- package/dist/inspector/V8InspectorProvider.js +47 -11
- package/dist/javascript/recovery/WakaruCommand.js +3 -0
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +17 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +32 -16
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +82 -84
- package/dist/native/LldbCallTracer.js +541 -0
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +194 -0
- package/dist/native/NativeMacOSProvider.js +117 -20
- package/dist/native/NativeMacOSProviderMetadata.js +8 -3
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +180 -0
- package/dist/native/pwntools/PwntoolsDecoder.js +203 -0
- package/dist/native/pwntools/PwntoolsFailures.js +180 -0
- package/dist/native/pwntools/PwntoolsLayoutProvider.js +36 -0
- package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +75 -0
- package/dist/native/pwntools/PwntoolsRelease.js +19 -0
- package/dist/native/pwntools/PwntoolsResourceLimits.js +76 -0
- package/dist/native/pwntools/RecordedCrashSourceBindings.js +46 -0
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +103 -0
- package/dist/process/DarwinProcessRunTokenReader.js +293 -0
- package/dist/process/ExecFileOutput.js +20 -0
- package/dist/process/OwnedCommand.js +118 -0
- package/dist/process/ProcessOwnership.js +431 -51
- package/dist/process/ProcessOwnershipObservation.js +209 -27
- package/dist/process/ProviderProcess.js +68 -10
- package/dist/{application → process/capture}/ProcessCaptureCapability.js +15 -0
- package/dist/{application → process/capture}/ProcessCaptureError.js +18 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +681 -0
- package/dist/{application → process/capture}/ProcessHarness.js +195 -29
- package/dist/{application → process/capture}/ProcessSampling.js +2 -2
- package/dist/server/EvidenceMcpServer.js +146 -0
- package/dist/server/createServer.js +37 -8
- package/dist/server/promptCompletion.js +10 -3
- package/dist/server/registerAndroidTools.js +2 -4
- package/dist/server/registerApplicationTools/helpers.js +2 -4
- package/dist/server/registerArtifactComparisonTool.js +11 -7
- package/dist/server/registerBinaryDiagnosticsTools.js +15 -0
- package/dist/server/registerBrowserScenarioTool.js +2 -4
- package/dist/server/registerBrowserTools.js +2 -4
- package/dist/server/registerBundleComparisonTool.js +2 -3
- package/dist/server/registerCloseLifecycleTool.js +8 -18
- package/dist/server/registerElectronTools.js +2 -4
- package/dist/server/registerEnhancedTools.js +18 -59
- package/dist/server/registerEvidenceTools.js +3 -5
- package/dist/server/registerEvmTools.js +15 -0
- package/dist/server/registerFirmwareTools.js +2 -4
- package/dist/server/registerFunctionComparisonTool.js +10 -6
- package/dist/server/registerInvestigationTools.js +7 -7
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -4
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -4
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +2 -4
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +2 -4
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -4
- package/dist/server/registerOfficialTools.js +2 -4
- package/dist/server/registerProcessComparisonTool.js +72 -46
- package/dist/server/registerRecordedCrashTools.js +15 -0
- package/dist/server/registerSessionRecordTools.js +5 -6
- package/dist/server/registerSessionStatusTool.js +17 -3
- package/dist/server/registerSessionTools.js +13 -5
- package/dist/server/registerWebModuleTool.js +2 -4
- package/dist/server/registerWebNetworkCaptureTool.js +26 -0
- package/dist/server/registerWebRuntimeTools.js +3 -7
- package/dist/server/registerWebScriptTool.js +2 -4
- package/dist/server/registerWebSourceLocationTool.js +2 -4
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +3 -1
- package/dist/server/sessionToolPolicies.js +1 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +63 -11
- package/dist/server/toolResultEncoding.js +33 -0
- package/install.sh +1 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +42 -9
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +11 -3
- package/skills/reverse-engineer-anything/SKILL.md +32 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +8 -1
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +29 -0
- package/third_party/README.md +60 -0
- package/third_party/evmole/LICENSE +21 -0
- package/third_party/evmole/README.md +22 -0
- package/third_party/pwndbg/LICENSE.md +21 -0
- package/third_party/pwndbg/README.md +23 -0
- package/third_party/pwntools/README.md +40 -0
- package/dist/application/AuthorizedArtifactInventory.js +0 -7
- package/dist/application/ProcessCaptureLifecycle.js +0 -299
- package/dist/application/StoreFileLock.js +0 -124
- package/dist/contracts/processCaptureExample.js +0 -2
- package/dist/domain/bytecodeProvider.js +0 -178
- package/dist/domain/customProtocolCapture.js +0 -137
- package/dist/domain/eventProcessTree.js +0 -225
- package/dist/domain/mobileApplicationInvestigation.js +0 -159
- package/dist/domain/packageAnalysis.js +0 -123
- package/dist/domain/peInspection.js +0 -197
- package/dist/domain/processCaptureParsing.js +0 -21
- package/dist/domain/protocolCapture.js +0 -217
- package/dist/domain/runtimeIdentification.js +0 -212
- package/dist/generatedMcpToolCatalog.js +0 -37
- package/dist/ghidra/GhidraDefaults.js +0 -2
- /package/dist/application/{ArtifactExtractionDestination.js → artifacts/ArtifactExtractionDestination.js} +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/policy.js +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/types.js +0 -0
- /package/dist/domain/{processEvidenceProvider.js → process/processEvidenceProvider.js} +0 -0
- /package/dist/domain/{processTraceComparison.js → process/processTraceComparison.js} +0 -0
- /package/dist/domain/{processTraceDimensionProjection.js → process/processTraceDimensionProjection.js} +0 -0
- /package/dist/domain/{processTraceEvaluation.js → process/processTraceEvaluation.js} +0 -0
- /package/dist/{application → process/capture}/FilesystemSnapshot.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureEnvironment.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureJournal.js +0 -0
- /package/dist/{application → process/capture}/ProcessFilesystemEffects.js +0 -0
- /package/dist/{application → process/capture}/ProcessNormalization.js +0 -0
- /package/dist/{application → process/capture}/ProcessScenarioRuntimeValidation.js +0 -0
- /package/dist/{application → process/capture}/ProcessTimer.js +0 -0
- /package/dist/{application → process/capture}/TerminalRenderer.js +0 -0
|
@@ -16,9 +16,19 @@ const ipcEventKinds = new Set([
|
|
|
16
16
|
"ipc-renderer-post-message",
|
|
17
17
|
]);
|
|
18
18
|
const events = [];
|
|
19
|
+
// Budget serialized data and estimated retained object/array storage together.
|
|
20
|
+
const retentionBudgetBytes = 16 * 1024 * 1024;
|
|
21
|
+
const snapshotEnvelopeReserveBytes = 1024;
|
|
22
|
+
let estimatedRetainedBytes = 0;
|
|
23
|
+
let serializedBytes = 0;
|
|
19
24
|
let observed = 0;
|
|
20
25
|
let observedIpc = 0;
|
|
21
26
|
let observedRuntime = 0;
|
|
27
|
+
let dropped = 0;
|
|
28
|
+
let droppedIpc = 0;
|
|
29
|
+
let droppedRuntime = 0;
|
|
30
|
+
const droppedFamilies = new Map();
|
|
31
|
+
const droppedRoles = new Map();
|
|
22
32
|
let sequence = 0;
|
|
23
33
|
let correlationSequence = 0;
|
|
24
34
|
|
|
@@ -43,6 +53,73 @@ const shape = (value, depth = 0) => {
|
|
|
43
53
|
}
|
|
44
54
|
};
|
|
45
55
|
|
|
56
|
+
// Measure JSON strings without allocating an encoded copy of a caller value.
|
|
57
|
+
const jsonStringBytes = (value) => {
|
|
58
|
+
let bytes = 2;
|
|
59
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
60
|
+
const code = value.charCodeAt(index);
|
|
61
|
+
if (code === 0x22 || code === 0x5c) bytes += 2;
|
|
62
|
+
else if (
|
|
63
|
+
code === 0x08 ||
|
|
64
|
+
code === 0x09 ||
|
|
65
|
+
code === 0x0a ||
|
|
66
|
+
code === 0x0c ||
|
|
67
|
+
code === 0x0d
|
|
68
|
+
)
|
|
69
|
+
bytes += 2;
|
|
70
|
+
else if (code <= 0x1f) bytes += 6;
|
|
71
|
+
else if (code >= 0xd800 && code <= 0xdbff) {
|
|
72
|
+
const next = value.charCodeAt(index + 1);
|
|
73
|
+
if (next >= 0xdc00 && next <= 0xdfff) {
|
|
74
|
+
bytes += 4;
|
|
75
|
+
index += 1;
|
|
76
|
+
} else bytes += 6;
|
|
77
|
+
} else if (code >= 0xdc00 && code <= 0xdfff) bytes += 6;
|
|
78
|
+
else if (code <= 0x7f) bytes += 1;
|
|
79
|
+
else if (code <= 0x7ff) bytes += 2;
|
|
80
|
+
else bytes += 3;
|
|
81
|
+
if (bytes > retentionBudgetBytes) return bytes;
|
|
82
|
+
}
|
|
83
|
+
return bytes;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const jsonScalarBytes = (value) => {
|
|
87
|
+
if (value === null) return 4;
|
|
88
|
+
if (typeof value === "string") return jsonStringBytes(value);
|
|
89
|
+
if (typeof value === "boolean") return value ? 4 : 5;
|
|
90
|
+
return String(value).length;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const eventFamily = (kind, processTypeValue) => {
|
|
94
|
+
if (kind === "preload" && processTypeValue === "main")
|
|
95
|
+
return "preload-configuration";
|
|
96
|
+
if (kind.startsWith("ipc-renderer"))
|
|
97
|
+
return processTypeValue === "renderer" ? "renderer-ipc" : "ipc";
|
|
98
|
+
return ipcEventKinds.has(kind) ? "ipc" : kind;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const noteDropped = (kind, processTypeValue, isIpc) => {
|
|
102
|
+
dropped += 1;
|
|
103
|
+
if (isIpc) droppedIpc += 1;
|
|
104
|
+
else droppedRuntime += 1;
|
|
105
|
+
const family = eventFamily(kind, processTypeValue);
|
|
106
|
+
droppedFamilies.set(family, (droppedFamilies.get(family) ?? 0) + 1);
|
|
107
|
+
if (typeof processTypeValue === "string")
|
|
108
|
+
droppedRoles.set(
|
|
109
|
+
processTypeValue,
|
|
110
|
+
(droppedRoles.get(processTypeValue) ?? 0) + 1,
|
|
111
|
+
);
|
|
112
|
+
if (kind === "window-lifecycle")
|
|
113
|
+
droppedRoles.set("window", (droppedRoles.get("window") ?? 0) + 1);
|
|
114
|
+
if (kind === "web-contents-lifecycle" || kind === "navigation")
|
|
115
|
+
droppedRoles.set(
|
|
116
|
+
"web_contents",
|
|
117
|
+
(droppedRoles.get("web_contents") ?? 0) + 1,
|
|
118
|
+
);
|
|
119
|
+
if (kind === "preload" && processTypeValue === "preload")
|
|
120
|
+
droppedRoles.set("preload", (droppedRoles.get("preload") ?? 0) + 1);
|
|
121
|
+
};
|
|
122
|
+
|
|
46
123
|
const isAllowedNavigation = (value) => {
|
|
47
124
|
if (typeof value !== "string") return true;
|
|
48
125
|
try {
|
|
@@ -83,7 +160,8 @@ const frameIdentity = (event) => {
|
|
|
83
160
|
|
|
84
161
|
const record = (event) => {
|
|
85
162
|
observed += 1;
|
|
86
|
-
|
|
163
|
+
const isIpc = ipcEventKinds.has(event.kind);
|
|
164
|
+
if (isIpc) observedIpc += 1;
|
|
87
165
|
else observedRuntime += 1;
|
|
88
166
|
const raw = {
|
|
89
167
|
sequence: ++sequence,
|
|
@@ -109,10 +187,15 @@ const record = (event) => {
|
|
|
109
187
|
error: false,
|
|
110
188
|
...event,
|
|
111
189
|
};
|
|
112
|
-
const
|
|
190
|
+
const shapeGroups = Array.isArray(raw.argument_shape_value_groups)
|
|
191
|
+
? raw.argument_shape_value_groups.filter(Array.isArray)
|
|
192
|
+
: Array.isArray(raw.argument_shape_values)
|
|
193
|
+
? [raw.argument_shape_values]
|
|
194
|
+
: [];
|
|
195
|
+
const existingShapes = Array.isArray(raw.argument_shapes)
|
|
113
196
|
? raw.argument_shapes
|
|
114
197
|
: [];
|
|
115
|
-
|
|
198
|
+
const retainedEvent = {
|
|
116
199
|
...raw,
|
|
117
200
|
correlation_id: raw.correlation_id,
|
|
118
201
|
event: typeof raw.event === "string" ? raw.event : null,
|
|
@@ -121,9 +204,7 @@ const record = (event) => {
|
|
|
121
204
|
receiver: typeof raw.receiver === "string" ? raw.receiver : null,
|
|
122
205
|
frame: typeof raw.frame === "string" ? raw.frame : null,
|
|
123
206
|
target: typeof raw.target === "string" ? raw.target : null,
|
|
124
|
-
argument_shapes:
|
|
125
|
-
typeof value === "string" ? value : "unknown",
|
|
126
|
-
),
|
|
207
|
+
argument_shapes: [],
|
|
127
208
|
result_shape:
|
|
128
209
|
typeof raw.result_shape === "string" ? raw.result_shape : null,
|
|
129
210
|
process_type:
|
|
@@ -132,8 +213,91 @@ const record = (event) => {
|
|
|
132
213
|
typeof raw.artifact_path === "string" ? raw.artifact_path : null,
|
|
133
214
|
artifact_sha256:
|
|
134
215
|
typeof raw.artifact_sha256 === "string" ? raw.artifact_sha256 : null,
|
|
135
|
-
}
|
|
136
|
-
|
|
216
|
+
};
|
|
217
|
+
delete retainedEvent.argument_shape_values;
|
|
218
|
+
delete retainedEvent.argument_shape_value_groups;
|
|
219
|
+
|
|
220
|
+
// All event values are JSON scalars except argument_shapes. Measure them
|
|
221
|
+
// incrementally so large channels, paths, or shape lists never require a
|
|
222
|
+
// full JSON.stringify temporary allocation before the budget decision.
|
|
223
|
+
let eventBytes = 2;
|
|
224
|
+
let argumentShapeCount = 0;
|
|
225
|
+
const eventKeys = Object.keys(retainedEvent);
|
|
226
|
+
for (let index = 0; index < eventKeys.length; index += 1) {
|
|
227
|
+
const key = eventKeys[index];
|
|
228
|
+
const value = retainedEvent[key];
|
|
229
|
+
if (index > 0) eventBytes += 1;
|
|
230
|
+
eventBytes += jsonStringBytes(key) + 1;
|
|
231
|
+
if (key === "argument_shapes") {
|
|
232
|
+
eventBytes += 2;
|
|
233
|
+
let shapeOverflow = false;
|
|
234
|
+
const countShape = (argument) => {
|
|
235
|
+
const encodedShapeBytes = jsonStringBytes(shape(argument));
|
|
236
|
+
eventBytes += encodedShapeBytes + (argumentShapeCount === 0 ? 0 : 1);
|
|
237
|
+
argumentShapeCount += 1;
|
|
238
|
+
shapeOverflow =
|
|
239
|
+
eventBytes + estimatedRetainedBytes + snapshotEnvelopeReserveBytes >
|
|
240
|
+
retentionBudgetBytes;
|
|
241
|
+
};
|
|
242
|
+
for (const group of shapeGroups)
|
|
243
|
+
for (const argument of group) {
|
|
244
|
+
countShape(argument);
|
|
245
|
+
if (shapeOverflow) break;
|
|
246
|
+
}
|
|
247
|
+
if (shapeOverflow) {
|
|
248
|
+
noteDropped(raw.kind, retainedEvent.process_type, isIpc);
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
for (const valueShape of existingShapes)
|
|
252
|
+
if (!shapeOverflow) {
|
|
253
|
+
eventBytes +=
|
|
254
|
+
jsonStringBytes(
|
|
255
|
+
typeof valueShape === "string" ? valueShape : "unknown",
|
|
256
|
+
) + (argumentShapeCount++ === 0 ? 0 : 1);
|
|
257
|
+
shapeOverflow =
|
|
258
|
+
eventBytes + estimatedRetainedBytes + snapshotEnvelopeReserveBytes >
|
|
259
|
+
retentionBudgetBytes;
|
|
260
|
+
}
|
|
261
|
+
if (shapeOverflow) {
|
|
262
|
+
noteDropped(raw.kind, retainedEvent.process_type, isIpc);
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
} else eventBytes += jsonScalarBytes(value);
|
|
266
|
+
if (
|
|
267
|
+
eventBytes + estimatedRetainedBytes + snapshotEnvelopeReserveBytes >
|
|
268
|
+
retentionBudgetBytes
|
|
269
|
+
) {
|
|
270
|
+
noteDropped(raw.kind, retainedEvent.process_type, isIpc);
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Reserve room for the only fields mutated after recording: result_shape and
|
|
275
|
+
// error. The shape vocabulary's longest value is "undefined".
|
|
276
|
+
const reservedMutationBytes = retainedEvent.result_shape === null ? 7 : 0;
|
|
277
|
+
// Include one byte for the event-array separator and reserve space for the
|
|
278
|
+
// snapshot's counters and JSON delimiters.
|
|
279
|
+
// One retained event, one defensive snapshot copy, and up to two serialized
|
|
280
|
+
// result views (timeline plus IPC), with per-object and per-array-slot costs.
|
|
281
|
+
const eventEstimateBytes = eventBytes * 3 + 512 + argumentShapeCount * 16;
|
|
282
|
+
const retainedEventBytes = eventEstimateBytes + reservedMutationBytes + 1;
|
|
283
|
+
if (
|
|
284
|
+
estimatedRetainedBytes + retainedEventBytes + snapshotEnvelopeReserveBytes >
|
|
285
|
+
retentionBudgetBytes
|
|
286
|
+
) {
|
|
287
|
+
noteDropped(raw.kind, retainedEvent.process_type, isIpc);
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
for (const group of shapeGroups)
|
|
291
|
+
for (const argument of group)
|
|
292
|
+
retainedEvent.argument_shapes.push(shape(argument));
|
|
293
|
+
for (const valueShape of existingShapes)
|
|
294
|
+
retainedEvent.argument_shapes.push(
|
|
295
|
+
typeof valueShape === "string" ? valueShape : "unknown",
|
|
296
|
+
);
|
|
297
|
+
events.push(retainedEvent);
|
|
298
|
+
estimatedRetainedBytes += retainedEventBytes;
|
|
299
|
+
serializedBytes += eventBytes + reservedMutationBytes + 1;
|
|
300
|
+
return retainedEvent;
|
|
137
301
|
};
|
|
138
302
|
|
|
139
303
|
const recordRuntime = (kind, event, phase, details = {}) =>
|
|
@@ -145,7 +309,7 @@ const recordIpc = (kind, channel, args, details = {}) =>
|
|
|
145
309
|
return record({
|
|
146
310
|
kind,
|
|
147
311
|
channel: typeof channel === "string" ? channel : null,
|
|
148
|
-
|
|
312
|
+
argument_shape_values: values,
|
|
149
313
|
...details,
|
|
150
314
|
});
|
|
151
315
|
})();
|
|
@@ -222,7 +386,7 @@ const patchNavigationMethods = (webContents, contentsId) => {
|
|
|
222
386
|
webContents[method] = function patchedNavigation(...args) {
|
|
223
387
|
recordRuntime("navigation", method, "attempted", {
|
|
224
388
|
target: contentsId,
|
|
225
|
-
|
|
389
|
+
argument_shape_values: args,
|
|
226
390
|
});
|
|
227
391
|
if (method === "loadURL" && !isAllowedNavigation(args[0])) {
|
|
228
392
|
recordRuntime("navigation", method, "blocked", {
|
|
@@ -354,7 +518,7 @@ const patchWebContents = (webContents, windowId) => {
|
|
|
354
518
|
recordRuntime("navigation", event, "blocked", {
|
|
355
519
|
target: contentsId,
|
|
356
520
|
sender: windowId,
|
|
357
|
-
|
|
521
|
+
argument_shape_values: args,
|
|
358
522
|
error: true,
|
|
359
523
|
});
|
|
360
524
|
return;
|
|
@@ -363,7 +527,7 @@ const patchWebContents = (webContents, windowId) => {
|
|
|
363
527
|
recordRuntime(kind, event, "observed", {
|
|
364
528
|
target: contentsId,
|
|
365
529
|
sender: windowId,
|
|
366
|
-
|
|
530
|
+
argument_shape_values: args,
|
|
367
531
|
error: kind === "error",
|
|
368
532
|
});
|
|
369
533
|
if (event === "did-create-window") {
|
|
@@ -379,31 +543,44 @@ const patchWebContents = (webContents, windowId) => {
|
|
|
379
543
|
boundaries.patchWindowOpenHandler(webContents, contentsId);
|
|
380
544
|
};
|
|
381
545
|
|
|
382
|
-
const
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
const
|
|
546
|
+
const patchWindows = (app) => {
|
|
547
|
+
if (app === null || app === undefined) return;
|
|
548
|
+
app.on("browser-window-created", (_event, window) => {
|
|
549
|
+
const targetId = identity(window, "window");
|
|
550
|
+
recordRuntime("window-lifecycle", "created", "completed", {
|
|
551
|
+
target: targetId,
|
|
552
|
+
capture_method: "event-emitter",
|
|
553
|
+
});
|
|
554
|
+
try {
|
|
555
|
+
// Electron 44 separates the preload descriptor from WebPreferences.
|
|
556
|
+
// Read the engine's descriptor, never infer a path from application code.
|
|
557
|
+
const preferences = window.webContents.getLastWebPreferences?.();
|
|
558
|
+
const preload =
|
|
559
|
+
typeof preferences?.preload === "string"
|
|
560
|
+
? preferences.preload
|
|
561
|
+
: window.webContents._getPreloadScript?.()?.filePath;
|
|
394
562
|
if (typeof preload === "string")
|
|
395
563
|
recordRuntime("preload", "configured", "completed", {
|
|
396
564
|
target: targetId,
|
|
397
565
|
artifact_path: preload,
|
|
398
566
|
});
|
|
399
|
-
|
|
400
|
-
|
|
567
|
+
} catch (cause) {
|
|
568
|
+
recordRuntime(
|
|
569
|
+
"error",
|
|
570
|
+
cause instanceof Error ? cause.message : String(cause),
|
|
571
|
+
"failed",
|
|
572
|
+
{
|
|
401
573
|
target: targetId,
|
|
402
|
-
|
|
574
|
+
error: true,
|
|
575
|
+
},
|
|
403
576
|
);
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
577
|
+
}
|
|
578
|
+
patchEmitter(window, (event) =>
|
|
579
|
+
recordRuntime("window-lifecycle", event, "observed", {
|
|
580
|
+
target: targetId,
|
|
581
|
+
}),
|
|
582
|
+
);
|
|
583
|
+
patchWebContents(window.webContents, targetId);
|
|
407
584
|
});
|
|
408
585
|
};
|
|
409
586
|
|
|
@@ -427,7 +604,7 @@ try {
|
|
|
427
604
|
"observed",
|
|
428
605
|
{
|
|
429
606
|
target: "app",
|
|
430
|
-
|
|
607
|
+
argument_shape_values: args,
|
|
431
608
|
process_type: "main",
|
|
432
609
|
},
|
|
433
610
|
),
|
|
@@ -435,33 +612,60 @@ try {
|
|
|
435
612
|
patchIpcMain(electron.ipcMain);
|
|
436
613
|
boundaries.patchIpcRenderer(electron.ipcRenderer);
|
|
437
614
|
boundaries.patchContextBridge(electron.contextBridge);
|
|
438
|
-
|
|
615
|
+
patchWindows(electron.app);
|
|
439
616
|
boundaries.patchUtilityProcess(electron.utilityProcess);
|
|
440
617
|
boundaries.patchShell(electron.shell);
|
|
441
|
-
boundaries.patchSessionManager(electron.session);
|
|
618
|
+
boundaries.patchSessionManager(electron.session, electron.app);
|
|
442
619
|
boundaries.patchApplicationEffects(electron.app);
|
|
443
620
|
boundaries.patchNativeAddonLoading();
|
|
444
621
|
boundaries.patchChildProcess();
|
|
445
622
|
process.once("uncaughtException", (cause, origin) => {
|
|
446
623
|
recordRuntime("process-lifecycle", "uncaught-exception", "observed", {
|
|
447
|
-
|
|
624
|
+
argument_shape_values: [cause, origin],
|
|
448
625
|
error: true,
|
|
449
626
|
});
|
|
450
627
|
throw cause;
|
|
451
628
|
});
|
|
452
629
|
process.once("unhandledRejection", (reason, promise) => {
|
|
453
630
|
recordRuntime("process-lifecycle", "unhandled-rejection", "observed", {
|
|
454
|
-
|
|
631
|
+
argument_shape_values: [reason, promise],
|
|
455
632
|
error: true,
|
|
456
633
|
});
|
|
457
634
|
throw reason;
|
|
458
635
|
});
|
|
459
|
-
} catch {
|
|
636
|
+
} catch (cause) {
|
|
460
637
|
globalThis.__reaElectronActiveHookError = true;
|
|
638
|
+
recordRuntime(
|
|
639
|
+
"error",
|
|
640
|
+
cause instanceof Error ? cause.message : String(cause),
|
|
641
|
+
"failed",
|
|
642
|
+
{
|
|
643
|
+
target: "active-hook-installation",
|
|
644
|
+
error: true,
|
|
645
|
+
},
|
|
646
|
+
);
|
|
461
647
|
}
|
|
462
648
|
|
|
463
649
|
globalThis.__reaElectronActiveSnapshot = () => ({
|
|
464
|
-
events: events.
|
|
650
|
+
events: events.map((event) => ({
|
|
651
|
+
...event,
|
|
652
|
+
argument_shapes: [...event.argument_shapes],
|
|
653
|
+
})),
|
|
654
|
+
retention_budget_bytes: retentionBudgetBytes,
|
|
655
|
+
estimated_retained_bytes: estimatedRetainedBytes,
|
|
656
|
+
event_serialized_byte_upper_bound: serializedBytes,
|
|
657
|
+
retained: events.length,
|
|
658
|
+
dropped,
|
|
659
|
+
dropped_ipc: droppedIpc,
|
|
660
|
+
dropped_runtime: droppedRuntime,
|
|
661
|
+
dropped_event_families: [...droppedFamilies].map(([family, count]) => ({
|
|
662
|
+
family,
|
|
663
|
+
count,
|
|
664
|
+
})),
|
|
665
|
+
dropped_event_roles: [...droppedRoles].map(([role, count]) => ({
|
|
666
|
+
role,
|
|
667
|
+
count,
|
|
668
|
+
})),
|
|
465
669
|
observed,
|
|
466
670
|
observed_ipc: observedIpc,
|
|
467
671
|
observed_runtime: observedRuntime,
|
package/scripts/rea.mjs
CHANGED
|
@@ -19,7 +19,7 @@ const runtimeFiles = isMcpMode
|
|
|
19
19
|
? ["dist/main.js"]
|
|
20
20
|
: isMcpDoctorMode
|
|
21
21
|
? ["dist/main.js", "dist/mcpDoctor.js"]
|
|
22
|
-
: ["dist/cli.js", "dist/cliOutput.js"];
|
|
22
|
+
: ["dist/cli.js", "dist/cliOutput.js", "dist/cli/streamedJsonOutput.js"];
|
|
23
23
|
|
|
24
24
|
if (!(await compiledRuntimeExists(runtimeFiles))) {
|
|
25
25
|
process.stderr.write(
|
|
@@ -39,6 +39,8 @@ if (!(await compiledRuntimeExists(runtimeFiles))) {
|
|
|
39
39
|
process.exitCode = result.exitCode;
|
|
40
40
|
} else {
|
|
41
41
|
const { createCli } = await import("../dist/cli.js");
|
|
42
|
+
const { createStreamedCliJsonOutput } =
|
|
43
|
+
await import("../dist/cli/streamedJsonOutput.js");
|
|
42
44
|
const {
|
|
43
45
|
renderCliOutputArgumentError,
|
|
44
46
|
renderEmptyFilteredCliOutput,
|
|
@@ -51,14 +53,20 @@ if (!(await compiledRuntimeExists(runtimeFiles))) {
|
|
|
51
53
|
process.exitCode = 1;
|
|
52
54
|
} else {
|
|
53
55
|
let wroteOutput = false;
|
|
54
|
-
|
|
56
|
+
const resultOutput = createStreamedCliJsonOutput(args, process.stdout);
|
|
57
|
+
await createCli(process.env, resultOutput).serve(args, {
|
|
55
58
|
stdout: (output) => {
|
|
59
|
+
if (resultOutput?.handled) {
|
|
60
|
+
if (resultOutput.failed)
|
|
61
|
+
process.stderr.write(sanitizeCliOutput(output));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
56
64
|
const sanitized = sanitizeCliOutput(output);
|
|
57
65
|
if (sanitized.length > 0) wroteOutput = true;
|
|
58
66
|
process.stdout.write(sanitized);
|
|
59
67
|
},
|
|
60
68
|
});
|
|
61
|
-
if (!wroteOutput)
|
|
69
|
+
if (!wroteOutput && !resultOutput?.handled)
|
|
62
70
|
process.stdout.write(renderEmptyFilteredCliOutput(args) ?? "");
|
|
63
71
|
}
|
|
64
72
|
}
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
name: reverse-engineer-anything
|
|
3
3
|
description: Reverse engineer native, managed, Electron/JavaScript, packaged, firmware, and browser targets with REA. Use shipped-artifact or requested runtime evidence to explain features, compare versions, decompile code, or guide a reconstruction. Skip REA for ordinary source-repository architecture analysis.
|
|
4
4
|
metadata:
|
|
5
|
-
version: "
|
|
6
|
-
tool_count:
|
|
7
|
-
catalog_digest: "83b4c3445ed0ec003c0aeefa3188f123d9ae319484f8b1e2b611d2fe278c9c72"
|
|
5
|
+
version: "33"
|
|
6
|
+
tool_count: 138
|
|
8
7
|
---
|
|
9
8
|
|
|
10
9
|
# REA
|
|
@@ -33,7 +32,9 @@ When tools are absent or registration is stale:
|
|
|
33
32
|
`npx -y rea-agents@latest doctor --client codex --json`. Substitute the current
|
|
34
33
|
supported client: `claude_code`, `claude_desktop`, `codex`, `cursor`,
|
|
35
34
|
`gemini_cli`, `windsurf`, `devin`, `opencode`, `antigravity`, `copilot_cli`,
|
|
36
|
-
`commandcode`,
|
|
35
|
+
`commandcode`, `vscode`, `grok_build`, or `grok_bot`. `grok_bot` has no local
|
|
36
|
+
file registration: doctor reports the Grok Bot chat step, and setup does not
|
|
37
|
+
write `mcp.json`. If the client is unknown, use `doctor --json` and
|
|
37
38
|
inspect its registration results before choosing a setup scope.
|
|
38
39
|
2. Distinguish the reason. Missing, malformed, or stale registration needs a
|
|
39
40
|
scoped configuration repair. An aligned registration with no tools in the
|
|
@@ -93,7 +94,27 @@ explicit path or endpoint and do not need it.
|
|
|
93
94
|
consult the NativeAOT workflow in `references/native-and-artifacts.md` for
|
|
94
95
|
optional metadata recovery and its supported host/layout boundary.
|
|
95
96
|
- User-owned browser page already open: `list_browser_targets`.
|
|
97
|
+
- Retained HAR/native mitmproxy capture: `inspect_web_network_capture`. Select
|
|
98
|
+
original record ordinals when useful; inspect producer fields and byte/number
|
|
99
|
+
sidecars without fetching recorded URLs or claiming live attribution. See
|
|
100
|
+
[historical captures](https://github.com/morluto/rea/blob/main/docs/web-network-captures.md) for the exact upstream
|
|
101
|
+
profile and credential exclusions.
|
|
96
102
|
- User-owned Electron runtime already open: `list_electron_targets`.
|
|
103
|
+
- Explicit local EVM bytecode carrier: `inspect_evm_interface` with caller-selected
|
|
104
|
+
`raw` or `hex` encoding. Preserve carrier/decoded digests and treat selectors,
|
|
105
|
+
argument strings and mutability as inferred candidates; this performs no chain
|
|
106
|
+
lookup or target execution. See the
|
|
107
|
+
[EVM bytecode guide](https://github.com/morluto/rea/blob/main/docs/evm-bytecode.md).
|
|
108
|
+
- Explicit Linux ELF file for offline layout, symbols, relocations or static
|
|
109
|
+
mitigation evidence: `inspect_binary_layout`. This target-free operation uses
|
|
110
|
+
caller-supplied pwntools without opening a disassembler database. Preserve its
|
|
111
|
+
raw locations and inference/coverage limits; see the
|
|
112
|
+
[offline binary guide](https://github.com/morluto/rea/blob/main/docs/binary-diagnostics.md).
|
|
113
|
+
- Supplied Linux x86-64 ELF core: `inspect_recorded_crash`. Read every recorded
|
|
114
|
+
thread, raw note and source-bound register without opening a live target.
|
|
115
|
+
Historical PIDs do not select live processes. Request `include_debugger_context`
|
|
116
|
+
only when core-only mapping candidates help; see the
|
|
117
|
+
[recorded crash guide](https://github.com/morluto/rea/blob/main/docs/recorded-crashes.md).
|
|
97
118
|
- Native executable, library, or analysis database: `open_binary`, then
|
|
98
119
|
use focused analysis tools directly; call `binary_overview` when metadata or
|
|
99
120
|
inventory context is useful and available from the selected provider.
|
|
@@ -126,6 +147,13 @@ Start with the default result and use its inline Evidence and graph context.
|
|
|
126
147
|
Do not repeat an identical tool call. Make a focused follow-up only when the
|
|
127
148
|
returned result leaves a specific question unanswered.
|
|
128
149
|
|
|
150
|
+
If MCP reports `resource_constraint` with `details.resource: "transport"`, use
|
|
151
|
+
its reported same-session Evidence reference with a focused application tool,
|
|
152
|
+
or call `export_evidence_bundle` to write the complete session to a selected
|
|
153
|
+
path. The analysis remains complete in the ledger; avoid repeating it merely
|
|
154
|
+
to request the same oversized response. Complete CLI JSON output also streams
|
|
155
|
+
without a single MCP frame.
|
|
156
|
+
|
|
129
157
|
Every conclusion must distinguish observations, inferences, and unknowns. Cite
|
|
130
158
|
Evidence IDs, preserve limitations and incomplete coverage, and never imply
|
|
131
159
|
that static analysis observed execution. Runtime requests execute the declared
|
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
Use `analyze_javascript_application` directly on the operator-supplied ASAR or
|
|
4
4
|
extracted tree. The complete result, graph, and Evidence context are returned
|
|
5
|
-
inline. Source-map contents are part of the static analysis. Start from its
|
|
5
|
+
inline when they fit the MCP frame. Source-map contents are part of the static analysis. Start from its
|
|
6
6
|
findings, coverage, unknowns, and graph context, then make a focused follow-up
|
|
7
7
|
only when a specific question remains unanswered.
|
|
8
8
|
|
|
9
|
+
An oversized response reports `resource_constraint` and
|
|
10
|
+
`details.resource: "transport"`. Reuse
|
|
11
|
+
`details.reported_limits.evidence_reference` with `trace_application_feature`
|
|
12
|
+
for the module or feature under investigation. `export_evidence_bundle` writes
|
|
13
|
+
the complete canonical session to a caller-selected file. Both workflows keep
|
|
14
|
+
the original Evidence and coverage; a broad follow-up can also exceed framing.
|
|
15
|
+
|
|
9
16
|
BrowserWindow preferences, preload and contextBridge surfaces, IPC
|
|
10
17
|
registrations, utility processes, and native binding requests are static syntax
|
|
11
18
|
observations. Only a unique exact literal IPC channel match supports an inferred
|
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Native, managed, and packaged artifacts
|
|
2
2
|
|
|
3
|
+
## Recorded Linux crashes
|
|
4
|
+
|
|
5
|
+
Use `inspect_recorded_crash` with an explicit Linux x86-64 ELF core path to
|
|
6
|
+
inspect historical thread registers, signals, raw notes and original file
|
|
7
|
+
ranges. It is independent of the active disassembler target. Source-bound
|
|
8
|
+
register values and note bytes are observations; missing notes, signal-thread
|
|
9
|
+
association and current executable/library identity remain unknown. PIDs are
|
|
10
|
+
historical metadata and never authorize live attach or control.
|
|
11
|
+
|
|
12
|
+
The optional `include_debugger_context` facet adds mapping candidates through
|
|
13
|
+
caller-supplied GDB/pwndbg in an owned core-only session. Display names do not
|
|
14
|
+
establish current file identity; zero reported flags leave permissions unknown.
|
|
15
|
+
Requested unavailable context fails with setup guidance. See
|
|
16
|
+
[recorded crashes](https://github.com/morluto/rea/blob/main/docs/recorded-crashes.md)
|
|
17
|
+
for exact upstream profiles, bounds and verification coverage.
|
|
18
|
+
|
|
3
19
|
## Native targets
|
|
4
20
|
|
|
5
21
|
After `open_binary`, use focused search, procedure, or function tools directly.
|
|
@@ -9,6 +25,12 @@ cross-references. Addresses and recovered pseudocode are analysis observations,
|
|
|
9
25
|
not original source. Provider unavailability and unsupported metadata remain
|
|
10
26
|
unknown rather than false.
|
|
11
27
|
|
|
28
|
+
To see which functions or Objective-C methods a Mach-O actually calls in one
|
|
29
|
+
run, use `observe_native_calls` with explicit breakpoints and a bounded
|
|
30
|
+
`duration_ms`/`max_events`. It launches a new process under LLDB, so the target
|
|
31
|
+
runs and may change files or use the network. Hardened-runtime targets need the
|
|
32
|
+
`get-task-allow` entitlement.
|
|
33
|
+
|
|
12
34
|
Use `binary_session` with no arguments to check the open target, selected
|
|
13
35
|
provider, and alignment. Its default `result.tool_availability` includes the
|
|
14
36
|
complete tool inventory with availability reasons and remediation. When choosing
|
|
@@ -77,6 +99,13 @@ helpers, launchd plists, symlinks, and each bundle's `info_plist_path` and
|
|
|
77
99
|
executable candidates. Roles are path conventions, not parsed plists; read the
|
|
78
100
|
listed plists with `inspect_plist`.
|
|
79
101
|
|
|
102
|
+
After `open_binary` on a `.app` or Mach-O, use `trace_dylib_resolution` to see
|
|
103
|
+
which file each `@rpath`, `@loader_path` and `@executable_path` load reaches for
|
|
104
|
+
every executable in the bundle. It also lists missing or weak loads and earlier
|
|
105
|
+
`@rpath` candidates that are absent. Narrow large bundles with `roots` or
|
|
106
|
+
`architecture`. System paths stay undetermined because the dyld shared cache
|
|
107
|
+
provides them.
|
|
108
|
+
|
|
80
109
|
Use `extract_artifact` when materialized files are needed. It takes no arguments
|
|
81
110
|
and materializes all regular files into a fresh temporary directory chosen by
|
|
82
111
|
REA. Symlinks and encrypted entries are inventory facts, not extractable files.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Upstream analysis engines
|
|
2
|
+
|
|
3
|
+
REA integrates existing tools through provider adapters. Upstream source remains
|
|
4
|
+
unmodified and retains its own license; it is not copied into REA's domain or
|
|
5
|
+
application code.
|
|
6
|
+
|
|
7
|
+
## jadx-headless-mcp
|
|
8
|
+
|
|
9
|
+
- Source: <https://github.com/1013503897/jadx-headless-mcp>
|
|
10
|
+
- Submodule: `third_party/jadx-headless-mcp`
|
|
11
|
+
- Release: `v0.7.1`
|
|
12
|
+
- Commit: `5844800a486d2248fa949b74c9896285f5b54de2`
|
|
13
|
+
- License: Apache-2.0; see the submodule's `LICENSE`.
|
|
14
|
+
- Release identity: `src/android/JadxRelease.ts`.
|
|
15
|
+
- REA integration: `src/android/`; no upstream patches in this version.
|
|
16
|
+
|
|
17
|
+
Fetch source for inspection with:
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
git submodule update --init third_party/jadx-headless-mcp
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Normal REA builds and installed npm packages do not require this submodule or a
|
|
24
|
+
Gradle build. Supply a separately obtained JAR with `REA_JADX_MCP_JAR`; REA never
|
|
25
|
+
downloads engines during an analysis operation. The audited release JAR is
|
|
26
|
+
identified by SHA-256. A caller-supplied build reporting the supported protocol
|
|
27
|
+
version retains its actual digest and an unknown source revision unless its
|
|
28
|
+
bytes match the audited release.
|
|
29
|
+
|
|
30
|
+
When updating: review upstream protocol and license changes, update the gitlink
|
|
31
|
+
and release identity together, exercise the adapter's producer regressions, and
|
|
32
|
+
run the real APK CLI/MCP lane. Never attribute modified engine bytes to the
|
|
33
|
+
audited source revision.
|
|
34
|
+
|
|
35
|
+
## Public APK fixture
|
|
36
|
+
|
|
37
|
+
`scripts/fetch-android-fixtures.mjs` explicitly downloads the audited engine and
|
|
38
|
+
Appium ApiDemos v6.0.18 into ignored `_reference/apk-integration/`. Both downloads
|
|
39
|
+
are checked against fixed SHA-256 values. Fixture provenance is recorded in
|
|
40
|
+
`scripts/fixtures/android-apidemos.json`; the source uses Apache-2.0. This is a
|
|
41
|
+
static analysis fixture: no emulator, device, SDK installation or app execution
|
|
42
|
+
is needed. APKs and JARs are neither tracked nor included in npm packages.
|
|
43
|
+
|
|
44
|
+
## Firmware engines
|
|
45
|
+
|
|
46
|
+
| Engine | Source | Release | Pinned commit | License |
|
|
47
|
+
| --- | --- | --- | --- | --- |
|
|
48
|
+
| Binwalk | <https://github.com/ReFirmLabs/binwalk> | v3.1.0 | `4fdab3d464d97b68e0af9088df3f9e2e1545b21c` | MIT, upstream `LICENSE` |
|
|
49
|
+
| Unblob | <https://github.com/onekey-sec/unblob> | 26.6.4 | `1fcc7a0a584a70a96c31f5a276c20944d199a089` | MIT, upstream `LICENSE` |
|
|
50
|
+
|
|
51
|
+
Source remains unmodified in `third_party/binwalk` and `third_party/unblob`.
|
|
52
|
+
Release records live in `src/firmware/FirmwareRelease.ts`; REA adapters own the
|
|
53
|
+
CLI/report interpretation and lifecycle in `src/firmware/`. Caller-supplied
|
|
54
|
+
executables retain their actual launcher digest and unknown source revision;
|
|
55
|
+
version output alone does not establish source identity. REA does not bundle
|
|
56
|
+
extractors or download/install firmware engines during analysis.
|
|
57
|
+
|
|
58
|
+
On updates: inspect actual pinned CLI and report producers, preserve licenses,
|
|
59
|
+
update gitlinks/release records, run report regressions and the real firmware
|
|
60
|
+
lane. See [firmware setup and coverage](../docs/firmware-analysis.md).
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Maxim Andreev
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|