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.
Files changed (507) hide show
  1. package/README.md +168 -655
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +173 -47
  4. package/bridge/hopper_bridge.py +310 -128
  5. package/bridge/mitmproxy/capture.py +208 -0
  6. package/bridge/native/rea_lldb_tracer.py +839 -0
  7. package/bridge/process/ProcessRunTokenReader.swift +297 -0
  8. package/bridge/process/ProcessRunTokenReaderMain.swift +35 -0
  9. package/bridge/pwndbg/core_context.py +101 -0
  10. package/bridge/pwndbg/launch.py +39 -0
  11. package/bridge/pwndbg/launch_impl.py +34 -0
  12. package/bridge/pwntools/decoder_runtime.py +59 -0
  13. package/bridge/pwntools/layout.py +39 -0
  14. package/bridge/pwntools/layout_impl.py +309 -0
  15. package/bridge/pwntools/recorded_crash.py +39 -0
  16. package/bridge/pwntools/recorded_crash_impl.py +147 -0
  17. package/dist/android/JadxConfiguration.js +196 -33
  18. package/dist/android/JadxMcpTransport.js +4 -0
  19. package/dist/android/JadxProtocol.js +6 -0
  20. package/dist/android/JadxProvider.js +20 -2
  21. package/dist/android/JadxSession.js +23 -4
  22. package/dist/application/AnalysisContextQueries.js +8 -35
  23. package/dist/application/AnalysisDocument.js +32 -0
  24. package/dist/application/AppBundleExecutable.js +67 -21
  25. package/dist/application/CallPathTracing.js +19 -3
  26. package/dist/application/CapabilityInventory.js +27 -3
  27. package/dist/application/ClientConfigurationDocument.js +871 -6
  28. package/dist/application/ClientRegistrationIdentity.js +26 -5
  29. package/dist/application/ClientRegistrationStatus.js +29 -14
  30. package/dist/application/DirectAnalysis.js +97 -33
  31. package/dist/application/Doctor.js +4 -2
  32. package/dist/application/DoctorScope.js +25 -13
  33. package/dist/application/EnhancedLiteralTracing.js +22 -25
  34. package/dist/application/EnhancedTools.js +13 -11
  35. package/dist/application/EvidenceBundleFiles.js +24 -12
  36. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  37. package/dist/application/InventoryProjectionEvidence.js +4 -3
  38. package/dist/application/InvestigationProviders.js +3 -2
  39. package/dist/application/JsonFiles.js +50 -28
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/ReconstructionCoverageService.js +7 -4
  42. package/dist/application/ReconstructionObligationCandidates.js +5 -1
  43. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  44. package/dist/application/Setup.js +13 -1
  45. package/dist/application/SetupClientConfiguration.js +10 -15
  46. package/dist/application/SetupHost.js +5 -2
  47. package/dist/application/SetupPlan.js +5 -3
  48. package/dist/application/SupportedClients.js +34 -1
  49. package/dist/application/Uninstall.js +4 -3
  50. package/dist/application/Update.js +18 -3
  51. package/dist/application/UpdateRuntime.js +46 -25
  52. package/dist/application/WebModuleTraceService.js +4 -2
  53. package/dist/application/WebNetworkCapturePort.js +1 -0
  54. package/dist/application/WebNetworkCaptureService.js +134 -0
  55. package/dist/application/WebRuntimeService.js +5 -3
  56. package/dist/application/WebScriptExportService.js +2 -2
  57. package/dist/application/WebSourceLocationService.js +4 -2
  58. package/dist/application/WindowsCapabilities.js +1 -1
  59. package/dist/application/WorkflowEvidence.js +82 -0
  60. package/dist/application/binary/AnalysisProviderEvaluation.js +21 -5
  61. package/dist/application/binary/AnalysisProviderRegistry.js +2 -0
  62. package/dist/application/binary/AnalysisSnapshotCache.js +52 -12
  63. package/dist/application/binary/BinarySession.js +131 -76
  64. package/dist/application/binary/BinarySessionOpen.js +19 -6
  65. package/dist/application/binary/BinarySessionRecords.js +45 -3
  66. package/dist/application/binary/BinarySessionStatus.js +17 -1
  67. package/dist/application/binary/CompositeProvider.js +13 -0
  68. package/dist/application/binary/LazyAnalysisProvider.js +3 -0
  69. package/dist/application/binaryDiagnostics/BinaryLayoutPort.js +1 -0
  70. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +59 -0
  71. package/dist/application/binaryDiagnostics/RecordedCrashPort.js +1 -0
  72. package/dist/application/binaryDiagnostics/RecordedCrashService.js +62 -0
  73. package/dist/application/evm/EvmInterfacePort.js +1 -0
  74. package/dist/application/evm/EvmInterfaceService.js +64 -0
  75. package/dist/application/investigation/EvidenceLedger.js +21 -7
  76. package/dist/application/investigation/InvestigationRecords.js +8 -0
  77. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  78. package/dist/application/javascript/JavaScriptApplicationEvidence.js +25 -5
  79. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  80. package/dist/application/javascript/JavaScriptApplicationService.js +34 -14
  81. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  82. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +47 -27
  83. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +39 -7
  84. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +26 -2
  85. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +80 -27
  86. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +33 -12
  87. package/dist/application/javascript/JavaScriptModuleRelationships.js +37 -8
  88. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  89. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -1
  90. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  91. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +7 -7
  92. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +149 -72
  93. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +14 -15
  94. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +41 -1
  95. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +7 -7
  96. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -9
  97. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +3 -3
  98. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +118 -12
  99. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -3
  100. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +27 -5
  101. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  102. package/dist/application/managed/ManagedMemberComparisonService.js +7 -4
  103. package/dist/application/managed/ManagedNativeVerificationService.js +4 -3
  104. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  105. package/dist/application/{ProcessCli.js → process/ProcessCli.js} +23 -15
  106. package/dist/application/{ProcessEvidence.js → process/ProcessEvidence.js} +8 -7
  107. package/dist/application/workflowInputError.js +18 -0
  108. package/dist/artifacts/ArtifactProvider.js +42 -5
  109. package/dist/artifacts/ArtifactProviderMetadata.js +2 -1
  110. package/dist/artifacts/MachOSliceArtifactReader.js +98 -14
  111. package/dist/artifacts/NativeDmgArtifactReader.js +13 -6
  112. package/dist/artifacts/ZipArtifactReader.js +3 -0
  113. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +22 -3
  114. package/dist/artifacts/apple/DylibResolutionReader.js +259 -0
  115. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  116. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  117. package/dist/artifacts/apple/KeyedArchiveReader.js +36 -22
  118. package/dist/artifacts/apple/MachoLoadCommandReader.js +355 -0
  119. package/dist/artifacts/apple/NibArchive.js +81 -14
  120. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  121. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  122. package/dist/{application → artifacts/extraction}/ArtifactExtraction.js +10 -10
  123. package/dist/{application → artifacts/inventory}/ArtifactGraphConstruction.js +16 -11
  124. package/dist/{application → artifacts/inventory}/ArtifactInventory.js +4 -4
  125. package/dist/{application/ArtifactInventory → artifacts/inventory}/classify.js +2 -2
  126. package/dist/{application/ArtifactInventory → artifacts/inventory}/reader.js +5 -5
  127. package/dist/{application/ArtifactInventory → artifacts/inventory}/scanCanonical.js +14 -17
  128. package/dist/{application/ArtifactInventory → artifacts/inventory}/scanReader.js +5 -5
  129. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  130. package/dist/artifacts/readStableArtifact.js +20 -4
  131. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  132. package/dist/browser/CdpCaptureEventHandlers.js +165 -12
  133. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  134. package/dist/browser/CdpCaptureEvents.js +34 -0
  135. package/dist/browser/CdpConnection.js +30 -11
  136. package/dist/browser/CdpOptionalCommand.js +2 -3
  137. package/dist/browser/CdpPageCapture.js +23 -1
  138. package/dist/browser/PlaywrightElectronActiveActions.js +32 -23
  139. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  140. package/dist/browser/PlaywrightElectronActiveProvider.js +130 -122
  141. package/dist/browser/WebSourceMapFetcher.js +426 -72
  142. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  143. package/dist/browser/history/CaptureFailures.js +137 -0
  144. package/dist/browser/history/CaptureFormatError.js +10 -0
  145. package/dist/browser/history/CaptureRedaction.js +65 -0
  146. package/dist/browser/history/CaptureRelease.js +17 -0
  147. package/dist/browser/history/HarCapture.js +165 -0
  148. package/dist/browser/history/HarCaptureAdapter.js +20 -0
  149. package/dist/browser/history/HarCaptureProcess.js +57 -0
  150. package/dist/browser/history/HarJson.js +92 -0
  151. package/dist/browser/history/HarSchema.js +72 -0
  152. package/dist/browser/history/HistoricalCaptureDecoder.js +188 -0
  153. package/dist/browser/history/HistoricalCaptureFormatAdapter.js +1 -0
  154. package/dist/browser/history/MitmproxyCaptureAdapter.js +42 -0
  155. package/dist/cli/analysisSelector.js +23 -0
  156. package/dist/cli/applicationCommands.js +2 -3
  157. package/dist/cli/artifactCommands.js +26 -1
  158. package/dist/cli/binaryDiagnosticsCommands.js +39 -0
  159. package/dist/cli/coreAnalysisCommands.js +2 -2
  160. package/dist/cli/coreBinaryCommands.js +78 -20
  161. package/dist/cli/electronCommands.js +21 -13
  162. package/dist/cli/evmCommands.js +24 -0
  163. package/dist/cli/firmwareCommands.js +6 -3
  164. package/dist/cli/javascriptApplicationAnalysis.js +20 -3
  165. package/dist/cli/jsonOutput.js +38 -0
  166. package/dist/cli/nativeCallCommands.js +34 -0
  167. package/dist/cli/processCommands.js +1 -1
  168. package/dist/cli/streamedJsonOutput.js +56 -0
  169. package/dist/cli/utilityCommands.js +2 -0
  170. package/dist/cli/webNetworkCaptureCommands.js +40 -0
  171. package/dist/cli/webRuntimeCommands.js +8 -8
  172. package/dist/cli.js +11 -4
  173. package/dist/cliBrowserScenarioCommands.js +2 -2
  174. package/dist/cliCommandNames.js +6 -1
  175. package/dist/cliJsonInput.js +35 -1
  176. package/dist/cliOutput.js +21 -6
  177. package/dist/composition/binaryDiagnostics.js +8 -0
  178. package/dist/composition/evm.js +4 -0
  179. package/dist/composition/webNetworkCaptures.js +6 -0
  180. package/dist/config/environment.js +4 -0
  181. package/dist/config/ghidraStartupTimeout.js +17 -0
  182. package/dist/config/mcpResponseBudget.js +22 -0
  183. package/dist/config/parseConfig.js +2 -1
  184. package/dist/contracts/artifactToolContracts.js +6 -0
  185. package/dist/contracts/browserCaptureToolInputSchema.js +43 -0
  186. package/dist/contracts/browserToolContracts.js +4 -3
  187. package/dist/contracts/enhancedInputs.js +5 -3
  188. package/dist/contracts/enhancedToolContracts.js +3 -3
  189. package/dist/contracts/errorSchemas.js +8 -1
  190. package/dist/contracts/evm/evmToolContracts.js +20 -0
  191. package/dist/contracts/hopperMemoryContracts.js +2 -5
  192. package/dist/contracts/investigationExamples.js +2 -2
  193. package/dist/contracts/javascript/electronToolContracts.js +1 -1
  194. package/dist/contracts/managed/managedToolContracts.js +8 -6
  195. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +42 -0
  196. package/dist/contracts/native/nativeToolContracts.js +21 -3
  197. package/dist/contracts/officialToolContracts.js +26 -24
  198. package/dist/contracts/process/processCaptureExample.js +2 -0
  199. package/dist/contracts/promptContracts.js +3 -3
  200. package/dist/contracts/sessionLifecycleInputs.js +18 -5
  201. package/dist/contracts/sessionStatusContract.js +8 -2
  202. package/dist/contracts/sessionToolContracts.js +8 -3
  203. package/dist/contracts/sessionToolSchemas.js +8 -4
  204. package/dist/contracts/toolContractExamples.js +1 -2
  205. package/dist/contracts/toolContractHelpers.js +4 -1
  206. package/dist/contracts/toolContracts.js +6 -0
  207. package/dist/contracts/toolEffects.js +30 -1
  208. package/dist/contracts/toolOutputSchemaGroups.js +33 -28
  209. package/dist/contracts/toolOutputSchemaPrimitives.js +19 -1
  210. package/dist/contracts/toolSchemaMetadata.js +69 -10
  211. package/dist/contracts/webNetworkCaptureToolContracts.js +24 -0
  212. package/dist/domain/analysisErrorBase.js +22 -2
  213. package/dist/domain/analysisErrorCore.js +61 -5
  214. package/dist/domain/analysisErrorPresentation.js +95 -12
  215. package/dist/domain/analysisErrorProjection.js +148 -19
  216. package/dist/domain/analysisSnapshot.js +166 -2
  217. package/dist/domain/android/androidAnalysis.js +2 -4
  218. package/dist/domain/android/androidApplication.js +17 -9
  219. package/dist/domain/apple/appleApplication.js +41 -14
  220. package/dist/domain/apple/dyldEnvironment.js +73 -0
  221. package/dist/domain/apple/dyldPaths.js +81 -0
  222. package/dist/domain/apple/dylibResolution.js +478 -0
  223. package/dist/domain/apple/dylibResolutionFindings.js +77 -0
  224. package/dist/domain/apple/interfaceBuilderGraph.js +25 -13
  225. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  226. package/dist/domain/apple/keyedArchive.js +9 -1
  227. package/dist/domain/apple/machoContainer.js +54 -0
  228. package/dist/domain/apple/plistNumbers.js +76 -0
  229. package/dist/domain/artifactIdentity.js +29 -0
  230. package/dist/domain/artifactInventoryEvidence.js +19 -24
  231. package/dist/domain/artifactPathSyntax.js +1 -1
  232. package/dist/domain/bridgeCandidateProjection.js +71 -0
  233. package/dist/domain/browserCompleteness.js +1 -0
  234. package/dist/domain/browserObservation.js +1 -1
  235. package/dist/domain/browserObservationError.js +24 -5
  236. package/dist/domain/browserObservationSchemas.js +13 -0
  237. package/dist/domain/browserScenarioValues.js +5 -2
  238. package/dist/domain/bundleComparison.js +3 -2
  239. package/dist/domain/callPathSchemas.js +1 -1
  240. package/dist/domain/canonicalDigest.js +13 -1
  241. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  242. package/dist/domain/canonicalOrdering.js +9 -5
  243. package/dist/domain/changedBehavior.js +9 -9
  244. package/dist/domain/comparisonSourceEvidence.js +40 -0
  245. package/dist/domain/comparisonStatus.js +2 -30
  246. package/dist/domain/configurationErrors.js +1 -1
  247. package/dist/domain/conformanceTrustGate.js +0 -16
  248. package/dist/domain/evidence.js +78 -11
  249. package/dist/domain/evidenceBundle.js +42 -1
  250. package/dist/domain/evidenceErrors.js +12 -1
  251. package/dist/domain/evm/evmInterface.js +63 -0
  252. package/dist/domain/explicitSensitiveFailure.js +108 -0
  253. package/dist/domain/explicitSensitiveValues.js +10 -0
  254. package/dist/domain/firmware/firmwareAnalysis.js +10 -4
  255. package/dist/domain/hopperErrors.js +23 -2
  256. package/dist/domain/hopperValues.js +51 -8
  257. package/dist/domain/immutableJson.js +114 -0
  258. package/dist/domain/inputIssueProjection.js +3 -0
  259. package/dist/domain/javascript/electronActiveObservation.js +37 -6
  260. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  261. package/dist/domain/javascript/htmlArtifactReferences.js +40 -0
  262. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  263. package/dist/domain/javascript/javascriptApplicationGraph.js +13 -0
  264. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  265. package/dist/domain/javascript/javascriptExportShapeComparison.js +21 -5
  266. package/dist/domain/javascript/javascriptExportShapeVariants.js +0 -10
  267. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  268. package/dist/domain/javascript/javascriptSemanticAnalysis.js +97 -2
  269. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  270. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  271. package/dist/domain/javascript/javascriptSemanticDataEffects.js +22 -5
  272. package/dist/domain/javascript/javascriptSemanticGraph.js +34 -5
  273. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  274. package/dist/domain/javascript/javascriptSemanticPrimitives.js +25 -17
  275. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  276. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  277. package/dist/domain/javascript/javascriptSemanticValues.js +83 -11
  278. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  279. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  280. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  281. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +14 -4
  282. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  283. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -16
  284. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  285. package/dist/domain/jsonSerialization.js +109 -0
  286. package/dist/domain/jsonValue.js +91 -3
  287. package/dist/domain/localPath.js +8 -0
  288. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  289. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  290. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  291. package/dist/domain/managed/managedNativeVerification.js +3 -9
  292. package/dist/domain/native/binaryLayout.js +357 -0
  293. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  294. package/dist/domain/native/nativeCallObservation.js +186 -0
  295. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  296. package/dist/domain/native/objcSwiftMetadata.js +0 -39
  297. package/dist/domain/native/recordedCrash.js +266 -0
  298. package/dist/domain/native/recordedCrashNoteCoverage.js +73 -0
  299. package/dist/domain/{processCapture.js → process/processCapture.js} +143 -2
  300. package/dist/domain/{processCaptureExample.js → process/processCaptureExample.js} +5 -0
  301. package/dist/domain/process/processCaptureParsing.js +54 -0
  302. package/dist/domain/{processCaptureValidation.js → process/processCaptureValidation.js} +18 -2
  303. package/dist/domain/{processComparison.js → process/processComparison.js} +39 -5
  304. package/dist/domain/{processObservation.js → process/processObservation.js} +1 -1
  305. package/dist/domain/{processScenario.js → process/processScenario.js} +11 -10
  306. package/dist/domain/{processTraceSpecification.js → process/processTraceSpecification.js} +1 -1
  307. package/dist/domain/propertyListKeys.js +1 -1
  308. package/dist/domain/propertyListXmlText.js +19 -0
  309. package/dist/domain/providerAdapterError.js +1 -1
  310. package/dist/domain/providerOperationHealth.js +54 -0
  311. package/dist/domain/providerSelectionError.js +4 -2
  312. package/dist/domain/reconstructionVerification.js +9 -46
  313. package/dist/domain/reconstructionVerificationSchemas.js +3 -3
  314. package/dist/domain/residualUnknown.js +3 -2
  315. package/dist/domain/staticRuntimeCorrelation.js +9 -46
  316. package/dist/domain/webBundleAnalysis.js +20 -8
  317. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  318. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  319. package/dist/domain/webCaptureDiff.js +1 -0
  320. package/dist/domain/webNetworkCapture.js +118 -0
  321. package/dist/domain/webNetworkCaptureCoordinates.js +58 -0
  322. package/dist/domain/webRuntime.js +19 -5
  323. package/dist/domain/webSourceLocation.js +1 -0
  324. package/dist/dotnet/ManagedExceptionRegionValidation.js +41 -0
  325. package/dist/dotnet/ManagedMemberInspector.js +4 -2
  326. package/dist/dotnet/ManagedMemberInspectorCore.js +38 -32
  327. package/dist/dotnet/ManagedMemberInstructionDecoder.js +23 -7
  328. package/dist/dotnet/ManagedMemberRows.js +14 -3
  329. package/dist/dotnet/ManagedMetadataHeaps.js +20 -2
  330. package/dist/dotnet/ManagedMetadataInventory.js +38 -28
  331. package/dist/dotnet/ManagedMetadataInventoryRows.js +24 -10
  332. package/dist/dotnet/ManagedMethodBodyReader.js +7 -1
  333. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +15 -3
  334. package/dist/dotnet/ManagedNativeBoundaryInspector.js +3 -1
  335. package/dist/dotnet/ManagedPeReader.js +11 -0
  336. package/dist/evm/EvmBytecodeCarrier.js +21 -0
  337. package/dist/evm/EvmWorkerLimits.js +40 -0
  338. package/dist/evm/EvmoleFailures.js +126 -0
  339. package/dist/evm/EvmoleInterfaceAdapter.js +53 -0
  340. package/dist/evm/EvmoleInterfaceProvider.js +273 -0
  341. package/dist/evm/EvmoleInterfaceWorker.js +87 -0
  342. package/dist/evm/EvmoleRelease.js +16 -0
  343. package/dist/firmware/FirmwareCommand.js +1 -0
  344. package/dist/firmware/FirmwareFiles.js +1 -1
  345. package/dist/generatedPackageMetadata.js +2 -2
  346. package/dist/ghidra/GhidraAnalysisProfile.js +5 -0
  347. package/dist/ghidra/GhidraClient.js +47 -14
  348. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  349. package/dist/ghidra/GhidraFunctionValues.js +10 -7
  350. package/dist/ghidra/GhidraInstallation.js +18 -21
  351. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  352. package/dist/ghidra/GhidraJavaLaunch.js +62 -0
  353. package/dist/ghidra/GhidraLauncher.js +34 -16
  354. package/dist/ghidra/GhidraProvider.js +2 -2
  355. package/dist/ghidra/GhidraProviderCapabilities.js +15 -3
  356. package/dist/ghidra/GhidraProviderClient.js +23 -12
  357. package/dist/ghidra/GhidraSessionError.js +11 -7
  358. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  359. package/dist/ghidra/GhidraTransport.js +20 -0
  360. package/dist/hopper/BridgeLauncher.js +33 -11
  361. package/dist/hopper/HopperAnalysisProfile.js +62 -4
  362. package/dist/hopper/HopperCleanup.js +15 -3
  363. package/dist/hopper/HopperClient.js +222 -14
  364. package/dist/hopper/HopperFileOffset.js +237 -0
  365. package/dist/hopper/HopperMachOImage.js +196 -0
  366. package/dist/hopper/HopperOperationStage.js +6 -0
  367. package/dist/hopper/HopperProvider.js +63 -9
  368. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  369. package/dist/hopper/HopperRegexSearch.js +137 -0
  370. package/dist/hopper/HopperRegexWorker.js +27 -0
  371. package/dist/hopper/HopperRequestQueue.js +68 -19
  372. package/dist/hopper/HopperTargetLease.js +3 -2
  373. package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -2
  374. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  375. package/dist/inspector/V8InspectorCaptureProjection.js +8 -3
  376. package/dist/inspector/V8InspectorProvider.js +47 -11
  377. package/dist/javascript/recovery/WakaruCommand.js +3 -0
  378. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  379. package/dist/javascript/sourceMaps/SourceMapCommand.js +17 -0
  380. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  381. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  382. package/dist/mcpDoctor.js +62 -2
  383. package/dist/native/AppleDispatchCoverage.js +47 -6
  384. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  385. package/dist/native/AppleDispatchMetadata.js +6 -3
  386. package/dist/native/AppleMachoFixups.js +48 -24
  387. package/dist/native/AppleMachoSelection.js +32 -16
  388. package/dist/native/AppleObjcCategories.js +6 -2
  389. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  390. package/dist/native/AppleObjcProperties.js +2 -1
  391. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  392. package/dist/native/AppleSwiftVtables.js +21 -15
  393. package/dist/native/CommandRunner.js +82 -84
  394. package/dist/native/LldbCallTracer.js +541 -0
  395. package/dist/native/LldbRetainedObservations.js +178 -0
  396. package/dist/native/NativeCallObservation.js +194 -0
  397. package/dist/native/NativeMacOSProvider.js +117 -20
  398. package/dist/native/NativeMacOSProviderMetadata.js +8 -3
  399. package/dist/native/SignatureTargetBinding.js +155 -0
  400. package/dist/native/parsers/lipo.js +71 -1
  401. package/dist/native/pwndbg/PwndbgCoreContext.js +180 -0
  402. package/dist/native/pwntools/PwntoolsDecoder.js +203 -0
  403. package/dist/native/pwntools/PwntoolsFailures.js +180 -0
  404. package/dist/native/pwntools/PwntoolsLayoutProvider.js +36 -0
  405. package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +75 -0
  406. package/dist/native/pwntools/PwntoolsRelease.js +19 -0
  407. package/dist/native/pwntools/PwntoolsResourceLimits.js +76 -0
  408. package/dist/native/pwntools/RecordedCrashSourceBindings.js +46 -0
  409. package/dist/native/pwntools/RecordedCrashStructureBindings.js +103 -0
  410. package/dist/process/DarwinProcessRunTokenReader.js +293 -0
  411. package/dist/process/ExecFileOutput.js +20 -0
  412. package/dist/process/OwnedCommand.js +118 -0
  413. package/dist/process/ProcessOwnership.js +431 -51
  414. package/dist/process/ProcessOwnershipObservation.js +209 -27
  415. package/dist/process/ProviderProcess.js +68 -10
  416. package/dist/{application → process/capture}/ProcessCaptureCapability.js +15 -0
  417. package/dist/{application → process/capture}/ProcessCaptureError.js +18 -2
  418. package/dist/process/capture/ProcessCaptureLifecycle.js +681 -0
  419. package/dist/{application → process/capture}/ProcessHarness.js +195 -29
  420. package/dist/{application → process/capture}/ProcessSampling.js +2 -2
  421. package/dist/server/EvidenceMcpServer.js +146 -0
  422. package/dist/server/createServer.js +37 -8
  423. package/dist/server/promptCompletion.js +10 -3
  424. package/dist/server/registerAndroidTools.js +2 -4
  425. package/dist/server/registerApplicationTools/helpers.js +2 -4
  426. package/dist/server/registerArtifactComparisonTool.js +11 -7
  427. package/dist/server/registerBinaryDiagnosticsTools.js +15 -0
  428. package/dist/server/registerBrowserScenarioTool.js +2 -4
  429. package/dist/server/registerBrowserTools.js +2 -4
  430. package/dist/server/registerBundleComparisonTool.js +2 -3
  431. package/dist/server/registerCloseLifecycleTool.js +8 -18
  432. package/dist/server/registerElectronTools.js +2 -4
  433. package/dist/server/registerEnhancedTools.js +18 -59
  434. package/dist/server/registerEvidenceTools.js +3 -5
  435. package/dist/server/registerEvmTools.js +15 -0
  436. package/dist/server/registerFirmwareTools.js +2 -4
  437. package/dist/server/registerFunctionComparisonTool.js +10 -6
  438. package/dist/server/registerInvestigationTools.js +7 -7
  439. package/dist/server/registerJavaScriptRecoveryTool.js +2 -4
  440. package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
  441. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -4
  442. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +2 -4
  443. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +2 -4
  444. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -4
  445. package/dist/server/registerOfficialTools.js +2 -4
  446. package/dist/server/registerProcessComparisonTool.js +72 -46
  447. package/dist/server/registerRecordedCrashTools.js +15 -0
  448. package/dist/server/registerSessionRecordTools.js +5 -6
  449. package/dist/server/registerSessionStatusTool.js +17 -3
  450. package/dist/server/registerSessionTools.js +13 -5
  451. package/dist/server/registerWebModuleTool.js +2 -4
  452. package/dist/server/registerWebNetworkCaptureTool.js +26 -0
  453. package/dist/server/registerWebRuntimeTools.js +3 -7
  454. package/dist/server/registerWebScriptTool.js +2 -4
  455. package/dist/server/registerWebSourceLocationTool.js +2 -4
  456. package/dist/server/runDerivedOperation.js +15 -3
  457. package/dist/server/sessionAvailabilityPolicy.js +3 -1
  458. package/dist/server/sessionToolPolicies.js +1 -1
  459. package/dist/server/toolRegistrationOptions.js +2 -2
  460. package/dist/server/toolResult.js +63 -11
  461. package/dist/server/toolResultEncoding.js +33 -0
  462. package/install.sh +1 -1
  463. package/native/windows/build/manifest.json +2 -2
  464. package/native/windows/build/rea-windows-x64.node +0 -0
  465. package/package.json +42 -9
  466. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  467. package/scripts/electron-active-hook.cjs +241 -37
  468. package/scripts/rea.mjs +11 -3
  469. package/skills/reverse-engineer-anything/SKILL.md +32 -4
  470. package/skills/reverse-engineer-anything/references/javascript-applications.md +8 -1
  471. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +29 -0
  472. package/third_party/README.md +60 -0
  473. package/third_party/evmole/LICENSE +21 -0
  474. package/third_party/evmole/README.md +22 -0
  475. package/third_party/pwndbg/LICENSE.md +21 -0
  476. package/third_party/pwndbg/README.md +23 -0
  477. package/third_party/pwntools/README.md +40 -0
  478. package/dist/application/AuthorizedArtifactInventory.js +0 -7
  479. package/dist/application/ProcessCaptureLifecycle.js +0 -299
  480. package/dist/application/StoreFileLock.js +0 -124
  481. package/dist/contracts/processCaptureExample.js +0 -2
  482. package/dist/domain/bytecodeProvider.js +0 -178
  483. package/dist/domain/customProtocolCapture.js +0 -137
  484. package/dist/domain/eventProcessTree.js +0 -225
  485. package/dist/domain/mobileApplicationInvestigation.js +0 -159
  486. package/dist/domain/packageAnalysis.js +0 -123
  487. package/dist/domain/peInspection.js +0 -197
  488. package/dist/domain/processCaptureParsing.js +0 -21
  489. package/dist/domain/protocolCapture.js +0 -217
  490. package/dist/domain/runtimeIdentification.js +0 -212
  491. package/dist/generatedMcpToolCatalog.js +0 -37
  492. package/dist/ghidra/GhidraDefaults.js +0 -2
  493. /package/dist/application/{ArtifactExtractionDestination.js → artifacts/ArtifactExtractionDestination.js} +0 -0
  494. /package/dist/{application/ArtifactInventory → artifacts/inventory}/policy.js +0 -0
  495. /package/dist/{application/ArtifactInventory → artifacts/inventory}/types.js +0 -0
  496. /package/dist/domain/{processEvidenceProvider.js → process/processEvidenceProvider.js} +0 -0
  497. /package/dist/domain/{processTraceComparison.js → process/processTraceComparison.js} +0 -0
  498. /package/dist/domain/{processTraceDimensionProjection.js → process/processTraceDimensionProjection.js} +0 -0
  499. /package/dist/domain/{processTraceEvaluation.js → process/processTraceEvaluation.js} +0 -0
  500. /package/dist/{application → process/capture}/FilesystemSnapshot.js +0 -0
  501. /package/dist/{application → process/capture}/ProcessCaptureEnvironment.js +0 -0
  502. /package/dist/{application → process/capture}/ProcessCaptureJournal.js +0 -0
  503. /package/dist/{application → process/capture}/ProcessFilesystemEffects.js +0 -0
  504. /package/dist/{application → process/capture}/ProcessNormalization.js +0 -0
  505. /package/dist/{application → process/capture}/ProcessScenarioRuntimeValidation.js +0 -0
  506. /package/dist/{application → process/capture}/ProcessTimer.js +0 -0
  507. /package/dist/{application → process/capture}/TerminalRenderer.js +0 -0
