rea-agents 1.7.0 → 2.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 (333) hide show
  1. package/README.md +112 -59
  2. package/bridge/ghidra/ReaGhidraBridge.java +96 -11
  3. package/dist/application/ArtifactExtraction.js +1 -1
  4. package/dist/application/ArtifactInventory/classify.js +42 -0
  5. package/dist/application/ArtifactInventory/hash.js +43 -0
  6. package/dist/application/ArtifactInventory/reader.js +41 -0
  7. package/dist/application/ArtifactInventory/scanCanonical.js +155 -0
  8. package/dist/application/ArtifactInventory/scanReader.js +124 -0
  9. package/dist/application/ArtifactInventory/types.js +10 -0
  10. package/dist/application/ArtifactInventory.js +9 -351
  11. package/dist/application/AuthorizedArtifactInventory.js +2 -2
  12. package/dist/application/BinarySession.js +47 -270
  13. package/dist/application/BinarySessionExecution.js +28 -0
  14. package/dist/application/BinarySessionOpen.js +39 -0
  15. package/dist/application/BinarySessionRecords.js +149 -0
  16. package/dist/application/BinarySessionStatus.js +75 -0
  17. package/dist/application/CapabilityInventory.js +42 -2
  18. package/dist/application/ClientRegistrationStatus.js +1 -1
  19. package/dist/application/CrossVersionInventory.js +8 -2
  20. package/dist/application/CrossVersionInvestigation.js +11 -29
  21. package/dist/application/CrossVersionInvestigationCollections.js +23 -0
  22. package/dist/application/DirectAnalysis.js +47 -44
  23. package/dist/application/Doctor.js +165 -197
  24. package/dist/application/DoctorDiagnostics.js +180 -0
  25. package/dist/application/ElectronBoundaryAnalysis.js +112 -0
  26. package/dist/application/ElectronBoundaryGraph.js +9 -0
  27. package/dist/application/ElectronBoundaryGraphContext.js +62 -0
  28. package/dist/application/ElectronBoundaryGraphIpc.js +242 -0
  29. package/dist/application/ElectronBoundaryGraphNative.js +86 -0
  30. package/dist/application/ElectronBoundaryGraphWindows.js +223 -0
  31. package/dist/application/EnhancedToolPagination.js +22 -0
  32. package/dist/application/EnhancedToolTypes.js +4 -0
  33. package/dist/application/EnhancedTools.js +58 -50
  34. package/dist/application/InstrumentedJavaScriptReplayHost.js +36 -0
  35. package/dist/application/InvestigationProviders.js +30 -0
  36. package/dist/application/InvestigationWorkspaceStore.js +24 -10
  37. package/dist/application/JavaScriptApplicationEvidence.js +26 -0
  38. package/dist/application/JavaScriptApplicationEvidenceGraph.js +89 -0
  39. package/dist/application/JavaScriptApplicationService.js +74 -0
  40. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +29 -0
  41. package/dist/application/JavaScriptApplicationWorkflowService.js +90 -0
  42. package/dist/application/JavaScriptArtifactAnalysis.js +52 -7
  43. package/dist/application/JavaScriptArtifactFiles.js +6 -2
  44. package/dist/application/JavaScriptArtifactGraphBuilder.js +82 -17
  45. package/dist/application/JavaScriptArtifactGraphBundlers.js +225 -0
  46. package/dist/application/JavaScriptArtifactGraphContext.js +37 -36
  47. package/dist/application/JavaScriptArtifactGraphDocuments.js +27 -4
  48. package/dist/application/JavaScriptArtifactGraphEvidence.js +24 -14
  49. package/dist/application/JavaScriptArtifactGraphFindings.js +54 -8
  50. package/dist/application/JavaScriptArtifactGraphStructure.js +29 -101
  51. package/dist/application/JavaScriptArtifactPathResolution.js +269 -0
  52. package/dist/application/JavaScriptArtifactReconstruction.js +4 -1
  53. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -83
  54. package/dist/application/JavaScriptJsonModules.js +39 -0
  55. package/dist/application/JavaScriptModuleRelationships.js +262 -0
  56. package/dist/application/JavaScriptReplayPermission.js +16 -0
  57. package/dist/application/JavaScriptReplayPlanning.js +201 -0
  58. package/dist/application/JavaScriptReplayService.js +292 -0
  59. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +25 -0
  60. package/dist/application/JavaScriptRuntimeReconciliationService.js +27 -0
  61. package/dist/application/LinuxHopper.js +10 -0
  62. package/dist/application/MacHopper.js +22 -11
  63. package/dist/application/ManagedApplicationGraphService.js +55 -0
  64. package/dist/application/ManagedMemberComparisonService.js +122 -0
  65. package/dist/application/ManagedNativeVerificationService.js +39 -0
  66. package/dist/application/ManagedReconstructionService.js +58 -0
  67. package/dist/application/ManagedRuntimeCorrelationService.js +103 -0
  68. package/dist/application/NodeRuntimeCharacterizationService.js +196 -0
  69. package/dist/application/PermissionAuthority.js +106 -63
  70. package/dist/application/ProcessCaptureCapability.js +1 -1
  71. package/dist/application/ProcessCapturePermission.js +13 -0
  72. package/dist/application/ProcessCli.js +2 -12
  73. package/dist/application/ProcessHarness.js +1 -1
  74. package/dist/application/ProcessSampling.js +15 -11
  75. package/dist/application/ProjectPermissionStore.js +49 -9
  76. package/dist/application/RealHopperAssertions.js +76 -0
  77. package/dist/application/ReconstructionCoverageService.js +69 -0
  78. package/dist/application/ReconstructionCoverageWorkspaceStore.js +31 -0
  79. package/dist/application/RuntimeExecutableDiagnostics.js +172 -0
  80. package/dist/application/Setup.js +147 -259
  81. package/dist/application/SetupClientConfiguration.js +220 -0
  82. package/dist/application/SetupClients.js +24 -2
  83. package/dist/application/SetupPlan.js +123 -12
  84. package/dist/application/SetupSkill.js +26 -12
  85. package/dist/application/SupportedClients.js +1 -0
  86. package/dist/application/Uninstall.js +6 -3
  87. package/dist/application/WindowsCapabilities.js +86 -0
  88. package/dist/application/runtime.js +2 -0
  89. package/dist/artifacts/AsarArtifactReader.js +11 -0
  90. package/dist/browser/BrowserProcessStartup.js +88 -0
  91. package/dist/browser/CdpCaptureDocuments.js +12 -8
  92. package/dist/browser/CdpCaptureEventBodyShapes.js +75 -0
  93. package/dist/browser/CdpCaptureEventHandlers.js +336 -0
  94. package/dist/browser/CdpCaptureEventHelpers.js +71 -0
  95. package/dist/browser/CdpCaptureEventState.js +1 -0
  96. package/dist/browser/CdpCaptureEventTypes.js +1 -0
  97. package/dist/browser/CdpCaptureEvents.js +46 -464
  98. package/dist/browser/CdpElectronInspection.js +106 -162
  99. package/dist/browser/CdpElectronProvider.js +5 -1
  100. package/dist/browser/CdpElectronScriptEvents.js +69 -0
  101. package/dist/browser/CdpElectronScripts.js +94 -0
  102. package/dist/browser/CdpElectronWorkers.js +56 -0
  103. package/dist/browser/CdpObservationSession.js +51 -8
  104. package/dist/browser/CdpPageCapture.js +12 -129
  105. package/dist/browser/CdpPageCaptureScripts.js +97 -0
  106. package/dist/browser/CdpPageCaptureWorkers.js +46 -0
  107. package/dist/browser/CdpWebMcpDiscovery.js +38 -14
  108. package/dist/browser/PngVisualDiff.js +9 -2
  109. package/dist/catalogIdentity.js +8 -1
  110. package/dist/cli/artifactCommands.js +82 -0
  111. package/dist/cli/coreAnalysisCommands.js +232 -0
  112. package/dist/cli/managedCommands.js +397 -0
  113. package/dist/cli/managedProjectGraphCommand.js +24 -0
  114. package/dist/cli/options.js +9 -0
  115. package/dist/cli/setupCommands.js +108 -0
  116. package/dist/cli/types.js +1 -0
  117. package/dist/cli/utilityCommands.js +122 -0
  118. package/dist/cli.js +13 -383
  119. package/dist/cliApplicationCommands.js +176 -0
  120. package/dist/cliBrowserAdvancedCommands.js +73 -16
  121. package/dist/cliBrowserCommands.js +39 -115
  122. package/dist/cliCommandNames.js +17 -0
  123. package/dist/cliElectronCommands.js +100 -27
  124. package/dist/cliEvidenceCommands.js +13 -2
  125. package/dist/cliInvestigationCommands.js +53 -10
  126. package/dist/cliJsonInput.js +54 -0
  127. package/dist/cliObservationOptions.js +137 -0
  128. package/dist/cliPolicyCommands.js +80 -46
  129. package/dist/cliSetup.js +289 -0
  130. package/dist/config/environment.js +107 -0
  131. package/dist/config/parseConfig.js +228 -0
  132. package/dist/config/parsers.js +68 -0
  133. package/dist/config/permissions.js +30 -0
  134. package/dist/config/types.js +1 -0
  135. package/dist/config.js +1 -292
  136. package/dist/contracts/applicationToolContracts.js +225 -0
  137. package/dist/contracts/artifactToolContracts.js +5 -9
  138. package/dist/contracts/browserToolContracts.js +14 -62
  139. package/dist/contracts/electronToolContracts.js +45 -19
  140. package/dist/contracts/errorSchemas.js +1 -0
  141. package/dist/contracts/investigationExamples.js +0 -6
  142. package/dist/contracts/javascriptApplicationWorkflowExamples.js +46 -0
  143. package/dist/contracts/javascriptRuntimeReconciliationExample.js +208 -0
  144. package/dist/contracts/managedToolContracts.js +153 -0
  145. package/dist/contracts/managedWorkflowExamples.js +346 -0
  146. package/dist/contracts/managedWorkflowToolContracts.js +203 -0
  147. package/dist/contracts/nativeToolContracts.js +2 -6
  148. package/dist/contracts/promptContracts.js +18 -2
  149. package/dist/contracts/providerSelection.js +2 -0
  150. package/dist/contracts/toolContractExamples.js +10 -25
  151. package/dist/contracts/toolContracts.js +49 -47
  152. package/dist/contracts/toolEffects.js +174 -0
  153. package/dist/contracts/toolOutputSchemaGroups.js +232 -0
  154. package/dist/contracts/toolOutputSchemaPrimitives.js +327 -0
  155. package/dist/contracts/toolOutputSchemas.js +2 -535
  156. package/dist/doctorRuntime.js +42 -1
  157. package/dist/domain/analysisErrorPresentation.js +234 -0
  158. package/dist/domain/analysisErrorProjection.js +284 -0
  159. package/dist/domain/artifactComparison.js +37 -19
  160. package/dist/domain/binaryTarget.js +87 -37
  161. package/dist/domain/browserObservation.js +1 -282
  162. package/dist/domain/browserObservationSchemas.js +286 -0
  163. package/dist/domain/bundleComparison.js +4 -4
  164. package/dist/domain/electronObservation.js +13 -0
  165. package/dist/domain/electronStaticAnalysis.js +9 -0
  166. package/dist/domain/electronStaticAnalysisBrowser.js +206 -0
  167. package/dist/domain/electronStaticAnalysisIpc.js +171 -0
  168. package/dist/domain/electronStaticAnalysisNative.js +164 -0
  169. package/dist/domain/electronStaticAnalysisTypes.js +1 -0
  170. package/dist/domain/electronStaticAnalysisValues.js +103 -0
  171. package/dist/domain/errors.js +32 -448
  172. package/dist/domain/functionComparison.js +4 -165
  173. package/dist/domain/functionComparisonDimensions.js +164 -0
  174. package/dist/domain/functionComparisonSchemas.js +3 -8
  175. package/dist/domain/inputIssueProjection.js +52 -0
  176. package/dist/domain/javascriptApplicationAnalysis.js +155 -0
  177. package/dist/domain/javascriptApplicationChangeGraph.js +231 -0
  178. package/dist/domain/javascriptApplicationEvidenceSchemas.js +18 -0
  179. package/dist/domain/javascriptApplicationGraph.js +2 -1
  180. package/dist/domain/javascriptApplicationGraphSchemas.js +7 -0
  181. package/dist/domain/javascriptApplicationVersionComparison.js +116 -0
  182. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +139 -0
  183. package/dist/domain/javascriptApplicationVersionItems.js +233 -0
  184. package/dist/domain/javascriptApplicationVersionKeys.js +170 -0
  185. package/dist/domain/javascriptExportInstrumentation.js +97 -0
  186. package/dist/domain/javascriptFeatureSeed.js +140 -0
  187. package/dist/domain/javascriptFeatureTrace.js +232 -0
  188. package/dist/domain/javascriptFeatureTraceSchemas.js +136 -0
  189. package/dist/domain/javascriptFeatureTraversal.js +100 -0
  190. package/dist/domain/javascriptNativeHandoff.js +85 -0
  191. package/dist/domain/javascriptReplay.js +361 -0
  192. package/dist/domain/javascriptRuntimeLoadState.js +106 -0
  193. package/dist/domain/javascriptRuntimeReconciliation.js +42 -0
  194. package/dist/domain/javascriptRuntimeReconciliationGraph.js +169 -0
  195. package/dist/domain/javascriptRuntimeReconciliationMatching.js +247 -0
  196. package/dist/domain/javascriptRuntimeReconciliationParsing.js +160 -0
  197. package/dist/domain/javascriptRuntimeReconciliationResult.js +119 -0
  198. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +316 -0
  199. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +245 -0
  200. package/dist/domain/javascriptRuntimeStaticCandidates.js +193 -0
  201. package/dist/domain/javascriptSemanticAnalysis.js +386 -0
  202. package/dist/domain/javascriptSemanticIr.js +30 -0
  203. package/dist/domain/javascriptSemanticProjection.js +366 -0
  204. package/dist/domain/javascriptSemanticState.js +40 -0
  205. package/dist/domain/javascriptSemanticTraversal.js +22 -0
  206. package/dist/domain/javascriptSemanticValues.js +352 -0
  207. package/dist/domain/javascriptStaticAnalysis.js +26 -254
  208. package/dist/domain/javascriptStaticAnalysisBundler.js +209 -0
  209. package/dist/domain/javascriptStaticAnalysisCalls.js +180 -0
  210. package/dist/domain/javascriptStaticAnalysisFindings.js +39 -0
  211. package/dist/domain/javascriptStaticAnalysisHelpers.js +81 -2
  212. package/dist/domain/javascriptStaticAnalysisState.js +6 -0
  213. package/dist/domain/knownPageCoverage.js +21 -0
  214. package/dist/domain/managedApplicationGraph.js +206 -0
  215. package/dist/domain/managedApplicationGraphCoverage.js +170 -0
  216. package/dist/domain/managedApplicationGraphNodeCoverage.js +6 -0
  217. package/dist/domain/managedApplicationGraphNodes.js +336 -0
  218. package/dist/domain/managedArtifact.js +452 -0
  219. package/dist/domain/managedMemberComparison.js +211 -0
  220. package/dist/domain/managedMemberComparisonCoverage.js +72 -0
  221. package/dist/domain/managedMemberComparisonMatch.js +356 -0
  222. package/dist/domain/managedNativeVerification.js +46 -0
  223. package/dist/domain/managedNativeVerificationMatch.js +272 -0
  224. package/dist/domain/managedNativeVerificationSchemas.js +141 -0
  225. package/dist/domain/managedReconstruction.js +196 -0
  226. package/dist/domain/managedRuntimeCorrelation.js +184 -0
  227. package/dist/domain/nodeRuntimeCharacterization.js +66 -0
  228. package/dist/domain/permissionPolicy.js +2 -0
  229. package/dist/domain/reconstructionCoverage.js +387 -0
  230. package/dist/domain/reconstructionCoverageEvaluation.js +212 -0
  231. package/dist/domain/reconstructionVerificationSchemas.js +9 -3
  232. package/dist/domain/runtimeCharacterization.js +85 -0
  233. package/dist/domain/webBundleAnalyzer.js +3 -409
  234. package/dist/domain/webBundleAnalyzerAst.js +77 -0
  235. package/dist/domain/webBundleAnalyzerInspection.js +307 -0
  236. package/dist/domain/webBundleAnalyzerResult.js +120 -0
  237. package/dist/dotnet/ManagedArtifactInspector.js +339 -0
  238. package/dist/dotnet/ManagedMemberInspector.js +153 -0
  239. package/dist/dotnet/ManagedMemberInspectorCore.js +297 -0
  240. package/dist/dotnet/ManagedMemberInstructionDecoder.js +427 -0
  241. package/dist/dotnet/ManagedMemberRows.js +120 -0
  242. package/dist/dotnet/ManagedMetadataHeaps.js +131 -0
  243. package/dist/dotnet/ManagedMetadataInventory.js +104 -0
  244. package/dist/dotnet/ManagedMetadataInventoryRows.js +292 -0
  245. package/dist/dotnet/ManagedMetadataLayout.js +259 -0
  246. package/dist/dotnet/ManagedMetadataRowSizes.js +54 -0
  247. package/dist/dotnet/ManagedMethodBodyReader.js +143 -0
  248. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +311 -0
  249. package/dist/dotnet/ManagedNativeBoundaryInspector.js +143 -0
  250. package/dist/dotnet/ManagedPeReader.js +188 -0
  251. package/dist/dotnet/ManagedReaderFailure.js +10 -0
  252. package/dist/dotnet/ManagedStaticProvider.js +203 -0
  253. package/dist/generatedPackageMetadata.js +2 -2
  254. package/dist/ghidra/GhidraClient.js +76 -91
  255. package/dist/ghidra/GhidraClientStartup.js +29 -0
  256. package/dist/ghidra/GhidraClientWire.js +34 -0
  257. package/dist/ghidra/GhidraDefaults.js +1 -1
  258. package/dist/ghidra/GhidraDiagnostics.js +6 -1
  259. package/dist/ghidra/GhidraInstallation.js +20 -15
  260. package/dist/ghidra/GhidraLauncher.js +93 -29
  261. package/dist/ghidra/GhidraProvider.js +67 -161
  262. package/dist/ghidra/GhidraProviderCapabilities.js +173 -0
  263. package/dist/ghidra/GhidraSessionValues.js +2 -0
  264. package/dist/ghidra/GhidraSocketConnection.js +44 -7
  265. package/dist/ghidra/GhidraTargetSnapshot.js +30 -0
  266. package/dist/ghidra/GhidraTransport.js +71 -0
  267. package/dist/identity.js +3 -2
  268. package/dist/main/messages.js +5 -0
  269. package/dist/main/reload.js +49 -0
  270. package/dist/main/shutdown.js +25 -0
  271. package/dist/main/startup.js +14 -0
  272. package/dist/main/state.js +26 -0
  273. package/dist/main/transport.js +61 -0
  274. package/dist/main/types.js +1 -0
  275. package/dist/main.js +35 -132
  276. package/dist/process/PrivateRuntimeRoot.js +3 -2
  277. package/dist/process/ProcessOwnership.js +35 -0
  278. package/dist/process/ProviderProcess.js +2 -0
  279. package/dist/replay/JavaScriptReplayWorker.js +300 -0
  280. package/dist/replay/LinuxJavaScriptReplayRunner.js +217 -0
  281. package/dist/replay/LinuxJavaScriptReplaySandbox.js +140 -0
  282. package/dist/replay/LinuxRuntimeClosure.js +46 -0
  283. package/dist/replay/LinuxSeccompPolicy.js +40 -0
  284. package/dist/replay/ReplayOutcome.js +95 -0
  285. package/dist/replay/ReplayProcessLifecycle.js +71 -0
  286. package/dist/replay/ReplayWorkerProtocol.js +55 -0
  287. package/dist/replay/SystemJavaScriptReplayHost.js +182 -0
  288. package/dist/server/ProcessCaptureElicitation.js +157 -0
  289. package/dist/server/createServer.js +158 -41
  290. package/dist/server/registerApplicationTools/characterization.js +57 -0
  291. package/dist/server/registerApplicationTools/compareVersions.js +34 -0
  292. package/dist/server/registerApplicationTools/controlledReplay.js +38 -0
  293. package/dist/server/registerApplicationTools/coverage.js +84 -0
  294. package/dist/server/registerApplicationTools/helpers.js +42 -0
  295. package/dist/server/registerApplicationTools/traceFeature.js +26 -0
  296. package/dist/server/registerApplicationTools/types.js +1 -0
  297. package/dist/server/registerApplicationTools.js +13 -0
  298. package/dist/server/registerArtifactComparisonTool.js +16 -9
  299. package/dist/server/registerBrowserTools.js +61 -60
  300. package/dist/server/registerBundleComparisonTool.js +17 -20
  301. package/dist/server/registerElectronTools.js +39 -12
  302. package/dist/server/registerEnhancedTools.js +52 -15
  303. package/dist/server/registerEvidenceResources.js +54 -0
  304. package/dist/server/registerEvidenceTools.js +5 -1
  305. package/dist/server/registerFunctionComparisonTool.js +14 -7
  306. package/dist/server/registerInvestigationTools/helpers.js +74 -0
  307. package/dist/server/registerInvestigationTools/types.js +1 -0
  308. package/dist/server/registerInvestigationTools.js +103 -132
  309. package/dist/server/registerManagedTools.js +6 -0
  310. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +65 -0
  311. package/dist/server/registerManagedWorkflowTools/contract.js +8 -0
  312. package/dist/server/registerManagedWorkflowTools/evidence.js +43 -0
  313. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +39 -0
  314. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +39 -0
  315. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +52 -0
  316. package/dist/server/registerManagedWorkflowTools/types.js +1 -0
  317. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +75 -0
  318. package/dist/server/registerManagedWorkflowTools.js +13 -0
  319. package/dist/server/registerOfficialTools.js +81 -67
  320. package/dist/server/registerProcessComparisonTool.js +25 -47
  321. package/dist/server/registerSessionRecordTools.js +137 -0
  322. package/dist/server/registerSessionStatusTool.js +9 -8
  323. package/dist/server/registerSessionTools.js +77 -216
  324. package/dist/server/sessionAvailabilityPolicy.js +10 -0
  325. package/dist/server/sessionEvidence.js +14 -19
  326. package/dist/server/toolInputValidation.js +77 -0
  327. package/dist/server/toolRegistrationOptions.js +177 -2
  328. package/dist/server/toolResult.js +30 -17
  329. package/package.json +21 -14
  330. package/scripts/rea.mjs +1 -1
  331. package/skills/{rea-analysis → reverse-engineer-anything}/SKILL.md +75 -6
  332. package/scripts/prepare-node-pty.mjs +0 -35
  333. package/scripts/rebuild-native.mjs +0 -22
