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,297 @@
1
+ import Darwin
2
+ import Foundation
3
+
4
+ struct RunTokenObservation: Encodable {
5
+ let pid: Int32
6
+ let state: String
7
+ let run_id: String?
8
+ let reason: String?
9
+ }
10
+
11
+ struct ProcessIdentityObservation: Encodable {
12
+ let pid: Int32
13
+ let state: String
14
+ let identity: String?
15
+ let reason: String?
16
+ }
17
+
18
+ private struct ProcessMetadata {
19
+ let identity: String
20
+ let pointerSize: Int
21
+ }
22
+
23
+ struct ProcessSnapshot {
24
+ fileprivate let metadata: [Int32: ProcessMetadata]
25
+ let failure: String?
26
+ }
27
+
28
+ typealias ProcessTableSysctlCall = (
29
+ _ mib: inout [Int32],
30
+ _ output: UnsafeMutableRawPointer?,
31
+ _ size: inout Int
32
+ ) -> Int32
33
+
34
+ private func readProcessSnapshot() -> ProcessSnapshot {
35
+ readProcessSnapshot { mib, output, size in
36
+ sysctl(&mib, u_int(mib.count), output, &size, nil, 0)
37
+ }
38
+ }
39
+
40
+ func readProcessSnapshot(
41
+ sysctlCall: ProcessTableSysctlCall
42
+ ) -> ProcessSnapshot {
43
+ for _ in 0..<3 {
44
+ var mib = [CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0]
45
+ var size = 0
46
+ guard sysctlCall(&mib, nil, &size) == 0 else {
47
+ let failure = errno
48
+ return ProcessSnapshot(metadata: [:], failure: "process_table_failed_\(failure)")
49
+ }
50
+ guard size >= MemoryLayout<kinfo_proc>.size,
51
+ size % MemoryLayout<kinfo_proc>.stride == 0 else {
52
+ return ProcessSnapshot(metadata: [:], failure: "process_table_failed_\(errno)")
53
+ }
54
+ var processes = [kinfo_proc](
55
+ repeating: kinfo_proc(),
56
+ count: size / MemoryLayout<kinfo_proc>.stride
57
+ )
58
+ let result = processes.withUnsafeMutableBufferPointer { buffer in
59
+ let output = buffer.baseAddress.map { UnsafeMutableRawPointer($0) }
60
+ return sysctlCall(&mib, output, &size)
61
+ }
62
+ guard result == 0 else {
63
+ let failure = errno
64
+ if failure == ENOMEM { continue }
65
+ return ProcessSnapshot(metadata: [:], failure: "process_table_failed_\(failure)")
66
+ }
67
+ guard size % MemoryLayout<kinfo_proc>.stride == 0 else {
68
+ return ProcessSnapshot(metadata: [:], failure: "process_table_failed_\(errno)")
69
+ }
70
+ let processCount = size / MemoryLayout<kinfo_proc>.stride
71
+ let metadata = Dictionary(
72
+ processes.prefix(processCount).map { process in
73
+ let start = process.kp_proc.p_starttime
74
+ return (
75
+ process.kp_proc.p_pid,
76
+ ProcessMetadata(
77
+ identity: "\(start.tv_sec):\(start.tv_usec)",
78
+ pointerSize: process.kp_proc.p_flag & P_LP64 != 0 ? 8 : 4
79
+ )
80
+ )
81
+ },
82
+ uniquingKeysWith: { first, _ in first }
83
+ )
84
+ return ProcessSnapshot(metadata: metadata, failure: nil)
85
+ }
86
+ return ProcessSnapshot(metadata: [:], failure: "process_table_failed_\(ENOMEM)")
87
+ }
88
+
89
+ func readProcessIdentities(pids: [Int32]) -> [ProcessIdentityObservation] {
90
+ let snapshot = readProcessSnapshot()
91
+ return pids.map { pid in
92
+ guard let metadata = snapshot.metadata[pid] else {
93
+ return unavailableIdentity(
94
+ pid: pid,
95
+ reason: snapshot.failure ?? "process_not_in_snapshot"
96
+ )
97
+ }
98
+ return ProcessIdentityObservation(pid: pid, state: "readable", identity: metadata.identity, reason: nil)
99
+ }
100
+ }
101
+
102
+ private func unavailableIdentity(pid: Int32, reason: String) -> ProcessIdentityObservation {
103
+ ProcessIdentityObservation(pid: pid, state: "unavailable", identity: nil, reason: reason)
104
+ }
105
+
106
+ enum RunTokenReadError: Error {
107
+ case invalidBuffer
108
+ case duplicateToken
109
+ case invalidTokenEncoding
110
+ case environmentUnavailable
111
+ case appleVectorUnavailable
112
+ case ambiguousEnvironmentBoundary
113
+ }
114
+
115
+ @_silgen_name("csops")
116
+ private func csops(
117
+ _ pid: Int32,
118
+ _ ops: UInt32,
119
+ _ addr: UnsafeMutableRawPointer?,
120
+ _ size: Int
121
+ ) -> Int32
122
+
123
+ private let csOpsStatus: UInt32 = 0
124
+ private let csPlatformBinary: UInt32 = 0x0400_0000
125
+
126
+ /**
127
+ * Whether the target image is an Apple platform binary. Current macOS omits
128
+ * the environment of platform binaries from KERN_PROCARGS2 for every caller,
129
+ * so this distinguishes a policy-withheld environment from a process whose
130
+ * environment is genuinely absent or transiently unreadable.
131
+ */
132
+ func isPlatformBinary(pid: Int32) -> Bool {
133
+ var flags: UInt32 = 0
134
+ let result = withUnsafeMutablePointer(to: &flags) { pointer in
135
+ csops(pid, csOpsStatus, UnsafeMutableRawPointer(pointer), MemoryLayout<UInt32>.size)
136
+ }
137
+ return result == 0 && (flags & csPlatformBinary) != 0
138
+ }
139
+
140
+ private func readRunToken(pid: Int32, pointerSize: Int) -> RunTokenObservation {
141
+ var mib = [CTL_KERN, KERN_PROCARGS2, Int32(pid)]
142
+ var size = 0
143
+ guard sysctl(&mib, u_int(mib.count), nil, &size, nil, 0) == 0, size >= MemoryLayout<Int32>.size else {
144
+ return unavailable(pid: pid, reason: "sysctl_failed_\(errno)")
145
+ }
146
+ var bytes = [UInt8](repeating: 0, count: size)
147
+ let result = bytes.withUnsafeMutableBytes { buffer in
148
+ sysctl(&mib, u_int(mib.count), buffer.baseAddress, &size, nil, 0)
149
+ }
150
+ guard result == 0 else {
151
+ return unavailable(pid: pid, reason: "sysctl_failed_\(errno)")
152
+ }
153
+ bytes = Array(bytes.prefix(size))
154
+ do {
155
+ let runId = try token(in: bytes, pointerSize: pointerSize)
156
+ // A complete empty environment is readable for an ordinary image. Apple
157
+ // platform images can expose the same layout after the kernel withholds
158
+ // their environment, so they remain explicitly unverified without a token.
159
+ if runId == nil && isPlatformBinary(pid: pid) {
160
+ return unavailable(pid: pid, reason: "platform_binary_environment_withheld")
161
+ }
162
+ return RunTokenObservation(pid: pid, state: "readable", run_id: runId, reason: nil)
163
+ } catch RunTokenReadError.duplicateToken {
164
+ return unavailable(pid: pid, reason: "duplicate_run_token")
165
+ } catch RunTokenReadError.invalidTokenEncoding {
166
+ return unavailable(pid: pid, reason: "invalid_run_token_encoding")
167
+ } catch RunTokenReadError.environmentUnavailable {
168
+ return unavailable(
169
+ pid: pid,
170
+ reason: isPlatformBinary(pid: pid)
171
+ ? "platform_binary_environment_withheld"
172
+ : "environment_unavailable"
173
+ )
174
+ } catch RunTokenReadError.appleVectorUnavailable {
175
+ return unavailable(pid: pid, reason: "apple_vector_unavailable")
176
+ } catch RunTokenReadError.ambiguousEnvironmentBoundary {
177
+ return unavailable(pid: pid, reason: "ambiguous_environment_boundary")
178
+ } catch {
179
+ return unavailable(pid: pid, reason: "malformed_procargs")
180
+ }
181
+ }
182
+
183
+ func readRunTokens(pids: [Int32]) -> [RunTokenObservation] {
184
+ let before = readProcessSnapshot()
185
+ let observations = pids.map { pid -> RunTokenObservation in
186
+ guard let metadata = before.metadata[pid] else {
187
+ return unavailable(pid: pid, reason: before.failure ?? "process_not_in_snapshot")
188
+ }
189
+ return readRunToken(pid: pid, pointerSize: metadata.pointerSize)
190
+ }
191
+ let after = readProcessSnapshot()
192
+ return zip(pids, observations).map { pid, observation in
193
+ guard let initial = before.metadata[pid], let current = after.metadata[pid] else {
194
+ return unavailable(pid: pid, reason: after.failure ?? "process_not_in_snapshot")
195
+ }
196
+ guard initial.identity == current.identity,
197
+ initial.pointerSize == current.pointerSize else {
198
+ return unavailable(pid: pid, reason: "process_identity_changed_during_token_read")
199
+ }
200
+ return observation
201
+ }
202
+ }
203
+
204
+ func token(in bytes: [UInt8], pointerSize: Int = MemoryLayout<UnsafeRawPointer>.size) throws -> String? {
205
+ guard bytes.count >= MemoryLayout<Int32>.size else { throw RunTokenReadError.invalidBuffer }
206
+ let argc = bytes.withUnsafeBytes { $0.loadUnaligned(as: Int32.self).littleEndian }
207
+ guard argc >= 0, Int(argc) <= bytes.count else { throw RunTokenReadError.invalidBuffer }
208
+ var offset = MemoryLayout<Int32>.size
209
+ guard let executablePath = readString(in: bytes, offset: &offset) else {
210
+ throw RunTokenReadError.invalidBuffer
211
+ }
212
+ guard pointerSize == 4 || pointerSize == 8 else { throw RunTokenReadError.invalidBuffer }
213
+ let pathRecordSize = Array("executable_path=".utf8).count + executablePath.count + 1
214
+ let padding = (pointerSize - pathRecordSize % pointerSize) % pointerSize
215
+ guard offset + padding <= bytes.count,
216
+ bytes[offset..<(offset + padding)].allSatisfy({ $0 == 0 }) else {
217
+ throw RunTokenReadError.invalidBuffer
218
+ }
219
+ offset += padding
220
+ for _ in 0..<argc {
221
+ guard readString(in: bytes, offset: &offset, allowEmpty: true) != nil else {
222
+ throw RunTokenReadError.invalidBuffer
223
+ }
224
+ }
225
+ guard bytes.last == 0 else { throw RunTokenReadError.invalidBuffer }
226
+ if offset == bytes.count {
227
+ throw RunTokenReadError.environmentUnavailable
228
+ }
229
+ var trailingEntries: [ArraySlice<UInt8>] = []
230
+ var zeroedAppleVectorStart: Int?
231
+ while offset < bytes.count {
232
+ if bytes[offset] == 0 {
233
+ let start = offset
234
+ while offset < bytes.count, bytes[offset] == 0 {
235
+ offset += 1
236
+ }
237
+ if offset - start > 1 {
238
+ zeroedAppleVectorStart = zeroedAppleVectorStart ?? trailingEntries.count
239
+ }
240
+ continue
241
+ }
242
+ guard let entry = readString(in: bytes, offset: &offset) else {
243
+ throw RunTokenReadError.invalidBuffer
244
+ }
245
+ trailingEntries.append(entry)
246
+ }
247
+ // XNU appends its Apple vector after the environment. libc clears the
248
+ // initial `pfz=` record after startup, leaving a multi-NUL run in its place.
249
+ // A caller can also set `pfz`, so prefer the final intact sentinel when it
250
+ // remains available and otherwise stop at the cleared record.
251
+ let intactAppleVectorStart = trailingEntries.lastIndex(where: {
252
+ $0.starts(with: Array("pfz=".utf8))
253
+ })
254
+ let preferZeroedBoundary = zeroedAppleVectorStart.flatMap { zeroedStart in
255
+ intactAppleVectorStart.map { intactStart in intactStart < zeroedStart } ?? true
256
+ } ?? false
257
+ let appleVectorStart = preferZeroedBoundary
258
+ ? zeroedAppleVectorStart
259
+ : intactAppleVectorStart
260
+ guard let appleVectorStart else {
261
+ throw RunTokenReadError.appleVectorUnavailable
262
+ }
263
+ if trailingEntries[appleVectorStart...].contains(where: {
264
+ $0.starts(with: Array("REA_PROCESS_RUN_ID=".utf8))
265
+ }) {
266
+ throw RunTokenReadError.ambiguousEnvironmentBoundary
267
+ }
268
+ let environmentEntries = trailingEntries[..<appleVectorStart]
269
+ var found: String?
270
+ for entry in environmentEntries {
271
+ if entry.starts(with: Array("REA_PROCESS_RUN_ID=".utf8)) {
272
+ guard found == nil else { throw RunTokenReadError.duplicateToken }
273
+ let value = entry.dropFirst("REA_PROCESS_RUN_ID=".utf8.count)
274
+ guard let decoded = String(bytes: value, encoding: .utf8) else {
275
+ throw RunTokenReadError.invalidTokenEncoding
276
+ }
277
+ found = decoded
278
+ }
279
+ }
280
+ return found
281
+ }
282
+
283
+ private func readString(
284
+ in bytes: [UInt8],
285
+ offset: inout Int,
286
+ allowEmpty: Bool = false
287
+ ) -> ArraySlice<UInt8>? {
288
+ guard offset < bytes.count, let end = bytes[offset...].firstIndex(of: 0),
289
+ allowEmpty || end > offset else { return nil }
290
+ let string = bytes[offset..<end]
291
+ offset = end + 1
292
+ return string
293
+ }
294
+
295
+ private func unavailable(pid: Int32, reason: String) -> RunTokenObservation {
296
+ RunTokenObservation(pid: pid, state: "unavailable", run_id: nil, reason: reason)
297
+ }
@@ -0,0 +1,35 @@
1
+ import Foundation
2
+
3
+ struct RunTokenResponse: Encodable {
4
+ let results: [RunTokenObservation]
5
+ }
6
+
7
+ struct ProcessIdentityResponse: Encodable {
8
+ let results: [ProcessIdentityObservation]
9
+ }
10
+
11
+ @main
12
+ struct ProcessRunTokenReaderMain {
13
+ static func main() {
14
+ let arguments = Array(CommandLine.arguments.dropFirst())
15
+ let identityMode = arguments.first == "--identities"
16
+ let pidArguments = identityMode ? Array(arguments.dropFirst()) : arguments
17
+ let pids = pidArguments.compactMap(Int32.init)
18
+ guard pids.count == pidArguments.count else {
19
+ fputs("invalid process ID input\n", stderr)
20
+ exit(64)
21
+ }
22
+ do {
23
+ let output: Data
24
+ if identityMode {
25
+ output = try JSONEncoder().encode(ProcessIdentityResponse(results: readProcessIdentities(pids: pids)))
26
+ } else {
27
+ output = try JSONEncoder().encode(RunTokenResponse(results: readRunTokens(pids: pids)))
28
+ }
29
+ FileHandle.standardOutput.write(output)
30
+ } catch {
31
+ fputs("could not encode process token observations\n", stderr)
32
+ exit(70)
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,101 @@
1
+ """Fixed core-only GDB/pwndbg operation; no caller commands or historical PID lookup."""
2
+ import json
3
+ import os
4
+ from pathlib import Path
5
+ import resource
6
+ import gdb
7
+
8
+ OUTPUT_BYTES = 64 * 1024 * 1024
9
+
10
+
11
+ class ContextFailure(Exception):
12
+ def __init__(self, reason, message):
13
+ super().__init__(message)
14
+ self.reason = reason
15
+
16
+
17
+ def inspect(request):
18
+ if gdb.selected_inferior().connection is not None:
19
+ raise ContextFailure("decoder", "Owned GDB unexpectedly has an inferior connection before core loading.")
20
+ root = Path(os.environ["REA_CORE_CONTEXT_REQUEST"]).parent
21
+ empty = root / "no-libraries"
22
+ empty.mkdir(mode=0o700)
23
+ for command in ["set auto-load off", "set debuginfod enabled off", "set auto-solib-add off", "set history save off", "set pagination off",
24
+ "set sysroot ./no-libraries", "set solib-search-path ./no-libraries"]:
25
+ gdb.execute(command, to_string=True)
26
+ entry = request["gdbinit"]
27
+ try:
28
+ exec(compile(Path(entry).read_bytes(), entry, "exec"), {"__name__": "__main__", "__file__": entry})
29
+ import pwndbg.aglib.vmmap
30
+ import pwndbg.lib.version
31
+ except (ImportError, OSError) as error:
32
+ raise ContextFailure("unavailable", "Selected pwndbg could not initialize: " + str(error)) from error
33
+ version = pwndbg.lib.version.__version__
34
+ if version != "2026.09.15" and not version.startswith("2026.09.15 build: "):
35
+ raise ContextFailure("unsupported", "Expected unchanged pwndbg2026.09.15; selected plugin reports " + version + ".")
36
+ gdb.execute('set context-sections ""', to_string=True)
37
+ # core-file takes a raw filename and retains quote characters. Use a fixed
38
+ # relative filename in the owned cwd so no selected path becomes GDB syntax.
39
+ if Path(request["snapshot_path"]) != root.parent / "object.snapshot":
40
+ raise ContextFailure("decoder", "Core context request did not select the shared owned snapshot.")
41
+ gdb.execute("core-file ../object.snapshot", to_string=True)
42
+ inferior = gdb.selected_inferior()
43
+ if inferior.connection is None or inferior.connection.type != "core" or gdb.current_progspace().filename is not None:
44
+ raise ContextFailure("decoder", "Requested core-only boundary was not established; no mapping query performed.")
45
+ maps = []
46
+ for page in pwndbg.aglib.vmmap.get():
47
+ flags = page.flags
48
+ maps.append({"start": hex(page.start), "end": hex(page.end), "offset": hex(page.offset), "reported_flags": flags,
49
+ "permissions": {"read": bool(flags & 4), "write": bool(flags & 2), "execute": bool(flags & 1)} if 1 <= flags <= 7 else None,
50
+ "pathname_display": page.objfile, "current_file_identity": "unknown"})
51
+ return {"status": "available", "gdb_version": gdb.VERSION, "pwndbg_version": version, "connection": "core", "executable": None,
52
+ "historical_pid": inferior.pid, "reported_limits": {"address_space_bytes": resource.getrlimit(resource.RLIMIT_AS)[0], "cpu_seconds": resource.getrlimit(resource.RLIMIT_CPU)[0], "file_size_bytes": resource.getrlimit(resource.RLIMIT_FSIZE)[0]}, "maps": maps, "confidence": "derived", "completeness": "unknown",
53
+ "diagnostics": {"stdout": "", "stderr": "", "truncated": False}}
54
+
55
+
56
+ def failure_exit(request_path, status, marker):
57
+ try:
58
+ descriptor = os.open(Path(request_path).parent / "resource.failure", os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
59
+ os.write(descriptor, marker)
60
+ os.close(descriptor)
61
+ except (OSError, MemoryError):
62
+ pass
63
+ os._exit(status)
64
+
65
+
66
+ def main():
67
+ request_path = os.environ["REA_CORE_CONTEXT_REQUEST"]
68
+ request = json.loads(Path(request_path).read_text(encoding="utf-8"))
69
+ reserve = bytearray(1024 * 1024)
70
+ try:
71
+ reply = {"ok": True, "value": inspect(request)}
72
+ except ContextFailure as error:
73
+ reply = {"ok": False, "reason": error.reason, "message": str(error)}
74
+ except MemoryError:
75
+ reserve = None
76
+ failure_exit(request_path, 75, b"M")
77
+ except Exception as error:
78
+ if isinstance(error, OSError) and error.errno == 12:
79
+ reserve = None
80
+ failure_exit(request_path, 75, b"M")
81
+ reply = {"ok": False, "reason": "decoder", "message": type(error).__name__ + ": " + str(error)}
82
+ try:
83
+ encoded = json.dumps(reply, ensure_ascii=True, allow_nan=False).encode("utf-8")
84
+ if len(encoded) > OUTPUT_BYTES:
85
+ encoded = json.dumps({"ok": False, "reason": "output-limit", "message": "Complete debugger context exceeds64 MiB reply budget."}).encode("utf-8")
86
+ descriptor = os.open(request["reply_path"], os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
87
+ with os.fdopen(descriptor, "wb") as handle:
88
+ handle.write(encoded)
89
+ except MemoryError:
90
+ reserve = None
91
+ failure_exit(request_path, 75, b"M")
92
+ except OSError as error:
93
+ if error.errno == 27:
94
+ failure_exit(request_path, 76, b"F")
95
+ if error.errno == 12:
96
+ reserve = None
97
+ failure_exit(request_path, 75, b"M")
98
+ raise
99
+
100
+
101
+ main()
@@ -0,0 +1,39 @@
1
+ """Catch typed resource failures while loading or running the owned debugger launcher.
2
+
3
+ Only this package's fixed sibling is executed; caller input stays in request.json.
4
+ Interpreter startup failures before this boundary remain unclassified.
5
+ """
6
+ import os
7
+ import sys
8
+
9
+
10
+ def resource_exit(status, marker):
11
+ try:
12
+ if len(sys.argv) > 2:
13
+ descriptor = os.open(sys.argv[1], os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
14
+ os.write(descriptor, marker)
15
+ os.close(descriptor)
16
+ except (OSError, MemoryError):
17
+ # Without a complete marker the parent keeps this failure unclassified.
18
+ pass
19
+ os._exit(status)
20
+
21
+ try:
22
+ implementation = os.path.join(os.path.dirname(__file__), "launch_impl.py")
23
+ with open(implementation, "rb") as handle:
24
+ source = handle.read()
25
+ exec(compile(source, implementation, "exec"), {
26
+ "__file__": implementation,
27
+ "__name__": "__main__",
28
+ })
29
+ except MemoryError:
30
+ # Reserved status: an observed allocation failure, including imports/compile.
31
+ resource_exit(75, b"M")
32
+ except OSError as error:
33
+ # Linux ENOMEM is an observed allocation failure, independent of error text.
34
+ if error.errno == 12:
35
+ resource_exit(75, b"M")
36
+ # Linux EFBIG is observed directly, including a partial limits/reply write.
37
+ if error.errno == 27:
38
+ resource_exit(76, b"F")
39
+ raise
@@ -0,0 +1,34 @@
1
+ """Lower inherited limits before replacing this owned process with GDB."""
2
+ import json
3
+ import os
4
+ from pathlib import Path
5
+ import sys
6
+
7
+ runtime_path = Path(__file__).parent.parent / "pwntools" / "decoder_runtime.py"
8
+ runtime = {"__file__": str(runtime_path), "__name__": "rea_decoder_runtime"}
9
+ exec(compile(runtime_path.read_bytes(), str(runtime_path), "exec"), runtime)
10
+
11
+
12
+ class LaunchFailure(Exception):
13
+ def __init__(self, reason, message):
14
+ super().__init__(message)
15
+ self.reason = reason
16
+
17
+
18
+ def launch(snapshot, cache):
19
+ request_path = sys.argv[-1]
20
+ request = json.loads(Path(request_path).read_text(encoding="utf-8"))
21
+ bridge = str(Path(__file__).with_name("core_context.py"))
22
+ environment = dict(os.environ, REA_CORE_CONTEXT_REQUEST=request_path)
23
+ # Only fixed package code appears in the GDB Python command. Selected paths stay JSON data.
24
+ command = "python exec(compile(open(" + repr(bridge) + ", 'rb').read(), " + repr(bridge) + ", 'exec'), {'__name__':'__main__','__file__':" + repr(bridge) + "})"
25
+ try:
26
+ os.execve(request["gdb"], [request["gdb"], "-nx", "-nh", "--batch", "--quiet",
27
+ "-iex", "set auto-load off", "-iex", "set debuginfod enabled off",
28
+ "-iex", "set auto-solib-add off", "-ex", command], environment)
29
+ except OSError as error:
30
+ raise LaunchFailure("unavailable", "Selected GDB could not start (" + str(error.errno) + "): " + request["gdb"] + "; " + str(error)) from error
31
+
32
+
33
+ if __name__ == "__main__":
34
+ runtime["main"](sys.argv[-1], launch, LaunchFailure, "pwndbg-core-launcher")
@@ -0,0 +1,59 @@
1
+ """Shared bounded reply/limit protocol, independent of the supplied artifact format."""
2
+ import json
3
+ import os
4
+ from pathlib import Path
5
+ import resource
6
+ import sys
7
+
8
+ OUTPUT_BYTES = 64 * 1024 * 1024
9
+
10
+ def lower_resource_limits():
11
+ limits = {}
12
+ for name, kind, maximum in (
13
+ ("address_space_bytes", resource.RLIMIT_AS, 3 * 1024**3),
14
+ ("cpu_seconds", resource.RLIMIT_CPU, 30),
15
+ ("file_size_bytes", resource.RLIMIT_FSIZE, OUTPUT_BYTES),
16
+ ):
17
+ soft, hard = resource.getrlimit(kind)
18
+ finite = [maximum] + [value for value in (soft, hard) if value != resource.RLIM_INFINITY]
19
+ effective = min(finite)
20
+ # Preserve the inherited hard boundary and never raise a caller's soft limit.
21
+ resource.setrlimit(kind, (effective, hard))
22
+ limits[name] = effective
23
+ return limits
24
+
25
+
26
+ def main(request_path, inspect, failure_type, profile):
27
+ request = json.loads(Path(request_path).read_text(encoding="utf-8"))
28
+ os.environ["PWNLIB_NOTERM"] = "1"
29
+ os.environ["PWNLIB_CACHE_DIR"] = str(Path(request_path).parent / "cache")
30
+ limits = None
31
+ # Release bounded emergency headroom before constructing a MemoryError reply.
32
+ # The outer exit-status contract also covers allocation failure during serialization.
33
+ memory_reserve = bytearray(1024 * 1024)
34
+ try:
35
+ limits = lower_resource_limits()
36
+ descriptor = os.open(Path(request_path).parent / "limits.json", os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
37
+ with os.fdopen(descriptor, "w", encoding="utf-8") as handle:
38
+ json.dump(limits, handle)
39
+ value = inspect(Path(request["snapshot_path"]), Path(request_path).parent / "cache")
40
+ value["limitations"].append("Effective owned Python resource soft limits: " + json.dumps(limits, sort_keys=True) + ". Inherited tighter limits are retained.")
41
+ reply = {"ok": True, "profile": profile, "value": value}
42
+ except failure_type as error:
43
+ reply = {"ok": False, "reason": error.reason, "message": str(error)}
44
+ except MemoryError:
45
+ memory_reserve = None
46
+ reply = {"ok": False, "reason": "resource-limit", "message": "pwntools memory allocation failed under the effective resource limits; the exact allocation cause is unknown.", "reported_limits": limits}
47
+ except Exception as error:
48
+ if isinstance(error, OSError) and error.errno == 12:
49
+ memory_reserve = None
50
+ reply = {"ok": False, "reason": "resource-limit", "message": "pwntools reported OSError(ENOMEM); the exact allocation cause is unknown.", "reported_limits": limits}
51
+ else:
52
+ reply = {"ok": False, "reason": "decoder", "message": type(error).__name__ + ": " + str(error)}
53
+ encoded = json.dumps(reply, ensure_ascii=True, allow_nan=False).encode("utf-8")
54
+ if len(encoded) > OUTPUT_BYTES:
55
+ encoded = json.dumps({"ok": False, "reason": "output-limit", "message": "Complete artifact result exceeds the 64 MiB reply budget."}).encode("utf-8")
56
+ descriptor = os.open(request["reply_path"], os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
57
+ with os.fdopen(descriptor, "wb") as handle:
58
+ handle.write(encoded)
59
+
@@ -0,0 +1,39 @@
1
+ """Catch typed resource failures while loading or running the owned ELF adapter.
2
+
3
+ Only this package's fixed sibling is executed; caller input stays in request.json.
4
+ Interpreter startup failures before this boundary remain unclassified.
5
+ """
6
+ import os
7
+ import sys
8
+
9
+
10
+ def resource_exit(status, marker):
11
+ try:
12
+ if len(sys.argv) > 2:
13
+ descriptor = os.open(sys.argv[1], os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
14
+ os.write(descriptor, marker)
15
+ os.close(descriptor)
16
+ except (OSError, MemoryError):
17
+ # Without a complete marker the parent keeps this failure unclassified.
18
+ pass
19
+ os._exit(status)
20
+
21
+ try:
22
+ implementation = os.path.join(os.path.dirname(__file__), "layout_impl.py")
23
+ with open(implementation, "rb") as handle:
24
+ source = handle.read()
25
+ exec(compile(source, implementation, "exec"), {
26
+ "__file__": implementation,
27
+ "__name__": "__main__",
28
+ })
29
+ except MemoryError:
30
+ # Reserved status: an observed allocation failure, including imports/compile.
31
+ resource_exit(75, b"M")
32
+ except OSError as error:
33
+ # Linux ENOMEM is an observed allocation failure, independent of error text.
34
+ if error.errno == 12:
35
+ resource_exit(75, b"M")
36
+ # Linux EFBIG is observed directly, including a partial limits/reply write.
37
+ if error.errno == 27:
38
+ resource_exit(76, b"F")
39
+ raise