@@ -0,0 +1,180 @@
1
+ import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
2
+ import { AnalysisError, } from "../../domain/analysisErrorBase.js";
3
+ import { AnalysisAccessDeniedError, AnalysisArtifactChangedError, AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, AnalysisTimeoutError, AnalysisResourceConstraintError, } from "../../domain/analysisErrorCore.js";
4
+ import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
5
+ import { ProviderCleanupError } from "../../domain/providerCleanupError.js";
6
+ import { ProviderSelectionError } from "../../domain/providerSelectionError.js";
7
+ import { OwnedCommandFailure } from "../../process/OwnedCommand.js";
8
+ import { PWNTOOLS_PROVIDER_IDENTITY, PWNTOOLS_LIMITS, PWNTOOLS_MEMORY_FAILURE_EXIT, PWNTOOLS_FILE_SIZE_FAILURE_EXIT, } from "./PwntoolsRelease.js";
9
+ const DEFAULT_CONTEXT = {
10
+ operation: "inspect_binary_layout",
11
+ providerId: PWNTOOLS_PROVIDER_IDENTITY.id,
12
+ };
13
+ /** Keep read, engine, output and owned-lifecycle failure reasons distinct. */
14
+ export const pwntoolsDecoderFailure = (cause, phase, path, executablePath = path, failureEvidence = {}, context = DEFAULT_CONTEXT) => {
15
+ const limitReport = failureEvidence.limits;
16
+ if (cause instanceof AnalysisError)
17
+ return cause;
18
+ if (cause instanceof OwnedCommandFailure) {
19
+ const currentOutput = cause.snapshot === null
20
+ ? undefined
21
+ : capturedPwntoolsOutput(cause.snapshot);
22
+ const combinedOutput = context.precedingOutput === undefined
23
+ ? currentOutput
24
+ : currentOutput === undefined
25
+ ? context.precedingOutput
26
+ : {
27
+ stdout: `[core decoder]\n${context.precedingOutput.stdout}\n[debugger]\n${currentOutput.stdout}`,
28
+ stderr: `[core decoder]\n${context.precedingOutput.stderr}\n[debugger]\n${currentOutput.stderr}`,
29
+ truncated: context.precedingOutput.truncated || currentOutput.truncated,
30
+ };
31
+ const outputOptions = combinedOutput === undefined
32
+ ? undefined
33
+ : { capturedOutput: combinedOutput };
34
+ if (cause.cleanupFailure !== null)
35
+ return new ProviderCleanupError(context.providerId, cause.resources, {
36
+ reason: cause.cleanupFailure,
37
+ ...(combinedOutput === undefined
38
+ ? {}
39
+ : {
40
+ captured_output: { ...combinedOutput },
41
+ }),
42
+ previous_error: {
43
+ failure_kind: cause.reason,
44
+ message: cause.message,
45
+ exit_code: cause.snapshot?.exitCode ?? null,
46
+ signal: cause.snapshot?.signal ?? null,
47
+ stdout: cause.snapshot?.stdout.text ?? null,
48
+ stderr: cause.snapshot?.stderr.text ?? null,
49
+ },
50
+ }, { operation: context.operation, cause });
51
+ if (cause.reason === "cancelled")
52
+ return new AnalysisCancelledError(context.operation, outputOptions);
53
+ if (cause.reason === "timeout")
54
+ return new AnalysisTimeoutError(context.operation, PWNTOOLS_LIMITS.timeoutMs, outputOptions);
55
+ if (cause.reason === "output-limit")
56
+ return new AnalysisOutputError(context.operation, cause.message, outputOptions);
57
+ if (cause.reason === "process" &&
58
+ (cause.snapshot?.signal === "SIGXFSZ" ||
59
+ (failureEvidence.marker?.resource === "file-size" &&
60
+ cause.snapshot?.exitCode === PWNTOOLS_FILE_SIZE_FAILURE_EXIT &&
61
+ cause.snapshot.signal === null)))
62
+ return new AnalysisResourceConstraintError(context.operation, "file-size", (cause.snapshot.signal === "SIGXFSZ"
63
+ ? "Owned Python terminated with SIGXFSZ; the exact signal cause is unknown."
64
+ : "The owned Python bridge reported EFBIG while writing a file; the exact write failure cause is unknown.") +
65
+ (limitReport?.failure === null || limitReport === undefined
66
+ ? ""
67
+ : ` Effective limit report unavailable: ${limitReport.failure}`), limitReport?.limits ?? null, outputOptions);
68
+ if (cause.reason === "process" && cause.snapshot?.signal === "SIGXCPU")
69
+ return new AnalysisResourceConstraintError(context.operation, "cpu", "Owned Python terminated with SIGXCPU; the exact signal cause is unknown." +
70
+ (limitReport?.failure === null || limitReport === undefined
71
+ ? ""
72
+ : ` Effective limit report unavailable: ${limitReport.failure}`), limitReport?.limits ?? null, outputOptions);
73
+ if (cause.reason === "process" &&
74
+ failureEvidence.marker?.resource === "memory" &&
75
+ cause.snapshot?.exitCode === PWNTOOLS_MEMORY_FAILURE_EXIT &&
76
+ cause.snapshot.signal === null)
77
+ return new AnalysisResourceConstraintError(context.operation, "memory", "The owned Python bridge reported a memory allocation failure without a structured reply; the exact allocation cause is unknown." +
78
+ (limitReport?.failure === null || limitReport === undefined
79
+ ? ""
80
+ : ` Effective limit report unavailable: ${limitReport.failure}`), limitReport?.limits ?? null, outputOptions);
81
+ }
82
+ if (cause instanceof Error &&
83
+ "code" in cause &&
84
+ "syscall" in cause &&
85
+ typeof cause.syscall === "string" &&
86
+ cause.syscall.startsWith("spawn "))
87
+ return pwntoolsUnavailable(`Selected Python could not launch (${String(cause.code)}): ${executablePath}. Check the configured executable, its interpreter and host execute access.`, executablePath, String(cause.code), undefined, context);
88
+ if (cause instanceof ArtifactReaderFailure) {
89
+ if (cause.reason === "integrity")
90
+ return new AnalysisArtifactChangedError(context.operation, path, cause.message, {
91
+ cause,
92
+ });
93
+ if (cause.reason === "cancelled")
94
+ return new AnalysisCancelledError(context.operation);
95
+ if (cause.reason === "limit" ||
96
+ cause.reason === "path" ||
97
+ cause.reason === "format")
98
+ return new AnalysisInputError(context.operation, { cause }, [
99
+ {
100
+ path: ["path"],
101
+ reason: cause.reason === "limit" ? "out_of_range" : "invalid_format",
102
+ message: cause.message,
103
+ },
104
+ ]);
105
+ }
106
+ if (cause instanceof Error && "code" in cause) {
107
+ if (phase === "configuration")
108
+ return pwntoolsUnavailable(`Selected Python executable is unavailable (${String(cause.code)}): ${path}. Check the caller-selected path and execute access.`, path, String(cause.code), undefined, context);
109
+ if (phase === "artifact-read" &&
110
+ (cause.code === "EACCES" || cause.code === "EPERM"))
111
+ return new AnalysisAccessDeniedError(context.operation, path, cause.code, {
112
+ cause,
113
+ });
114
+ if (phase === "artifact-read" &&
115
+ (cause.code === "ENOENT" || cause.code === "ENOTDIR"))
116
+ return new AnalysisInputError(context.operation, { cause }, [
117
+ {
118
+ path: ["path"],
119
+ reason: "invalid_value",
120
+ message: `Selected object could not be read (${String(cause.code)}): ${path}.`,
121
+ },
122
+ ]);
123
+ }
124
+ return new ProviderAdapterError(context.providerId, context.operation, {
125
+ cause,
126
+ diagnostics: {
127
+ phase,
128
+ path,
129
+ ...(context.precedingOutput === undefined
130
+ ? {}
131
+ : { preceding_output: { ...context.precedingOutput } }),
132
+ reason: cause instanceof Error ? cause.message : String(cause),
133
+ ...(failureEvidence.marker === undefined
134
+ ? {}
135
+ : { resource_failure_marker: { ...failureEvidence.marker } }),
136
+ ...(cause instanceof OwnedCommandFailure
137
+ ? {
138
+ failure_kind: cause.reason,
139
+ exit_code: cause.snapshot?.exitCode ?? null,
140
+ signal: cause.snapshot?.signal ?? null,
141
+ stdout: cause.snapshot?.stdout.text ?? null,
142
+ stderr: cause.snapshot?.stderr.text ?? null,
143
+ ...(cause.snapshot === null
144
+ ? {}
145
+ : {
146
+ captured_output: {
147
+ ...capturedPwntoolsOutput(cause.snapshot),
148
+ },
149
+ }),
150
+ }
151
+ : {}),
152
+ },
153
+ });
154
+ };
155
+ /** Report caller-selected engine absence with its actual configuration and host constraint. */
156
+ export const pwntoolsUnavailable = (reason, path, systemCode, capturedOutput, context = DEFAULT_CONTEXT) => new ProviderSelectionError({
157
+ ...(capturedOutput === undefined ? {} : { capturedOutput }),
158
+ operation: context.operation,
159
+ reason: "provider_unavailable",
160
+ requestedProviderId: context.providerId,
161
+ candidateIds: [context.providerId],
162
+ rejections: [
163
+ {
164
+ providerId: context.providerId,
165
+ code: "provider_unavailable",
166
+ reason,
167
+ diagnostics: {
168
+ configuration_key: "REA_PWNTOOLS_PYTHON",
169
+ executable_path: path,
170
+ ...(systemCode === undefined ? {} : { system_code: systemCode }),
171
+ },
172
+ },
173
+ ],
174
+ });
175
+ /** Retain bounded text output and the shared supervisor's observed truncation flag. */
176
+ export const capturedPwntoolsOutput = (snapshot) => ({
177
+ stdout: snapshot.stdout.text,
178
+ stderr: snapshot.stderr.text,
179
+ truncated: snapshot.diagnosticTruncated === true,
180
+ });
@@ -0,0 +1,36 @@
1
+ import { binaryLayoutPayloadSchema, binaryLayoutSchema, } from "../../domain/native/binaryLayout.js";
2
+ import { AnalysisOutputError } from "../../domain/analysisErrorCore.js";
3
+ import { PwntoolsDecoder } from "./PwntoolsDecoder.js";
4
+ import { PWNTOOLS_PROVIDER_IDENTITY } from "./PwntoolsRelease.js";
5
+ import { PrivateRuntimeRoot } from "../../process/PrivateRuntimeRoot.js";
6
+ /** ELF-specific projection around the shared owned pwntools decoder boundary. */
7
+ export class PwntoolsLayoutProvider extends PwntoolsDecoder {
8
+ constructor(environment, launcher, createRuntime = () => PrivateRuntimeRoot.create({ prefix: "rea-elf-layout-" })) {
9
+ super({
10
+ identity: PWNTOOLS_PROVIDER_IDENTITY,
11
+ operation: "inspect_binary_layout",
12
+ bridge: new URL("../../../bridge/pwntools/layout.py", import.meta.url),
13
+ payloadSchema: binaryLayoutPayloadSchema,
14
+ project: ({ input, payload, snapshot, diagnostics }) => {
15
+ const value = binaryLayoutSchema.safeParse({
16
+ ...payload,
17
+ artifact: {
18
+ path: input.path,
19
+ sha256: snapshot.sha256,
20
+ bytes: snapshot.bytes.length,
21
+ },
22
+ diagnostics,
23
+ });
24
+ if (!value.success)
25
+ throw new AnalysisOutputError("inspect_binary_layout", `ELF reply contains invalid source ranges or value meanings: ${value.error.issues[0]?.message ?? "schema mismatch"}`, { capturedOutput: diagnostics });
26
+ for (const table of value.data.packed_relative_relocations) {
27
+ const start = Number(BigInt(table.location.offset));
28
+ const length = Number(BigInt(table.location.bytes));
29
+ if (!Buffer.from(table.encoded_bytes_base64, "base64").equals(snapshot.bytes.subarray(start, start + length)))
30
+ throw new AnalysisOutputError("inspect_binary_layout", "Reported packed relocation bytes differ from the selected snapshot at their original file range.", { capturedOutput: diagnostics });
31
+ }
32
+ return value.data;
33
+ },
34
+ }, environment, launcher, createRuntime);
35
+ }
36
+ }
@@ -0,0 +1,75 @@
1
+ import { AnalysisOutputError } from "../../domain/analysisErrorCore.js";
2
+ import { recordedCrashPayloadSchema, recordedCrashSchema, } from "../../domain/native/recordedCrash.js";
3
+ import { PrivateRuntimeRoot } from "../../process/PrivateRuntimeRoot.js";
4
+ import { PwntoolsDecoder } from "./PwntoolsDecoder.js";
5
+ import { PWNTOOLS_PROVIDER_IDENTITY } from "./PwntoolsRelease.js";
6
+ import { validateRecordedCrashSources } from "./RecordedCrashSourceBindings.js";
7
+ import { validateRecordedCrashStructure } from "./RecordedCrashStructureBindings.js";
8
+ import { inspectPwndbgCore, recordedCrashStageOutput, } from "../pwndbg/PwndbgCoreContext.js";
9
+ /** Preserve every recorded thread while optionally enriching the same owned snapshot. */
10
+ export class PwntoolsRecordedCrashProvider extends PwntoolsDecoder {
11
+ constructor(environment, launcher, createRuntime = () => PrivateRuntimeRoot.create({ prefix: "rea-recorded-crash-" })) {
12
+ super({
13
+ identity: PWNTOOLS_PROVIDER_IDENTITY,
14
+ operation: "inspect_recorded_crash",
15
+ bridge: new URL("../../../bridge/pwntools/recorded_crash.py", import.meta.url),
16
+ payloadSchema: recordedCrashPayloadSchema,
17
+ project: async ({ input, payload, snapshot, rootPath, diagnostics, options, }) => {
18
+ const validate = (debuggerContext) => recordedCrashSchema.safeParse({
19
+ ...payload,
20
+ artifact: {
21
+ path: input.path,
22
+ sha256: snapshot.sha256,
23
+ bytes: snapshot.bytes.length,
24
+ },
25
+ debugger: debuggerContext,
26
+ decoder_diagnostics: diagnostics,
27
+ diagnostics: debuggerContext.status === "available"
28
+ ? recordedCrashStageOutput(diagnostics, debuggerContext.diagnostics)
29
+ : diagnostics,
30
+ });
31
+ const checked = validate({ status: "not-requested" });
32
+ if (!checked.success)
33
+ throw new AnalysisOutputError("inspect_recorded_crash", `Recorded core reply is invalid: ${checked.error.issues[0]?.message ?? "schema mismatch"}`, { capturedOutput: diagnostics });
34
+ const value = checked.data;
35
+ validateRecordedCrashStructure(value, snapshot.bytes, diagnostics);
36
+ const checkBytes = (raw, range) => {
37
+ const start = Number(BigInt(range.offset));
38
+ const length = Number(BigInt(range.bytes));
39
+ if (!Buffer.from(raw, "base64").equals(snapshot.bytes.subarray(start, start + length)))
40
+ throw new AnalysisOutputError("inspect_recorded_crash", "Reported raw note bytes differ from the selected snapshot.", { capturedOutput: diagnostics });
41
+ };
42
+ for (const note of value.notes) {
43
+ checkBytes(note.owner_bytes_base64, note.owner_location);
44
+ checkBytes(note.descriptor_bytes_base64, note.descriptor_location);
45
+ }
46
+ for (const padding of value.note_padding)
47
+ checkBytes(padding.bytes_base64, padding.location);
48
+ validateRecordedCrashSources(value, snapshot.bytes, diagnostics);
49
+ for (const thread of value.threads)
50
+ for (const register of thread.registers) {
51
+ const start = Number(BigInt(register.location.offset));
52
+ if (snapshot.bytes.readBigUInt64LE(start) !== BigInt(register.value))
53
+ throw new AnalysisOutputError("inspect_recorded_crash", "Reported register value differs from its recorded source bytes.", { capturedOutput: diagnostics });
54
+ }
55
+ if (!input.include_debugger_context)
56
+ return value;
57
+ const context = await inspectPwndbgCore({
58
+ environment,
59
+ rootPath,
60
+ diagnostics,
61
+ options,
62
+ ...(launcher === undefined ? {} : { launcher }),
63
+ });
64
+ const enriched = validate(context);
65
+ if (!enriched.success)
66
+ throw new AnalysisOutputError("inspect_recorded_crash", `Recorded debugger context is invalid: ${enriched.error.issues[0]?.message ?? "schema mismatch"}`, {
67
+ capturedOutput: context.status === "available"
68
+ ? recordedCrashStageOutput(diagnostics, context.diagnostics)
69
+ : diagnostics,
70
+ });
71
+ return enriched.data;
72
+ },
73
+ }, environment, launcher, createRuntime);
74
+ }
75
+ }
@@ -0,0 +1,19 @@
1
+ /** Verified unchanged upstream profile for the Linux ELF adapter. */
2
+ export const PWNTOOLS_PROVIDER_IDENTITY = {
3
+ id: "pwntools-elf",
4
+ name: "REA pwntools ELF adapter",
5
+ version: "pwntools@4.15.0;pyelftools@0.33;unicorn@2.1.2",
6
+ };
7
+ /** Bridge-reserved status for MemoryError when no structured reply can be written. */
8
+ export const PWNTOOLS_MEMORY_FAILURE_EXIT = 75;
9
+ /** Bridge-reserved status for an observed EFBIG failure without a complete reply. */
10
+ export const PWNTOOLS_FILE_SIZE_FAILURE_EXIT = 76;
11
+ /** Complete evidence budgets; address-space is separate from resident memory. */
12
+ export const PWNTOOLS_LIMITS = {
13
+ inputBytes: 32 * 1024 * 1024,
14
+ outputBytes: 64 * 1024 * 1024,
15
+ diagnosticBytes: 1024 * 1024,
16
+ timeoutMs: 30_000,
17
+ addressSpaceBytes: 3 * 1024 * 1024 * 1024,
18
+ cpuSeconds: 30,
19
+ };
@@ -0,0 +1,76 @@
1
+ import { join } from "node:path";
2
+ import { readStableArtifact } from "../../artifacts/readStableArtifact.js";
3
+ import { OwnedCommandFailure } from "../../process/OwnedCommand.js";
4
+ import { PWNTOOLS_MEMORY_FAILURE_EXIT, PWNTOOLS_FILE_SIZE_FAILURE_EXIT, } from "./PwntoolsRelease.js";
5
+ import { z } from "zod";
6
+ import { PWNTOOLS_LIMITS } from "./PwntoolsRelease.js";
7
+ /** Actual limits reported by the owned bridge after lowering inherited soft limits. */
8
+ export const pwntoolsResourceLimitsSchema = z.strictObject({
9
+ address_space_bytes: z
10
+ .number()
11
+ .int()
12
+ .nonnegative()
13
+ .max(PWNTOOLS_LIMITS.addressSpaceBytes),
14
+ cpu_seconds: z.number().int().nonnegative().max(PWNTOOLS_LIMITS.cpuSeconds),
15
+ file_size_bytes: z
16
+ .number()
17
+ .int()
18
+ .nonnegative()
19
+ .max(PWNTOOLS_LIMITS.outputBytes),
20
+ });
21
+ /** Read only bounded owned reports; unverified reserved statuses stay unclassified. */
22
+ export const readPwntoolsFailureEvidence = async (cause, rootPath) => {
23
+ let limitReport;
24
+ let marker;
25
+ if (cause instanceof OwnedCommandFailure &&
26
+ cause.snapshot?.signal === null &&
27
+ (cause.snapshot.exitCode === PWNTOOLS_MEMORY_FAILURE_EXIT ||
28
+ cause.snapshot.exitCode === PWNTOOLS_FILE_SIZE_FAILURE_EXIT) &&
29
+ rootPath !== undefined) {
30
+ try {
31
+ const reported = await readStableArtifact(join(rootPath, "resource.failure"), 1);
32
+ const expected = cause.snapshot.exitCode === PWNTOOLS_MEMORY_FAILURE_EXIT ? "M" : "F";
33
+ if (!reported.bytes.equals(Buffer.from(expected, "ascii")))
34
+ throw new Error("Private bridge failure marker does not match the observed exit status.");
35
+ marker = {
36
+ resource: expected === "M" ? "memory" : "file-size",
37
+ failure: null,
38
+ };
39
+ }
40
+ catch (markerFailure) {
41
+ marker = {
42
+ resource: null,
43
+ failure: markerFailure instanceof Error
44
+ ? markerFailure.message
45
+ : String(markerFailure),
46
+ };
47
+ }
48
+ }
49
+ if (cause instanceof OwnedCommandFailure &&
50
+ (cause.snapshot?.signal === "SIGXCPU" ||
51
+ cause.snapshot?.signal === "SIGXFSZ" ||
52
+ ((cause.snapshot?.exitCode === PWNTOOLS_FILE_SIZE_FAILURE_EXIT ||
53
+ cause.snapshot?.exitCode === PWNTOOLS_MEMORY_FAILURE_EXIT) &&
54
+ cause.snapshot.signal === null)) &&
55
+ rootPath !== undefined) {
56
+ try {
57
+ const reported = await readStableArtifact(join(rootPath, "limits.json"), 4096);
58
+ limitReport = {
59
+ limits: pwntoolsResourceLimitsSchema.parse(JSON.parse(reported.bytes.toString("utf8"))),
60
+ failure: null,
61
+ };
62
+ }
63
+ catch (reportFailure) {
64
+ limitReport = {
65
+ limits: null,
66
+ failure: reportFailure instanceof Error
67
+ ? reportFailure.message
68
+ : String(reportFailure),
69
+ };
70
+ }
71
+ }
72
+ return {
73
+ ...(limitReport === undefined ? {} : { limits: limitReport }),
74
+ ...(marker === undefined ? {} : { marker }),
75
+ };
76
+ };
@@ -0,0 +1,46 @@
1
+ import { AnalysisOutputError } from "../../domain/analysisErrorCore.js";
2
+ import { RECORDED_LINUX_AMD64_REGISTERS, } from "../../domain/native/recordedCrash.js";
3
+ const registerOffsets = new Map(RECORDED_LINUX_AMD64_REGISTERS.map((name, index) => [name, 112 + index * 8]));
4
+ /** Bind interpreted values and register identities to Linux amd64 source bytes. */
5
+ export function validateRecordedCrashSources(report, snapshot, diagnostics) {
6
+ const fail = () => {
7
+ throw new AnalysisOutputError("inspect_recorded_crash", "Reported PID or signal value differs from its recorded Linux amd64 source bytes.", { capturedOutput: diagnostics });
8
+ };
9
+ const descriptor = (noteIndex, minimumBytes) => {
10
+ const note = report.notes[noteIndex];
11
+ if (note === undefined)
12
+ return fail();
13
+ const start = Number(BigInt(note.descriptor_location.offset));
14
+ const length = Number(BigInt(note.descriptor_location.bytes));
15
+ if (length < minimumBytes)
16
+ return fail();
17
+ return snapshot.subarray(start, start + length);
18
+ };
19
+ // Fixed offsets independently checked against unchanged pwntools 4.15.0
20
+ // elf_prstatus_amd64 / elf_siginfo_64; this is the sole supported note ABI.
21
+ for (const thread of report.threads) {
22
+ const bytes = descriptor(thread.note_index, 336);
23
+ if (thread.historical_pid !== bytes.readInt32LE(32) ||
24
+ thread.recorded_current_signal !== bytes.readInt16LE(12))
25
+ fail();
26
+ const note = report.notes[thread.note_index];
27
+ if (note === undefined)
28
+ return fail();
29
+ for (const register of thread.registers) {
30
+ const offset = registerOffsets.get(register.name);
31
+ if (offset === undefined ||
32
+ BigInt(register.location.offset) !==
33
+ BigInt(note.descriptor_location.offset) + BigInt(offset))
34
+ throw new AnalysisOutputError("inspect_recorded_crash", "Reported register source does not match its Linux amd64 register identity.", { capturedOutput: diagnostics });
35
+ }
36
+ }
37
+ for (const signal of report.signals) {
38
+ const bytes = descriptor(signal.note_index, 32);
39
+ if (signal.number !== bytes.readInt32LE(0) ||
40
+ signal.errno !== bytes.readInt32LE(4) ||
41
+ signal.code !== bytes.readInt32LE(8) ||
42
+ (signal.fault_address !== null &&
43
+ BigInt(signal.fault_address) !== bytes.readBigUInt64LE(16)))
44
+ fail();
45
+ }
46
+ }
@@ -0,0 +1,103 @@
1
+ import { AnalysisOutputError } from "../../domain/analysisErrorCore.js";
2
+ // Exact amd64/core enum projections in the pinned pyelftools 0.33 profile.
3
+ const segmentKinds = new Map([
4
+ [0, "PT_NULL"],
5
+ [1, "PT_LOAD"],
6
+ [2, "PT_DYNAMIC"],
7
+ [3, "PT_INTERP"],
8
+ [4, "PT_NOTE"],
9
+ [5, "PT_SHLIB"],
10
+ [6, "PT_PHDR"],
11
+ [7, "PT_TLS"],
12
+ [0x60000000, "PT_LOOS"],
13
+ [0x6fffffff, "PT_HIOS"],
14
+ [0x6474e550, "PT_GNU_EH_FRAME"],
15
+ [0x6474e551, "PT_GNU_STACK"],
16
+ [0x6474e552, "PT_GNU_RELRO"],
17
+ [0x6474e553, "PT_GNU_PROPERTY"],
18
+ ]);
19
+ const noteKinds = new Map([
20
+ [1, "NT_PRSTATUS"],
21
+ [2, "NT_FPREGSET"],
22
+ [3, "NT_PRPSINFO"],
23
+ [4, "NT_TASKSTRUCT"],
24
+ [6, "NT_AUXV"],
25
+ [0x53494749, "NT_SIGINFO"],
26
+ [0x46494c45, "NT_FILE"],
27
+ ]);
28
+ const matchesKind = (raw, reported, kinds) => {
29
+ const known = kinds.get(raw);
30
+ return typeof reported === "string"
31
+ ? reported === known
32
+ : known === undefined && reported === raw;
33
+ };
34
+ const segmentMatches = (segment, raw) => {
35
+ const type = raw.readUInt32LE(0);
36
+ return (matchesKind(type, segment.type, segmentKinds) &&
37
+ BigInt(segment.flags) === BigInt(raw.readUInt32LE(4)) &&
38
+ segment.file_backing ===
39
+ (type === 0 || raw.readBigUInt64LE(32) === 0n ? "none" : "file") &&
40
+ [
41
+ [segment.offset, 8],
42
+ [segment.virtual_address, 16],
43
+ [segment.physical_address, 24],
44
+ [segment.file_size, 32],
45
+ [segment.memory_size, 40],
46
+ [segment.alignment, 48],
47
+ ].every(([field, relative]) => BigInt(field) === raw.readBigUInt64LE(relative)));
48
+ };
49
+ /** Bind coverage-bearing ELF and note headers to the same snapshot as their payloads. */
50
+ export function validateRecordedCrashStructure(report, snapshot, diagnostics) {
51
+ const fail = () => {
52
+ throw new AnalysisOutputError("inspect_recorded_crash", "Reported core structure differs from its original ELF/note headers.", { capturedOutput: diagnostics });
53
+ };
54
+ const bytesAt = (offset, bytes) => {
55
+ if (offset < 0n || offset > BigInt(snapshot.length - bytes))
56
+ return fail();
57
+ return snapshot.subarray(Number(offset), Number(offset) + bytes);
58
+ };
59
+ const header = bytesAt(0n, 64);
60
+ if (!header
61
+ .subarray(0, 6)
62
+ .equals(Buffer.from([0x7f, 0x45, 0x4c, 0x46, 2, 1])) ||
63
+ header[6] !== 1 ||
64
+ header.readUInt32LE(20) !== 1 ||
65
+ ![0, 3].includes(header[7] ?? -1) ||
66
+ header[8] !== 0 ||
67
+ header.readUInt16LE(16) !== 4 ||
68
+ header.readUInt16LE(18) !== 62)
69
+ fail();
70
+ const table = header.readBigUInt64LE(32);
71
+ const entryBytes = header.readUInt16LE(54);
72
+ let count = header.readUInt16LE(56);
73
+ if (count === 0xffff) {
74
+ if (header.readUInt16LE(58) < 64)
75
+ return fail();
76
+ count = bytesAt(header.readBigUInt64LE(40), 64).readUInt32LE(44);
77
+ }
78
+ if (count !== report.segments.length || (count > 0 && entryBytes < 56))
79
+ fail();
80
+ for (const segment of report.segments) {
81
+ const offset = table + BigInt(segment.index) * BigInt(entryBytes);
82
+ if (BigInt(segment.header_location.offset) !== offset ||
83
+ BigInt(segment.header_location.bytes) !== BigInt(entryBytes))
84
+ fail();
85
+ const raw = bytesAt(offset, entryBytes);
86
+ if (!segmentMatches(segment, raw))
87
+ fail();
88
+ }
89
+ for (const note of report.notes) {
90
+ const raw = bytesAt(BigInt(note.location.offset), 12);
91
+ if (BigInt(note.owner_location.bytes) !== BigInt(raw.readUInt32LE(0)) ||
92
+ BigInt(note.descriptor_location.bytes) !== BigInt(raw.readUInt32LE(4)) ||
93
+ !matchesKind(raw.readUInt32LE(8), note.type, noteKinds))
94
+ fail();
95
+ const owner = bytesAt(BigInt(note.owner_location.offset), raw.readUInt32LE(0));
96
+ const terminator = owner.indexOf(0);
97
+ const display = owner.length === 0
98
+ ? null
99
+ : owner.subarray(0, terminator).toString("utf8");
100
+ if ((owner.length > 0 && terminator < 0) || note.owner_display !== display)
101
+ fail();
102
+ }
103
+ }