@@ -0,0 +1,339 @@
1
+ import { managedArtifactInspectionSchema, } from "../domain/managedArtifact.js";
2
+ import { readManagedPeLayout, } from "./ManagedPeReader.js";
3
+ import { managedTableRowCounts, readManagedMetadataInventory, } from "./ManagedMetadataInventory.js";
4
+ import { readManagedMetadataLayout, } from "./ManagedMetadataLayout.js";
5
+ import { ManagedReaderFailure } from "./ManagedReaderFailure.js";
6
+ const emptyPage = (offset, limit) => ({
7
+ items: [],
8
+ offset,
9
+ limit,
10
+ total: 0,
11
+ returned: 0,
12
+ dropped: 0,
13
+ complete: offset === 0,
14
+ });
15
+ const flagNames = (flags) => {
16
+ const names = [];
17
+ for (const [mask, name] of [
18
+ [0x0000_0001, "il-only"],
19
+ [0x0000_0002, "32-bit-required"],
20
+ [0x0000_0004, "il-library"],
21
+ [0x0000_0008, "strong-name-signed"],
22
+ [0x0000_0010, "native-entry-point"],
23
+ [0x0001_0000, "track-debug-data"],
24
+ [0x0002_0000, "32-bit-preferred"],
25
+ ])
26
+ if ((flags & mask) !== 0)
27
+ names.push(name);
28
+ return names;
29
+ };
30
+ const cliProjection = (cli) => ({
31
+ header_offset: cli.headerOffset,
32
+ header_size: cli.headerSize,
33
+ runtime_version: `${String(cli.runtimeMajor)}.${String(cli.runtimeMinor)}`,
34
+ flags: cli.flags,
35
+ flag_names: flagNames(cli.flags),
36
+ entry_point: cli.entryPoint === 0
37
+ ? { kind: "none", value: null }
38
+ : (cli.flags & 0x10) !== 0
39
+ ? {
40
+ kind: "native-rva",
41
+ value: `0x${cli.entryPoint.toString(16)}`,
42
+ }
43
+ : {
44
+ kind: "metadata-token",
45
+ value: `0x${cli.entryPoint.toString(16).padStart(8, "0")}`,
46
+ },
47
+ metadata_rva: cli.metadata.rva,
48
+ metadata_size: cli.metadata.size,
49
+ resources_rva: cli.resources.rva,
50
+ resources_size: cli.resources.size,
51
+ strong_name_rva: cli.strongName.rva,
52
+ strong_name_size: cli.strongName.size,
53
+ managed_native_header_rva: cli.managedNativeHeader.rva,
54
+ managed_native_header_size: cli.managedNativeHeader.size,
55
+ ready_to_run_signature: cli.readyToRunSignature,
56
+ });
57
+ const peProjection = (layout) => ({
58
+ machine: layout.machine,
59
+ machine_hex: `0x${layout.machine.toString(16).padStart(4, "0")}`,
60
+ architecture: layout.architecture,
61
+ optional_header: layout.optionalHeader,
62
+ section_count: layout.sectionCount,
63
+ characteristics: layout.characteristics,
64
+ cli: layout.cli === null ? null : cliProjection(layout.cli),
65
+ });
66
+ const base = (target, bytes, layout) => ({
67
+ schema_version: 1,
68
+ artifact: {
69
+ path: target.path,
70
+ sha256: target.sha256,
71
+ byte_length: bytes.length,
72
+ format: "pe",
73
+ },
74
+ pe: peProjection(layout),
75
+ });
76
+ const unavailableResult = (target, bytes, layout, limits) => {
77
+ const malformed = layout.cliDirectoryPresent;
78
+ const issues = layout.cliIssue === null ? [] : [layout.cliIssue];
79
+ const limitations = malformed
80
+ ? [
81
+ "The PE declares a CLI directory, but its CLI header could not be admitted.",
82
+ ]
83
+ : [
84
+ "The PE has no CLI data directory; managed metadata and CIL are unavailable.",
85
+ ];
86
+ return managedArtifactInspectionSchema.parse({
87
+ ...base(target, bytes, layout),
88
+ classification: {
89
+ status: malformed ? "malformed" : "not-managed",
90
+ container: "pe",
91
+ runtime_family: "unknown",
92
+ implementation: malformed ? "unknown" : "not-managed",
93
+ managed_architecture: "unknown",
94
+ evidence: [
95
+ {
96
+ code: malformed ? "cli-directory-malformed" : "cli-directory-absent",
97
+ detail: limitations[0],
98
+ file_offset: layout.cliIssue?.offset ?? null,
99
+ },
100
+ ],
101
+ },
102
+ metadata: {
103
+ status: malformed ? "malformed" : "absent",
104
+ version: null,
105
+ stream_names: [],
106
+ table_row_counts: {},
107
+ },
108
+ module: null,
109
+ assembly: null,
110
+ target_frameworks: [],
111
+ references: emptyPage(limits.referenceOffset, limits.referenceLimit),
112
+ resources: emptyPage(limits.resourceOffset, limits.resourceLimit),
113
+ attributes: emptyPage(limits.attributeOffset, limits.attributeLimit),
114
+ coverage: {
115
+ state: malformed ? "partial" : "unavailable",
116
+ issues,
117
+ },
118
+ limitations,
119
+ });
120
+ };
121
+ const runtimeFamilyFor = (cli, inventory, metadata, layout) => {
122
+ const evidence = [
123
+ {
124
+ code: "cli-header-observed",
125
+ detail: "A file-backed PE CLI header and metadata root were admitted.",
126
+ file_offset: cli.headerOffset,
127
+ },
128
+ ];
129
+ const frameworks = inventory.targetFrameworks;
130
+ const hasUnity = inventory.referenceNames.some((name) => name === "UnityEngine" || name.startsWith("UnityEngine."));
131
+ let runtimeFamily = "unknown";
132
+ if ((cli.flags & 1) === 0) {
133
+ runtimeFamily = "mixed-clr-native";
134
+ evidence.push({
135
+ code: "cli-il-only-clear",
136
+ detail: "COMIMAGE_FLAGS_ILONLY is clear, so managed and native analysis must remain composed.",
137
+ file_offset: cli.headerOffset + 16,
138
+ });
139
+ }
140
+ else if (hasUnity) {
141
+ runtimeFamily = "unity-mono";
142
+ evidence.push({
143
+ code: "unity-reference-observed",
144
+ detail: "The admitted AssemblyRef table contains a UnityEngine reference.",
145
+ file_offset: metadata.table(35)?.offset ?? null,
146
+ });
147
+ }
148
+ else if (frameworks.some((value) => value.startsWith(".NETFramework,"))) {
149
+ runtimeFamily = "dotnet-framework";
150
+ evidence.push({
151
+ code: "target-framework-observed",
152
+ detail: "An assembly-level TargetFrameworkAttribute names .NET Framework.",
153
+ file_offset: metadata.table(12)?.offset ?? null,
154
+ });
155
+ }
156
+ else if (frameworks.some((value) => value.startsWith(".NETCoreApp,") || value.startsWith(".NETStandard,")) ||
157
+ cli.readyToRunSignature) {
158
+ runtimeFamily = "modern-dotnet";
159
+ evidence.push({
160
+ code: cli.readyToRunSignature
161
+ ? "ready-to-run-signature-observed"
162
+ : "target-framework-observed",
163
+ detail: cli.readyToRunSignature
164
+ ? "The managed native header has the ReadyToRun signature."
165
+ : "An assembly-level TargetFrameworkAttribute names modern .NET.",
166
+ file_offset: cli.readyToRunSignature
167
+ ? layout.rvaToOffset(cli.managedNativeHeader.rva, 4, "cli.managed-native-header")
168
+ : (metadata.table(12)?.offset ?? null),
169
+ });
170
+ }
171
+ return { runtime_family: runtimeFamily, evidence };
172
+ };
173
+ const implementationFor = (cli, metadata) => {
174
+ if ((cli.flags & 1) === 0)
175
+ return "cpp-cli-mixed";
176
+ if (cli.readyToRunSignature)
177
+ return "cil-and-ready-to-run";
178
+ return (metadata.rowCounts[6] ?? 0) === 0 ? "metadata-only" : "cil";
179
+ };
180
+ const managedArchitectureFor = (layout, cli) => {
181
+ if (layout.architecture !== "x86" || (cli.flags & 1) === 0)
182
+ return layout.architecture;
183
+ if ((cli.flags & 0x0000_0002) !== 0)
184
+ return "x86";
185
+ if ((cli.flags & 0x0002_0000) !== 0)
186
+ return "anycpu-prefer-32";
187
+ return "anycpu";
188
+ };
189
+ const runtimeClassification = ({ layout, metadata, inventory, }) => {
190
+ const cli = layout.cli;
191
+ if (cli === null)
192
+ throw new TypeError("Managed classification requires CLI");
193
+ const { runtime_family: runtimeFamily, evidence } = runtimeFamilyFor(cli, inventory, metadata, layout);
194
+ const implementation = implementationFor(cli, metadata);
195
+ const managedArchitecture = managedArchitectureFor(layout, cli);
196
+ evidence.push({
197
+ code: "managed-architecture-derived",
198
+ detail: `Managed architecture ${managedArchitecture} is derived from PE machine and CLI flags.`,
199
+ file_offset: cli.headerOffset + 16,
200
+ });
201
+ return {
202
+ runtime_family: runtimeFamily,
203
+ implementation,
204
+ managed_architecture: managedArchitecture,
205
+ evidence,
206
+ };
207
+ };
208
+ const partialMetadataResult = ({ target, bytes, layout, limits, issue, }) => ({
209
+ ...base(target, bytes, layout),
210
+ classification: {
211
+ status: "malformed",
212
+ container: "pe",
213
+ runtime_family: (layout.cli?.flags ?? 1) & 1 ? "unknown" : "mixed-clr-native",
214
+ implementation: "unknown",
215
+ managed_architecture: "unknown",
216
+ evidence: [
217
+ {
218
+ code: "metadata-not-admitted",
219
+ detail: issue.detail,
220
+ file_offset: issue.offset,
221
+ },
222
+ ],
223
+ },
224
+ metadata: {
225
+ status: issue.code === "limit-exceeded" ? "partial" : "malformed",
226
+ version: null,
227
+ stream_names: [],
228
+ table_row_counts: {},
229
+ },
230
+ module: null,
231
+ assembly: null,
232
+ target_frameworks: [],
233
+ references: emptyPage(limits.referenceOffset, limits.referenceLimit),
234
+ resources: emptyPage(limits.resourceOffset, limits.resourceLimit),
235
+ attributes: emptyPage(limits.attributeOffset, limits.attributeLimit),
236
+ coverage: { state: "partial", issues: [issue] },
237
+ limitations: [
238
+ "CLI metadata triage stopped at the reported bounded format or resource limit.",
239
+ ],
240
+ });
241
+ const mapResources = (bytes, layout, issues) => {
242
+ const resources = layout.cli?.resources;
243
+ if (resources === undefined || (resources.rva === 0 && resources.size === 0))
244
+ return null;
245
+ try {
246
+ return {
247
+ offset: layout.rvaToOffset(resources.rva, resources.size, "cli.resources"),
248
+ size: resources.size,
249
+ };
250
+ }
251
+ catch (cause) {
252
+ if (!(cause instanceof ManagedReaderFailure))
253
+ throw cause;
254
+ issues.push(cause.issue);
255
+ return null;
256
+ }
257
+ };
258
+ const inventoryPagesComplete = (inventory) => inventory.references.complete &&
259
+ inventory.resources.complete &&
260
+ inventory.attributes.complete;
261
+ /** Inspect PE/CLI identity directly from bounded bytes without CLR loading. */
262
+ export const inspectManagedArtifactBytes = (bytes, target, limits) => {
263
+ const layout = readManagedPeLayout(bytes);
264
+ if (layout.cli === null)
265
+ return unavailableResult(target, bytes, layout, limits);
266
+ const cli = layout.cli;
267
+ if (cli.metadata.size > limits.maxMetadataBytes)
268
+ return managedArtifactInspectionSchema.parse(partialMetadataResult({
269
+ target,
270
+ bytes,
271
+ layout,
272
+ limits,
273
+ issue: {
274
+ code: "limit-exceeded",
275
+ scope: "cli.metadata",
276
+ offset: cli.headerOffset + 8,
277
+ detail: `CLI metadata size exceeds max_metadata_bytes ${String(limits.maxMetadataBytes)}`,
278
+ },
279
+ }));
280
+ let metadata;
281
+ try {
282
+ const metadataOffset = layout.rvaToOffset(cli.metadata.rva, cli.metadata.size, "cli.metadata");
283
+ metadata = readManagedMetadataLayout(bytes, metadataOffset, cli.metadata.size, limits.maxTableRows);
284
+ }
285
+ catch (cause) {
286
+ if (!(cause instanceof ManagedReaderFailure))
287
+ throw cause;
288
+ return managedArtifactInspectionSchema.parse(partialMetadataResult({
289
+ target,
290
+ bytes,
291
+ layout,
292
+ limits,
293
+ issue: cause.issue,
294
+ }));
295
+ }
296
+ const resourceIssues = [];
297
+ const resourceDirectory = mapResources(bytes, layout, resourceIssues);
298
+ const inventory = readManagedMetadataInventory(bytes, metadata, limits, resourceDirectory);
299
+ const issues = [...resourceIssues, ...inventory.issues];
300
+ const pagesComplete = inventoryPagesComplete(inventory);
301
+ const limitations = [
302
+ ...(pagesComplete
303
+ ? []
304
+ : [
305
+ "At least one caller-selected metadata page omits rows; use its offset and total to continue.",
306
+ ]),
307
+ ...(issues.length === 0
308
+ ? []
309
+ : [
310
+ "At least one bounded metadata or resource item was unavailable; coverage is partial.",
311
+ ]),
312
+ "Static inspection did not load the assembly, resolve dependencies through a CLR, decompile C#, or execute target code.",
313
+ ];
314
+ return managedArtifactInspectionSchema.parse({
315
+ ...base(target, bytes, layout),
316
+ classification: {
317
+ status: "managed",
318
+ container: "pe",
319
+ ...runtimeClassification({ layout, metadata, inventory }),
320
+ },
321
+ metadata: {
322
+ status: issues.length === 0 ? "complete" : "partial",
323
+ version: metadata.version,
324
+ stream_names: metadata.streamNames,
325
+ table_row_counts: managedTableRowCounts(metadata),
326
+ },
327
+ module: inventory.module,
328
+ assembly: inventory.assembly,
329
+ target_frameworks: inventory.targetFrameworks,
330
+ references: inventory.references,
331
+ resources: inventory.resources,
332
+ attributes: inventory.attributes,
333
+ coverage: {
334
+ state: pagesComplete && issues.length === 0 ? "complete" : "partial",
335
+ issues,
336
+ },
337
+ limitations,
338
+ });
339
+ };
@@ -0,0 +1,153 @@
1
+ import { managedMemberInspectionSchema, } from "../domain/managedArtifact.js";
2
+ import { readManagedPeLayout, } from "./ManagedPeReader.js";
3
+ import { managedTableRowCounts, readManagedMetadataInventory, } from "./ManagedMetadataInventory.js";
4
+ import { readManagedMetadataLayout } from "./ManagedMetadataLayout.js";
5
+ import { ManagedReaderFailure, managedFailure, } from "./ManagedReaderFailure.js";
6
+ import { emptyPage, page, parseTypes, typeRanges, } from "./ManagedMemberInspectorCore.js";
7
+ import { edges, parseFields, parseMemberRefs, parseMethods, } from "./ManagedMemberRows.js";
8
+ const unavailable = (target, bytes, limits, issue) => managedMemberInspectionSchema.parse({
9
+ schema_version: 1,
10
+ artifact: {
11
+ path: target.path,
12
+ sha256: target.sha256,
13
+ byte_length: bytes.length,
14
+ format: "pe",
15
+ },
16
+ module: null,
17
+ metadata: {
18
+ status: issue === null ? "absent" : "malformed",
19
+ version: null,
20
+ table_row_counts: {},
21
+ },
22
+ identity_scope: {
23
+ token_identity: "build-local",
24
+ requires_artifact_sha256: target.sha256,
25
+ requires_mvid: null,
26
+ },
27
+ types: emptyPage(limits.typeOffset, limits.typeLimit),
28
+ fields: emptyPage(limits.fieldOffset, limits.fieldLimit),
29
+ methods: emptyPage(limits.methodOffset, limits.methodLimit),
30
+ member_refs: emptyPage(limits.memberRefOffset, limits.memberRefLimit),
31
+ call_edges: emptyPage(limits.edgeOffset, limits.edgeLimit),
32
+ field_accesses: emptyPage(limits.edgeOffset, limits.edgeLimit),
33
+ coverage: {
34
+ state: "unavailable",
35
+ issues: issue === null ? [] : [issue],
36
+ },
37
+ limitations: [
38
+ issue === null
39
+ ? "The PE has no admitted CLI metadata; managed member inspection is unavailable."
40
+ : "The CLI metadata could not be admitted; managed member inspection is unavailable.",
41
+ ],
42
+ });
43
+ const resourceDirectory = (pe) => {
44
+ if (pe.cli === null ||
45
+ pe.cli.resources.rva === 0 ||
46
+ pe.cli.resources.size === 0)
47
+ return null;
48
+ return {
49
+ offset: pe.rvaToOffset(pe.cli.resources.rva, pe.cli.resources.size, "cli.resources"),
50
+ size: pe.cli.resources.size,
51
+ };
52
+ };
53
+ const collectMethodBodyIssues = (methods, limits) => methods.methods.flatMap((method) => method.body.status === "partial"
54
+ ? [
55
+ {
56
+ code: "limit-exceeded",
57
+ scope: `method.${method.token}.body.instructions`,
58
+ offset: method.body.file_offset,
59
+ detail: method.body.issue ??
60
+ `Instruction decode reached max_method_instructions ${String(limits.maxMethodInstructions)}`,
61
+ },
62
+ ]
63
+ : []);
64
+ const readMemberInventory = (bytes, pe, limits) => {
65
+ const cli = pe.cli;
66
+ if (cli === null)
67
+ throw new TypeError("Managed inventory requires CLI metadata");
68
+ const rootOffset = pe.rvaToOffset(cli.metadata.rva, cli.metadata.size, "cli.metadata");
69
+ if (cli.metadata.size > limits.maxMetadataBytes)
70
+ throw managedFailure("limit-exceeded", "metadata.root", `CLI metadata size exceeds max_metadata_bytes ${String(limits.maxMetadataBytes)}`, rootOffset);
71
+ const layout = readManagedMetadataLayout(bytes, rootOffset, cli.metadata.size, limits.maxTableRows);
72
+ const inventory = readManagedMetadataInventory(bytes, layout, {
73
+ referenceOffset: 0,
74
+ referenceLimit: 1,
75
+ resourceOffset: 0,
76
+ resourceLimit: 1,
77
+ attributeOffset: 0,
78
+ attributeLimit: 1,
79
+ maxHeapItemBytes: limits.maxHeapItemBytes,
80
+ }, resourceDirectory(pe));
81
+ return { layout, inventory };
82
+ };
83
+ /** Inspect metadata members and method bodies without loading target code. */
84
+ export const inspectManagedMembersBytes = (bytes, target, limits) => {
85
+ const pe = readManagedPeLayout(bytes);
86
+ if (pe.cli === null)
87
+ return unavailable(target, bytes, limits, pe.cliIssue);
88
+ const issues = [];
89
+ try {
90
+ const { layout, inventory } = readMemberInventory(bytes, pe, limits);
91
+ issues.push(...inventory.issues);
92
+ const ranges = typeRanges(bytes, layout, limits.maxHeapItemBytes);
93
+ const types = parseTypes(bytes, layout, ranges, limits.maxHeapItemBytes);
94
+ const fields = parseFields(bytes, layout, ranges, limits.maxHeapItemBytes);
95
+ const memberRefs = parseMemberRefs(bytes, layout, limits.maxHeapItemBytes);
96
+ const methods = parseMethods({
97
+ bytes,
98
+ layout,
99
+ pe,
100
+ ranges,
101
+ maxBytes: limits.maxHeapItemBytes,
102
+ limits,
103
+ });
104
+ const methodBodyIssues = collectMethodBodyIssues(methods, limits);
105
+ const coverageIssues = [...issues, ...methodBodyIssues];
106
+ const related = edges(methods.methods, methods.core, fields.core, memberRefs.core);
107
+ return managedMemberInspectionSchema.parse({
108
+ schema_version: 1,
109
+ artifact: {
110
+ path: target.path,
111
+ sha256: target.sha256,
112
+ byte_length: bytes.length,
113
+ format: "pe",
114
+ },
115
+ module: inventory.module,
116
+ metadata: {
117
+ status: issues.length === 0 ? "complete" : "partial",
118
+ version: layout.version,
119
+ table_row_counts: managedTableRowCounts(layout),
120
+ },
121
+ identity_scope: {
122
+ token_identity: "build-local",
123
+ requires_artifact_sha256: target.sha256,
124
+ requires_mvid: inventory.module?.mvid ?? null,
125
+ },
126
+ types: page(types, limits.typeOffset, limits.typeLimit),
127
+ fields: page(fields.fields, limits.fieldOffset, limits.fieldLimit),
128
+ methods: page(methods.methods, limits.methodOffset, limits.methodLimit),
129
+ member_refs: page(memberRefs.refs, limits.memberRefOffset, limits.memberRefLimit),
130
+ call_edges: page(related.callEdges, limits.edgeOffset, limits.edgeLimit),
131
+ field_accesses: page(related.fieldAccesses, limits.edgeOffset, limits.edgeLimit),
132
+ coverage: {
133
+ state: coverageIssues.length === 0 ? "complete" : "partial",
134
+ issues: coverageIssues,
135
+ },
136
+ limitations: [
137
+ "Metadata tokens are build-local coordinates and are only meaningful with the reported artifact SHA-256 and MVID.",
138
+ "CIL instruction anchors are decoded from file-backed method bodies only; no target assembly is loaded or executed.",
139
+ "Signatures are decoded for common ECMA-335 primitive, class, valuetype, pointer, byref, array, and generic variable forms; unsupported forms retain raw signature hashes.",
140
+ ...(methodBodyIssues.length > 0
141
+ ? [
142
+ "At least one CIL method body reached max_method_instructions; its decoded prefix is partial and has no normalized CIL identity.",
143
+ ]
144
+ : []),
145
+ ],
146
+ });
147
+ }
148
+ catch (cause) {
149
+ if (cause instanceof ManagedReaderFailure)
150
+ return unavailable(target, bytes, limits, cause.issue);
151
+ throw cause;
152
+ }
153
+ };