@jshookmcp/jshook 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -50
- package/README.zh.md +25 -48
- package/dist/AntiCheatDetector-CGVGNfy5.mjs +1 -0
- package/dist/CacheAdapters-CdAxBmVW.mjs +1 -0
- package/dist/CodeInjector-BlgyqTOk.mjs +1 -0
- package/dist/ConsoleMonitor-Dkqc0HNi.mjs +490 -0
- package/dist/DOMInspector-BYY_EJ0C.mjs +95 -0
- package/dist/DarwinAPI-DC4HGGLl.mjs +1 -0
- package/dist/DetailedDataManager-BniBJlVv.mjs +1 -0
- package/dist/EventBus-DgciURGg.mjs +1 -0
- package/dist/EvidenceGraphBridge-BIfgB7HP.mjs +1 -0
- package/dist/ExtensionManager-erMpqcLk.mjs +1 -0
- package/dist/FingerprintManager-N7BZqjxP.mjs +1 -0
- package/dist/HardwareBreakpoint-OcJqNFVc.mjs +1 -0
- package/dist/HeapAnalyzer-CqAxZzeS.mjs +1 -0
- package/dist/{HookGeneratorBuilders.core.generators.storage-CTbB4Lcx.mjs → HookGeneratorBuilders.core.generators.storage-Bf1fbrNK.mjs} +66 -101
- package/dist/InstrumentationSession-DxXs0sCp.mjs +1 -0
- package/dist/MCPServer.search.handlers.domain-DVbWL1bT.mjs +1 -0
- package/dist/MemoryController-BaqstM5w.mjs +2 -0
- package/dist/MemoryScanSession-CaxAjZJf.mjs +1 -0
- package/dist/MemoryScanner-BLYnMJy6.mjs +1 -0
- package/dist/NativeMemoryManager.impl-CI554XbY.mjs +1 -0
- package/dist/NativeMemoryManager.utils-DM4NC3FE.mjs +1 -0
- package/dist/PEAnalyzer-DJyaJTQJ.mjs +1 -0
- package/dist/PageController-D9jVkH0i.mjs +1 -0
- package/dist/PointerChainEngine-5nF9eNlu.mjs +1 -0
- package/dist/PrerequisiteError-Bl3dK8XA.mjs +1 -0
- package/dist/ProcessRegistry-Hf12LlR9.mjs +1 -0
- package/dist/ResponseBuilder-B2lu4KEl.mjs +1 -0
- package/dist/ReverseEvidenceGraph-B931HeoW.mjs +2 -0
- package/dist/ScriptManager-fgqiALgj.mjs +7 -0
- package/dist/Speedhack-l6s8L2Qw.mjs +1 -0
- package/dist/StealthVerifier-Dhbj4B4P.mjs +1 -0
- package/dist/StructureAnalyzer-A-WamfYE.mjs +2 -0
- package/dist/ToolCatalog-D_IKl1Hu.mjs +1 -0
- package/dist/ToolError-DWU_z7gp.mjs +1 -0
- package/dist/ToolProbe-xsfALmN3.mjs +1 -0
- package/dist/ToolRegistry-B0Zs-phN.mjs +1 -0
- package/dist/ToolRouter.policy-CFHoN_Lw.mjs +4 -0
- package/dist/TraceRecorder-Dd8jLXpi.mjs +272 -0
- package/dist/VersionDetector-DMoUWyNm.mjs +9 -0
- package/dist/Win32API-Bhi5xFBe.mjs +1 -0
- package/dist/Win32Debug-CQteFL4F.mjs +1 -0
- package/dist/WorkflowEngine-CxEp2WXH.mjs +1 -0
- package/dist/analysis-BuR-NgX8.mjs +5 -0
- package/dist/{antidebug-BRKeyt27.mjs → antidebug-BOTZH6-0.mjs} +8 -259
- package/dist/artifactRetention-NBdncOEW.mjs +1 -0
- package/dist/artifacts-B5xQuEa_.mjs +1 -0
- package/dist/authorization-schema-B40obG1A.mjs +1 -0
- package/dist/betterSqlite3-CGaxz4AX.mjs +1 -0
- package/dist/binary-instrument-Cf9qqLlM.mjs +7 -0
- package/dist/bind-helpers-BlAOQrFQ.mjs +1 -0
- package/dist/boringssl-inspector-BST5vtKx.mjs +2 -0
- package/dist/browser-C4Le3xqA.mjs +11 -0
- package/dist/capabilities-DbYCv-HF.mjs +1 -0
- package/dist/chunk-C_pMuVsO.mjs +1 -0
- package/dist/collector-CKO8RPK8.mjs +1 -0
- package/dist/concurrency-CcK46d0h.mjs +1 -0
- package/dist/constants-Cp6hBrrx.mjs +1 -0
- package/dist/coordination-BbijHEHH.mjs +1 -0
- package/dist/debugger-CRJq_krh.mjs +1 -0
- package/dist/definitions-BGobEDQa.mjs +1 -0
- package/dist/definitions-BGwNSkVm.mjs +1 -0
- package/dist/definitions-BbxOUiP-.mjs +1 -0
- package/dist/definitions-CCP9gphV.mjs +1 -0
- package/dist/definitions-CIO9O-Sw.mjs +1 -0
- package/dist/definitions-CYFbewnd.mjs +1 -0
- package/dist/definitions-CdWEuIkI.mjs +1 -0
- package/dist/definitions-CoQFbggH.mjs +1 -0
- package/dist/definitions-CuJRsJ6N.mjs +1 -0
- package/dist/definitions-DI9YXsJk.mjs +1 -0
- package/dist/definitions-DJklW2sS.mjs +1 -0
- package/dist/definitions-DZ8uKusP.mjs +1 -0
- package/dist/definitions-Dds_zrWx.mjs +1 -0
- package/dist/definitions-Dgrg7f3D.mjs +1 -0
- package/dist/definitions-DtE0XLrT.mjs +1 -0
- package/dist/definitions-LaYTuwQd.mjs +26 -0
- package/dist/definitions-NoVp_9Pm.mjs +1 -0
- package/dist/definitions-OvGsfxdt.mjs +1 -0
- package/dist/definitions-jXPaVy4P.mjs +1 -0
- package/dist/encoding-DGcr6Aj_.mjs +2 -0
- package/dist/ensure-browser-core-Buls24LQ.mjs +1 -0
- package/dist/evidence-graph-bridge-B0yhGPcs.mjs +1 -0
- package/dist/factory-Cx_1LorX.mjs +1 -0
- package/dist/flat-target-session-CO5g78k3.mjs +1 -0
- package/dist/formatAddress-C7j2fDlM.mjs +1 -0
- package/dist/graphql-HLf3MS8H.mjs +62 -0
- package/dist/handlers-BLMa4X7l.mjs +54 -0
- package/dist/handlers-BP12ZsWc.mjs +4 -0
- package/dist/handlers-BZoPla6E.mjs +1 -0
- package/dist/handlers-BggKiVx9.mjs +2 -0
- package/dist/handlers-D3iev8g1.mjs +1 -0
- package/dist/handlers-D49r1-1P.mjs +1 -0
- package/dist/handlers-DCE45Ww8.mjs +2 -0
- package/dist/handlers-DW5AbYs5.mjs +5 -0
- package/dist/handlers-De5u62Ga2.mjs +1 -0
- package/dist/handlers-DmQzIc44.mjs +31 -0
- package/dist/handlers-DnJRGp7t.mjs +302 -0
- package/dist/handlers-Dv_runVv.mjs +2 -0
- package/dist/handlers-S9Ws0IGy.mjs +2 -0
- package/dist/{handlers-Dz9PYsCa.mjs → handlers-pVNpaw4A.mjs} +118 -904
- package/dist/handlers.impl-CD2_kOcC.mjs +1 -0
- package/dist/hooks-DDKppogd.mjs +600 -0
- package/dist/index.mjs +12 -5235
- package/dist/logger-sBC6IdRT.mjs +1 -0
- package/dist/maintenance-CutEO84j.mjs +1 -0
- package/dist/manifest-BFGxlDRh.mjs +123 -0
- package/dist/manifest-BPuE6oH2.mjs +1 -0
- package/dist/manifest-BXry5N09.mjs +1 -0
- package/dist/manifest-BeP_zJGb2.mjs +1 -0
- package/dist/manifest-C0g67k6U.mjs +1 -0
- package/dist/manifest-C1nZkTkO.mjs +1 -0
- package/dist/manifest-C7qV1z7F.mjs +1 -0
- package/dist/manifest-CDeUZGUZ.mjs +1 -0
- package/dist/manifest-CDiCtaQT.mjs +1 -0
- package/dist/manifest-CFn0359q2.mjs +1 -0
- package/dist/manifest-CGq4NpqH2.mjs +1 -0
- package/dist/manifest-CJMGt7Qy.mjs +1 -0
- package/dist/manifest-CRIJq4Hs.mjs +1 -0
- package/dist/manifest-C_hEIjSx.mjs +1 -0
- package/dist/manifest-CeQmtQOY.mjs +1 -0
- package/dist/manifest-Cq0j7GZt.mjs +1 -0
- package/dist/manifest-CtPmHAdn.mjs +1 -0
- package/dist/manifest-Cx2IVMUY.mjs +1 -0
- package/dist/manifest-D16xPXro.mjs +1 -0
- package/dist/manifest-D44TaRJU.mjs +1 -0
- package/dist/manifest-D610kxZr.mjs +2 -0
- package/dist/manifest-DC-SMF6b.mjs +1 -0
- package/dist/manifest-DD3rtxvV.mjs +1 -0
- package/dist/manifest-DKUorv5M.mjs +1 -0
- package/dist/manifest-DMJlcsTR.mjs +1 -0
- package/dist/manifest-DWUUWBz0.mjs +1 -0
- package/dist/manifest-De-6Wf2R.mjs +1 -0
- package/dist/manifest-Dgh0uDW-.mjs +1 -0
- package/dist/manifest-Dm0o3i2U.mjs +1 -0
- package/dist/manifest-DsVh7Y4U.mjs +1 -0
- package/dist/manifest-DtEFSRaq.mjs +1 -0
- package/dist/manifest-H-EpAyZQ.mjs +1 -0
- package/dist/manifest-ais9Afrw.mjs +1 -0
- package/dist/manifest-tmb54wmA.mjs +1 -0
- package/dist/manifest-yu2xiQqe.mjs +1 -0
- package/dist/manifest-zrbrpKCC.mjs +1 -0
- package/dist/matchesWildcardPattern-BGqLSmEs.mjs +1 -0
- package/dist/modules-p-PUNv9r.mjs +332 -0
- package/dist/mojo-ipc-VGlv3Qyp.mjs +9 -0
- package/dist/network-BjZ1Y-GB.mjs +7 -0
- package/dist/outputPaths-BonGThuc.mjs +2 -0
- package/dist/parse-args-Cuk7-xUt.mjs +1 -0
- package/dist/platform-C446Lf97.mjs +93 -0
- package/dist/playwright-cdp-fallback-BwVR-_T3.mjs +1 -0
- package/dist/process-C9f2A5zk.mjs +962 -0
- package/dist/proxy-CvRepxgV.mjs +1 -0
- package/dist/registry-DUHIPE-v.mjs +1 -0
- package/dist/response-C7rKQst4.mjs +1 -0
- package/dist/search-defaults-D2bY-rzH.mjs +1 -0
- package/dist/server/plugin-api.mjs +1 -293
- package/dist/shared-state-board-Cyg-xh_k.mjs +1 -0
- package/dist/sourcemap-D6Q1UuAp.mjs +1 -0
- package/dist/ssrf-policy-T96MR3r6.mjs +1 -0
- package/dist/streaming-CTX58tbb.mjs +1 -0
- package/dist/tool-builder-CI9914Tf.mjs +1 -0
- package/dist/transform-Cv9P2vVD.mjs +103 -0
- package/dist/types-CuyefmGT.mjs +1 -0
- package/dist/types-DtThH00r.mjs +1 -0
- package/dist/wasm-DaJa8J0V.mjs +174 -0
- package/dist/webcrack-CsLLJIs9.mjs +46 -0
- package/dist/workflow-CYIXtrWD.mjs +101 -0
- package/package.json +50 -78
- package/dist/AntiCheatDetector-CqGDXmfc.mjs +0 -350
- package/dist/CacheAdapters-jJFy20G-.mjs +0 -80
- package/dist/CodeInjector-BdjRfNx7.mjs +0 -150
- package/dist/ConsoleMonitor-DykL3IAw.mjs +0 -2269
- package/dist/DarwinAPI-ETyy0xyo.mjs +0 -363
- package/dist/DetailedDataManager-HT49OrvF.mjs +0 -217
- package/dist/EventBus-DFKvADm3.mjs +0 -141
- package/dist/EvidenceGraphBridge-318Oi0Lf.mjs +0 -153
- package/dist/ExtensionManager-BDMsY2Dz.mjs +0 -721
- package/dist/FingerprintManager-BN4UQWnX.mjs +0 -96
- package/dist/HardwareBreakpoint-Cc2AFq1Y.mjs +0 -239
- package/dist/HeapAnalyzer-DruMgsgj.mjs +0 -284
- package/dist/InstrumentationSession-DLH0vd-z.mjs +0 -244
- package/dist/MemoryController-CMtviNW_.mjs +0 -167
- package/dist/MemoryScanSession-ITgb_NMi.mjs +0 -278
- package/dist/MemoryScanner-CiL7Z3ey.mjs +0 -428
- package/dist/NativeMemoryManager.impl-D9Lkovvn.mjs +0 -485
- package/dist/NativeMemoryManager.utils-BBlAixF5.mjs +0 -165
- package/dist/PEAnalyzer-DMQ44gen.mjs +0 -385
- package/dist/PageController-BPJNqqBN.mjs +0 -431
- package/dist/PointerChainEngine-K7wN8Z-w.mjs +0 -325
- package/dist/PrerequisiteError-TuyZIs6n.mjs +0 -20
- package/dist/ProcessRegistry-zGg12QbE.mjs +0 -74
- package/dist/ResponseBuilder-CJXWmWNw.mjs +0 -143
- package/dist/ReverseEvidenceGraph-C02-gXOh.mjs +0 -269
- package/dist/ScriptManager-ZuWD-0Jg.mjs +0 -3003
- package/dist/Speedhack-D-z0umeT.mjs +0 -156
- package/dist/StealthVerifier-BWmPgQsv.mjs +0 -135
- package/dist/StructureAnalyzer-Cav5AVSL.mjs +0 -429
- package/dist/ToolCatalog-5OJdMiF0.mjs +0 -582
- package/dist/ToolError-jh9whhMd.mjs +0 -15
- package/dist/ToolProbe-DbCFGyrg.mjs +0 -45
- package/dist/ToolRegistry-B9krbTtI.mjs +0 -180
- package/dist/ToolRouter.policy-BGDAGyeH.mjs +0 -344
- package/dist/TraceRecorder-B41Z5XBj.mjs +0 -1286
- package/dist/VersionDetector-K3V4vGsw.mjs +0 -104
- package/dist/Win32API-C2kjj0ze.mjs +0 -346
- package/dist/Win32Debug-CKrGOTpo.mjs +0 -274
- package/dist/WorkflowEngine-DJ6M4opp.mjs +0 -569
- package/dist/analysis-BHeJW2Nb.mjs +0 -1234
- package/dist/artifactRetention-CPXkUJXp.mjs +0 -598
- package/dist/artifacts-DkfosXH3.mjs +0 -59
- package/dist/authorization-schema-DRqyJMSk.mjs +0 -31
- package/dist/betterSqlite3-DLSBZodi.mjs +0 -74
- package/dist/binary-instrument--V3MAhJ4.mjs +0 -971
- package/dist/bind-helpers-ClV34xdn.mjs +0 -42
- package/dist/boringssl-inspector-Bo_LOLaS.mjs +0 -180
- package/dist/browser-Dx3_S2cG.mjs +0 -4369
- package/dist/capabilities-CcHlvWgK.mjs +0 -33
- package/dist/chunk-CjcI7cDX.mjs +0 -15
- package/dist/concurrency-Drev_Vz9.mjs +0 -41
- package/dist/constants-CDZLOoVv.mjs +0 -534
- package/dist/coordination-DgItD9DL.mjs +0 -259
- package/dist/debugger-RS3RSAqs.mjs +0 -1288
- package/dist/definitions-BEoYofW5.mjs +0 -47
- package/dist/definitions-BRaefg3u.mjs +0 -365
- package/dist/definitions-BbkvZkiv.mjs +0 -96
- package/dist/definitions-BtWSHJ3o.mjs +0 -17
- package/dist/definitions-C1gCHO0i.mjs +0 -43
- package/dist/definitions-CDOg_b-l.mjs +0 -138
- package/dist/definitions-CVPD9hzZ.mjs +0 -54
- package/dist/definitions-Cea8Lgl7.mjs +0 -94
- package/dist/definitions-DAgIyjxM.mjs +0 -10
- package/dist/definitions-DJA27nsL.mjs +0 -66
- package/dist/definitions-DKPFU3LW.mjs +0 -25
- package/dist/definitions-DPRpZQ96.mjs +0 -47
- package/dist/definitions-DUE5gmdn.mjs +0 -18
- package/dist/definitions-DYVjOtxa.mjs +0 -26
- package/dist/definitions-DcYLVLCo.mjs +0 -37
- package/dist/definitions-Pp5LI2H4.mjs +0 -27
- package/dist/definitions-j9KdHVNR.mjs +0 -14
- package/dist/definitions-uzkjBwa7.mjs +0 -258
- package/dist/definitions-va-AnLuQ.mjs +0 -28
- package/dist/encoding-DJeqHmpd.mjs +0 -1079
- package/dist/evidence-graph-bridge-DcYizFk2.mjs +0 -136
- package/dist/factory-C90tBff6.mjs +0 -575
- package/dist/flat-target-session-Dgax2Cy3.mjs +0 -29
- package/dist/formatAddress-nnMvEohD.mjs +0 -17
- package/dist/graphql-CoHrhweh.mjs +0 -1197
- package/dist/handlers-4jmR0nMs.mjs +0 -898
- package/dist/handlers-BAHPxcch.mjs +0 -789
- package/dist/handlers-BOs9b907.mjs +0 -2600
- package/dist/handlers-BWXEy6ef.mjs +0 -917
- package/dist/handlers-Bndn6QvE.mjs +0 -111
- package/dist/handlers-BqC4bD4s.mjs +0 -681
- package/dist/handlers-BtYq60bM2.mjs +0 -276
- package/dist/handlers-BzgcB4iv.mjs +0 -799
- package/dist/handlers-CRyRWj2b.mjs +0 -859
- package/dist/handlers-CVv2H1uq.mjs +0 -592
- package/dist/handlers-Dl5a7JS4.mjs +0 -572
- package/dist/handlers-Dx2d7jt7.mjs +0 -2537
- package/dist/handlers-HujRKC3b.mjs +0 -661
- package/dist/handlers.impl-XWXkQfyi.mjs +0 -807
- package/dist/hooks-B1B8NRHL.mjs +0 -898
- package/dist/logger-Dh_xb7_2.mjs +0 -93
- package/dist/maintenance-PRMkLVRW.mjs +0 -835
- package/dist/manifest-67Bok-Si.mjs +0 -58
- package/dist/manifest-6lNTMZAB2.mjs +0 -87
- package/dist/manifest-B2duEHiH.mjs +0 -90
- package/dist/manifest-B6EY9Vm8.mjs +0 -57
- package/dist/manifest-B6nKSbyY.mjs +0 -95
- package/dist/manifest-BL8AQNPF.mjs +0 -106
- package/dist/manifest-BSZvJJmV.mjs +0 -47
- package/dist/manifest-BU7qzUyX.mjs +0 -418
- package/dist/manifest-Bl62e8WK.mjs +0 -49
- package/dist/manifest-Bo5cXjdt.mjs +0 -82
- package/dist/manifest-BpS4gtUK.mjs +0 -1347
- package/dist/manifest-Bv65_e2W.mjs +0 -101
- package/dist/manifest-BytNIF4Z.mjs +0 -117
- package/dist/manifest-C-xtsjS3.mjs +0 -81
- package/dist/manifest-CDYl7OhA.mjs +0 -66
- package/dist/manifest-CRZ3xmkD.mjs +0 -61
- package/dist/manifest-CoW6u4Tp.mjs +0 -132
- package/dist/manifest-Cq5zN_8A.mjs +0 -50
- package/dist/manifest-D7YZM_2e.mjs +0 -194
- package/dist/manifest-DE_VrAeQ.mjs +0 -314
- package/dist/manifest-DGsXSCpT.mjs +0 -39
- package/dist/manifest-DJ2vfEuW.mjs +0 -156
- package/dist/manifest-DPXDYhEu.mjs +0 -80
- package/dist/manifest-Dd4fQb0a.mjs +0 -322
- package/dist/manifest-Deq6opGg.mjs +0 -223
- package/dist/manifest-DfJTafJK.mjs +0 -37
- package/dist/manifest-DgOdgN_j.mjs +0 -50
- package/dist/manifest-DlbMW4v4.mjs +0 -47
- package/dist/manifest-DmVfbH0w.mjs +0 -374
- package/dist/manifest-Dog6Ddjr.mjs +0 -109
- package/dist/manifest-DvgU5FWb.mjs +0 -58
- package/dist/manifest-HsfDBs7j.mjs +0 -50
- package/dist/manifest-I8oQHvCG.mjs +0 -186
- package/dist/manifest-NvH_a-av.mjs +0 -786
- package/dist/manifest-cEJU1v0Z.mjs +0 -129
- package/dist/manifest-wOl5XLB12.mjs +0 -112
- package/dist/modules-tZozf0LQ.mjs +0 -10635
- package/dist/mojo-ipc-DXNEXEqb.mjs +0 -640
- package/dist/network-CPVvwvFg.mjs +0 -3852
- package/dist/outputPaths-um7lCRY3.mjs +0 -1141
- package/dist/parse-args-B4cY5Vx5.mjs +0 -39
- package/dist/platform-CYeFoTWp.mjs +0 -2161
- package/dist/process-BTbgcVc6.mjs +0 -1306
- package/dist/proxy-r8YN6nP1.mjs +0 -192
- package/dist/registry-Bl8ZQW61.mjs +0 -34
- package/dist/response-CWhh2aLo.mjs +0 -34
- package/dist/shared-state-board-BoZnSoj-.mjs +0 -586
- package/dist/sourcemap-BIDHUVXy.mjs +0 -934
- package/dist/ssrf-policy-Dsqd-DTX.mjs +0 -166
- package/dist/streaming-Dal6utPp.mjs +0 -725
- package/dist/tool-builder-BHJp32mV.mjs +0 -186
- package/dist/transform-DRVgGG90.mjs +0 -1011
- package/dist/types-Bx92KJfT.mjs +0 -4
- package/dist/types-DDBWs9UP.mjs +0 -37
- package/dist/wasm-BYx5UOeG.mjs +0 -1044
- package/dist/webcrack-Be0_FccV.mjs +0 -747
- package/dist/workflow-BpuKEtvn.mjs +0 -725
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
//#region src/server/instrumentation/InstrumentationSession.ts
|
|
2
|
-
let nextId = 0;
|
|
3
|
-
function uid(prefix) {
|
|
4
|
-
return `${prefix}-${Date.now().toString(36)}-${(++nextId).toString(36)}`;
|
|
5
|
-
}
|
|
6
|
-
function isRecord(value) {
|
|
7
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
8
|
-
}
|
|
9
|
-
function parseToolPayload(response) {
|
|
10
|
-
const firstText = response.content.find((item) => item.type === "text" && typeof item.text === "string");
|
|
11
|
-
if (!firstText) throw new Error("Expected JSON text payload from wrapped tool response");
|
|
12
|
-
let parsed;
|
|
13
|
-
try {
|
|
14
|
-
parsed = JSON.parse(firstText.text);
|
|
15
|
-
} catch (error) {
|
|
16
|
-
throw new Error(
|
|
17
|
-
/* istanbul ignore next */
|
|
18
|
-
`Wrapped tool returned non-JSON text payload: ${error instanceof Error ? error.message : String(error)}`,
|
|
19
|
-
{ cause: error }
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
if (!isRecord(parsed)) throw new Error("Wrapped tool returned JSON that is not an object");
|
|
23
|
-
return parsed;
|
|
24
|
-
}
|
|
25
|
-
function getStringArray(value) {
|
|
26
|
-
return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
|
|
27
|
-
}
|
|
28
|
-
var InstrumentationSessionManager = class {
|
|
29
|
-
/** All sessions (including destroyed). */
|
|
30
|
-
sessions = /* @__PURE__ */ new Map();
|
|
31
|
-
/** Session ID → operations. */
|
|
32
|
-
operations = /* @__PURE__ */ new Map();
|
|
33
|
-
/** Session ID → artifacts. */
|
|
34
|
-
artifacts = /* @__PURE__ */ new Map();
|
|
35
|
-
/** Operation ID → owning session ID (reverse index). */
|
|
36
|
-
operationIndex = /* @__PURE__ */ new Map();
|
|
37
|
-
/** Optional evidence graph bridge for auto-population (EVID-04). */
|
|
38
|
-
evidenceBridge;
|
|
39
|
-
/** Set the evidence graph bridge for auto-populating evidence nodes. */
|
|
40
|
-
setEvidenceBridge(bridge) {
|
|
41
|
-
this.evidenceBridge = bridge;
|
|
42
|
-
}
|
|
43
|
-
createSession(name) {
|
|
44
|
-
const id = uid("sess");
|
|
45
|
-
const info = {
|
|
46
|
-
id,
|
|
47
|
-
name,
|
|
48
|
-
createdAt: Date.now(),
|
|
49
|
-
operationCount: 0,
|
|
50
|
-
artifactCount: 0,
|
|
51
|
-
status: "active"
|
|
52
|
-
};
|
|
53
|
-
this.sessions.set(id, info);
|
|
54
|
-
this.operations.set(id, []);
|
|
55
|
-
this.artifacts.set(id, []);
|
|
56
|
-
return info;
|
|
57
|
-
}
|
|
58
|
-
destroySession(sessionId) {
|
|
59
|
-
const session = this.sessions.get(sessionId);
|
|
60
|
-
if (!session) throw new Error(`Session "${sessionId}" not found`);
|
|
61
|
-
session.status = "destroyed";
|
|
62
|
-
/* istanbul ignore next */
|
|
63
|
-
const ops = this.operations.get(sessionId) ?? [];
|
|
64
|
-
for (const op of ops) if (op.status === "active") op.status = "completed";
|
|
65
|
-
}
|
|
66
|
-
listSessions() {
|
|
67
|
-
return [...this.sessions.values()].filter((s) => s.status === "active");
|
|
68
|
-
}
|
|
69
|
-
getSession(sessionId) {
|
|
70
|
-
return this.sessions.get(sessionId);
|
|
71
|
-
}
|
|
72
|
-
registerOperation(sessionId, type, target, config) {
|
|
73
|
-
const session = this.sessions.get(sessionId);
|
|
74
|
-
if (!session) throw new Error(`Session "${sessionId}" not found`);
|
|
75
|
-
if (session.status === "destroyed") throw new Error(`Session "${sessionId}" is destroyed — cannot register new operations`);
|
|
76
|
-
const id = uid("op");
|
|
77
|
-
const op = {
|
|
78
|
-
id,
|
|
79
|
-
sessionId,
|
|
80
|
-
type,
|
|
81
|
-
target,
|
|
82
|
-
config,
|
|
83
|
-
createdAt: Date.now(),
|
|
84
|
-
status: "active"
|
|
85
|
-
};
|
|
86
|
-
const ops = this.operations.get(sessionId);
|
|
87
|
-
ops.push(op);
|
|
88
|
-
this.operationIndex.set(id, sessionId);
|
|
89
|
-
session.operationCount = ops.length;
|
|
90
|
-
this.evidenceBridge?.onOperation(op);
|
|
91
|
-
return op;
|
|
92
|
-
}
|
|
93
|
-
getSessionOperations(sessionId) {
|
|
94
|
-
/* istanbul ignore next */
|
|
95
|
-
return this.operations.get(sessionId) ?? [];
|
|
96
|
-
}
|
|
97
|
-
recordArtifact(operationId, data) {
|
|
98
|
-
const sessionId = this.operationIndex.get(operationId);
|
|
99
|
-
if (!sessionId) throw new Error(`Operation "${operationId}" not found`);
|
|
100
|
-
const op = (this.operations.get(sessionId) ?? []).find((o) => o.id === operationId);
|
|
101
|
-
if (!op) throw new Error(`Operation "${operationId}" metadata missing`);
|
|
102
|
-
const artifact = {
|
|
103
|
-
operationId,
|
|
104
|
-
sessionId,
|
|
105
|
-
type: op.type,
|
|
106
|
-
timestamp: Date.now(),
|
|
107
|
-
data
|
|
108
|
-
};
|
|
109
|
-
const sessionArtifacts = this.artifacts.get(sessionId);
|
|
110
|
-
sessionArtifacts.push(artifact);
|
|
111
|
-
const session = this.sessions.get(sessionId);
|
|
112
|
-
session.artifactCount = sessionArtifacts.length;
|
|
113
|
-
this.evidenceBridge?.onArtifact(artifact);
|
|
114
|
-
return artifact;
|
|
115
|
-
}
|
|
116
|
-
getArtifacts(sessionId, type) {
|
|
117
|
-
/* istanbul ignore next */
|
|
118
|
-
const all = this.artifacts.get(sessionId) ?? [];
|
|
119
|
-
if (!type) return all;
|
|
120
|
-
return all.filter((a) => a.type === type);
|
|
121
|
-
}
|
|
122
|
-
getSessionSnapshot(sessionId) {
|
|
123
|
-
const session = this.sessions.get(sessionId);
|
|
124
|
-
if (!session) return;
|
|
125
|
-
return {
|
|
126
|
-
session,
|
|
127
|
-
stats: this.getSessionStats(sessionId),
|
|
128
|
-
operations: [...this.getSessionOperations(sessionId)],
|
|
129
|
-
artifacts: [...this.getArtifacts(sessionId)]
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
listSessionSnapshots() {
|
|
133
|
-
return this.listSessions().map((session) => ({
|
|
134
|
-
session,
|
|
135
|
-
stats: this.getSessionStats(session.id),
|
|
136
|
-
operations: [...this.getSessionOperations(session.id)],
|
|
137
|
-
artifacts: [...this.getArtifacts(session.id)]
|
|
138
|
-
}));
|
|
139
|
-
}
|
|
140
|
-
async applyHookPreset(sessionId, presetInvoker, args) {
|
|
141
|
-
const presetNames = getStringArray(args["presets"]);
|
|
142
|
-
const target = (typeof args["preset"] === "string" ? args["preset"] : void 0) ?? (presetNames.length > 0 ? presetNames.join(", ") : "hook_preset");
|
|
143
|
-
return this.executeTrackedTool({
|
|
144
|
-
sessionId,
|
|
145
|
-
type: "runtime-hook",
|
|
146
|
-
target,
|
|
147
|
-
config: { ...args },
|
|
148
|
-
invoke: () => presetInvoker.handleHookPreset(args),
|
|
149
|
-
isSuccessful: (payload) => {
|
|
150
|
-
return getStringArray(payload.injected).length > 0;
|
|
151
|
-
},
|
|
152
|
-
buildArtifacts: (payload) => {
|
|
153
|
-
const injected = getStringArray(payload.injected);
|
|
154
|
-
return [{
|
|
155
|
-
presetIds: injected,
|
|
156
|
-
failedPresets: Array.isArray(payload.failed) ? payload.failed.filter((item) => isRecord(item) && typeof item["preset"] === "string" && typeof item["error"] === "string") : [],
|
|
157
|
-
injectionPoint: payload.method === "evaluateOnNewDocument" ? "before-load" : "runtime",
|
|
158
|
-
scriptContent: injected.join(", "),
|
|
159
|
-
body: payload
|
|
160
|
-
}];
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
async replayNetworkRequest(sessionId, replayInvoker, args) {
|
|
165
|
-
const requestId = typeof args["requestId"] === "string" ? args["requestId"] : "network_replay";
|
|
166
|
-
const urlOverride = typeof args["urlOverride"] === "string" ? args["urlOverride"] : void 0;
|
|
167
|
-
return this.executeTrackedTool({
|
|
168
|
-
sessionId,
|
|
169
|
-
type: "network-intercept",
|
|
170
|
-
target: requestId,
|
|
171
|
-
config: { ...args },
|
|
172
|
-
invoke: () => replayInvoker.handleNetworkReplayRequest(args),
|
|
173
|
-
buildArtifacts: (payload) => {
|
|
174
|
-
if (payload.dryRun === true && isRecord(payload.preview)) return [{
|
|
175
|
-
requestId,
|
|
176
|
-
url: typeof payload.preview["url"] === "string" ? payload.preview["url"] : urlOverride,
|
|
177
|
-
method: typeof payload.preview["method"] === "string" ? payload.preview["method"] : void 0,
|
|
178
|
-
headers: isRecord(payload.preview["headers"]) ? payload.preview["headers"] : void 0,
|
|
179
|
-
body: payload.preview["body"],
|
|
180
|
-
replayMode: "dry-run"
|
|
181
|
-
}];
|
|
182
|
-
return [{
|
|
183
|
-
requestId: typeof payload.requestId === "string" ? payload.requestId : requestId,
|
|
184
|
-
url: urlOverride,
|
|
185
|
-
method: typeof args["methodOverride"] === "string" ? args["methodOverride"] : void 0,
|
|
186
|
-
headers: isRecord(payload.headers) ? payload.headers : void 0,
|
|
187
|
-
body: payload.body,
|
|
188
|
-
statusCode: typeof payload.status === "number" ? payload.status : void 0,
|
|
189
|
-
statusText: typeof payload.statusText === "string" ? payload.statusText : void 0,
|
|
190
|
-
bodyTruncated: typeof payload.bodyTruncated === "boolean" ? payload.bodyTruncated : void 0,
|
|
191
|
-
replayMode: "live"
|
|
192
|
-
}];
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
getSessionStats(sessionId) {
|
|
197
|
-
const session = this.sessions.get(sessionId);
|
|
198
|
-
if (!session) return {
|
|
199
|
-
operationCount: 0,
|
|
200
|
-
artifactCount: 0
|
|
201
|
-
};
|
|
202
|
-
return {
|
|
203
|
-
operationCount: session.operationCount,
|
|
204
|
-
artifactCount: session.artifactCount
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
findOperation(operationId) {
|
|
208
|
-
const sessionId = this.operationIndex.get(operationId);
|
|
209
|
-
if (!sessionId) return;
|
|
210
|
-
/* istanbul ignore next */
|
|
211
|
-
return (this.operations.get(sessionId) ?? []).find((operation) => operation.id === operationId);
|
|
212
|
-
}
|
|
213
|
-
setOperationStatus(operationId, status) {
|
|
214
|
-
const operation = this.findOperation(operationId);
|
|
215
|
-
if (operation) operation.status = status;
|
|
216
|
-
}
|
|
217
|
-
async executeTrackedTool(spec) {
|
|
218
|
-
const operation = this.registerOperation(spec.sessionId, spec.type, spec.target, spec.config);
|
|
219
|
-
try {
|
|
220
|
-
const payload = parseToolPayload(await spec.invoke());
|
|
221
|
-
if (!(spec.isSuccessful ? spec.isSuccessful(payload) : payload["success"] !== false)) {
|
|
222
|
-
this.setOperationStatus(operation.id, "failed");
|
|
223
|
-
return {
|
|
224
|
-
operation,
|
|
225
|
-
artifacts: [],
|
|
226
|
-
payload
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
/* istanbul ignore next */
|
|
230
|
-
const artifacts = (spec.buildArtifacts?.(payload) ?? []).map((artifactData) => this.recordArtifact(operation.id, artifactData));
|
|
231
|
-
this.setOperationStatus(operation.id, "completed");
|
|
232
|
-
return {
|
|
233
|
-
operation,
|
|
234
|
-
artifacts,
|
|
235
|
-
payload
|
|
236
|
-
};
|
|
237
|
-
} catch (error) {
|
|
238
|
-
this.setOperationStatus(operation.id, "failed");
|
|
239
|
-
throw error;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
};
|
|
243
|
-
//#endregion
|
|
244
|
-
export { InstrumentationSessionManager };
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import { Vr as WRITE_HISTORY_MAX, Z as FREEZE_DEFAULT_INTERVAL_MS } from "./constants-CDZLOoVv.mjs";
|
|
2
|
-
import { _ as WriteProcessMemory, b as openProcessForMemory, d as ReadProcessMemory, m as VirtualProtectEx, t as CloseHandle, u as PAGE } from "./Win32API-C2kjj0ze.mjs";
|
|
3
|
-
import { i as parsePattern } from "./NativeMemoryManager.utils-BBlAixF5.mjs";
|
|
4
|
-
import { randomUUID } from "node:crypto";
|
|
5
|
-
//#region src/native/MemoryController.ts
|
|
6
|
-
/**
|
|
7
|
-
* Memory Controller — freeze, undo/redo writes, memory dump.
|
|
8
|
-
*
|
|
9
|
-
* @module MemoryController
|
|
10
|
-
*/
|
|
11
|
-
var MemoryController = class {
|
|
12
|
-
freezes = /* @__PURE__ */ new Map();
|
|
13
|
-
writeHistory = [];
|
|
14
|
-
undoneStack = [];
|
|
15
|
-
/** Write a typed value to memory (with undo support) */
|
|
16
|
-
async writeValue(pid, address, value, valueType) {
|
|
17
|
-
const addr = BigInt(address.startsWith("0x") ? address : `0x${address}`);
|
|
18
|
-
const { patternBytes } = parsePattern(value, valueType);
|
|
19
|
-
const newBuf = Buffer.from(patternBytes);
|
|
20
|
-
const handle = openProcessForMemory(pid, true);
|
|
21
|
-
try {
|
|
22
|
-
const oldBuf = ReadProcessMemory(handle, addr, newBuf.length);
|
|
23
|
-
const { oldProtect } = VirtualProtectEx(handle, addr, newBuf.length, PAGE.READWRITE);
|
|
24
|
-
WriteProcessMemory(handle, addr, newBuf);
|
|
25
|
-
VirtualProtectEx(handle, addr, newBuf.length, oldProtect);
|
|
26
|
-
const entry = {
|
|
27
|
-
id: randomUUID(),
|
|
28
|
-
pid,
|
|
29
|
-
address: `0x${addr.toString(16).toUpperCase()}`,
|
|
30
|
-
oldValue: Array.from(oldBuf),
|
|
31
|
-
newValue: Array.from(newBuf),
|
|
32
|
-
timestamp: Date.now(),
|
|
33
|
-
undone: false
|
|
34
|
-
};
|
|
35
|
-
this.writeHistory.push(entry);
|
|
36
|
-
this.undoneStack = [];
|
|
37
|
-
if (this.writeHistory.length > WRITE_HISTORY_MAX) this.writeHistory = this.writeHistory.slice(-WRITE_HISTORY_MAX);
|
|
38
|
-
return entry;
|
|
39
|
-
} finally {
|
|
40
|
-
CloseHandle(handle);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
/** Undo last write */
|
|
44
|
-
async undo() {
|
|
45
|
-
for (let i = this.writeHistory.length - 1; i >= 0; i--) {
|
|
46
|
-
const entry = this.writeHistory[i];
|
|
47
|
-
if (!entry.undone) {
|
|
48
|
-
const addr = BigInt(entry.address);
|
|
49
|
-
const oldBuf = Buffer.from(entry.oldValue);
|
|
50
|
-
const handle = openProcessForMemory(entry.pid, true);
|
|
51
|
-
try {
|
|
52
|
-
const { oldProtect } = VirtualProtectEx(handle, addr, oldBuf.length, PAGE.READWRITE);
|
|
53
|
-
WriteProcessMemory(handle, addr, oldBuf);
|
|
54
|
-
VirtualProtectEx(handle, addr, oldBuf.length, oldProtect);
|
|
55
|
-
} finally {
|
|
56
|
-
CloseHandle(handle);
|
|
57
|
-
}
|
|
58
|
-
entry.undone = true;
|
|
59
|
-
this.undoneStack.push(entry);
|
|
60
|
-
return entry;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
/** Redo last undone write */
|
|
66
|
-
async redo() {
|
|
67
|
-
const entry = this.undoneStack.pop();
|
|
68
|
-
if (!entry) return null;
|
|
69
|
-
const addr = BigInt(entry.address);
|
|
70
|
-
const newBuf = Buffer.from(entry.newValue);
|
|
71
|
-
const handle = openProcessForMemory(entry.pid, true);
|
|
72
|
-
try {
|
|
73
|
-
const { oldProtect } = VirtualProtectEx(handle, addr, newBuf.length, PAGE.READWRITE);
|
|
74
|
-
WriteProcessMemory(handle, addr, newBuf);
|
|
75
|
-
VirtualProtectEx(handle, addr, newBuf.length, oldProtect);
|
|
76
|
-
} finally {
|
|
77
|
-
CloseHandle(handle);
|
|
78
|
-
}
|
|
79
|
-
entry.undone = false;
|
|
80
|
-
return entry;
|
|
81
|
-
}
|
|
82
|
-
/** Freeze: continuously write value at interval */
|
|
83
|
-
async freeze(pid, address, value, valueType, intervalMs) {
|
|
84
|
-
const addr = BigInt(address.startsWith("0x") ? address : `0x${address}`);
|
|
85
|
-
const { patternBytes } = parsePattern(value, valueType);
|
|
86
|
-
const valueBuf = Buffer.from(patternBytes);
|
|
87
|
-
const interval = intervalMs ?? FREEZE_DEFAULT_INTERVAL_MS;
|
|
88
|
-
const entry = {
|
|
89
|
-
id: randomUUID(),
|
|
90
|
-
pid,
|
|
91
|
-
address: `0x${addr.toString(16).toUpperCase()}`,
|
|
92
|
-
value: Array.from(valueBuf),
|
|
93
|
-
valueType,
|
|
94
|
-
intervalMs: interval,
|
|
95
|
-
isActive: true
|
|
96
|
-
};
|
|
97
|
-
entry.timer = setInterval(() => {
|
|
98
|
-
try {
|
|
99
|
-
const handle = openProcessForMemory(pid, true);
|
|
100
|
-
try {
|
|
101
|
-
const { oldProtect } = VirtualProtectEx(handle, addr, valueBuf.length, PAGE.READWRITE);
|
|
102
|
-
WriteProcessMemory(handle, addr, valueBuf);
|
|
103
|
-
VirtualProtectEx(handle, addr, valueBuf.length, oldProtect);
|
|
104
|
-
} finally {
|
|
105
|
-
CloseHandle(handle);
|
|
106
|
-
}
|
|
107
|
-
} catch {
|
|
108
|
-
entry.isActive = false;
|
|
109
|
-
if (entry.timer) clearInterval(entry.timer);
|
|
110
|
-
}
|
|
111
|
-
}, interval);
|
|
112
|
-
this.freezes.set(entry.id, entry);
|
|
113
|
-
return entry;
|
|
114
|
-
}
|
|
115
|
-
/** Unfreeze */
|
|
116
|
-
async unfreeze(freezeId) {
|
|
117
|
-
const entry = this.freezes.get(freezeId);
|
|
118
|
-
if (!entry) return false;
|
|
119
|
-
if (entry.timer) clearInterval(entry.timer);
|
|
120
|
-
entry.isActive = false;
|
|
121
|
-
this.freezes.delete(freezeId);
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
|
-
/** Unfreeze all */
|
|
125
|
-
async unfreezeAll() {
|
|
126
|
-
let count = 0;
|
|
127
|
-
for (const [id] of this.freezes) {
|
|
128
|
-
await this.unfreeze(id);
|
|
129
|
-
count++;
|
|
130
|
-
}
|
|
131
|
-
return count;
|
|
132
|
-
}
|
|
133
|
-
/** List all active freezes */
|
|
134
|
-
listFreezes() {
|
|
135
|
-
return Array.from(this.freezes.values()).map(({ timer: _timer, ...rest }) => rest);
|
|
136
|
-
}
|
|
137
|
-
/** Dump memory region to Buffer */
|
|
138
|
-
async dumpMemory(pid, address, size) {
|
|
139
|
-
const addr = BigInt(address.startsWith("0x") ? address : `0x${address}`);
|
|
140
|
-
const handle = openProcessForMemory(pid, false);
|
|
141
|
-
try {
|
|
142
|
-
return ReadProcessMemory(handle, addr, size);
|
|
143
|
-
} finally {
|
|
144
|
-
CloseHandle(handle);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
/** Dump memory region as hex string */
|
|
148
|
-
async dumpMemoryHex(pid, address, size) {
|
|
149
|
-
const buf = await this.dumpMemory(pid, address, size);
|
|
150
|
-
const lines = [];
|
|
151
|
-
const addr = BigInt(address.startsWith("0x") ? address : `0x${address}`);
|
|
152
|
-
for (let i = 0; i < buf.length; i += 16) {
|
|
153
|
-
const lineAddr = addr + BigInt(i);
|
|
154
|
-
const hex = Array.from(buf.subarray(i, Math.min(i + 16, buf.length))).map((b) => b.toString(16).padStart(2, "0")).join(" ");
|
|
155
|
-
const ascii = Array.from(buf.subarray(i, Math.min(i + 16, buf.length))).map((b) => b >= 32 && b <= 126 ? String.fromCharCode(b) : ".").join("");
|
|
156
|
-
lines.push(`${lineAddr.toString(16).padStart(12, "0")} ${hex.padEnd(47)} |${ascii}|`);
|
|
157
|
-
}
|
|
158
|
-
return lines.join("\n");
|
|
159
|
-
}
|
|
160
|
-
/** Get write history */
|
|
161
|
-
getWriteHistory() {
|
|
162
|
-
return [...this.writeHistory];
|
|
163
|
-
}
|
|
164
|
-
};
|
|
165
|
-
const memoryController = new MemoryController();
|
|
166
|
-
//#endregion
|
|
167
|
-
export { MemoryController, memoryController };
|
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
import { Sn as SCAN_SESSION_TTL_MS, xn as SCAN_SESSION_MAX_COUNT } from "./constants-CDZLOoVv.mjs";
|
|
2
|
-
import { n as parseAddress, t as formatAddress } from "./formatAddress-nnMvEohD.mjs";
|
|
3
|
-
import { randomUUID } from "node:crypto";
|
|
4
|
-
//#region src/native/ScanComparators.ts
|
|
5
|
-
const FLOAT_EPSILON = 1e-6;
|
|
6
|
-
const DOUBLE_EPSILON = 1e-12;
|
|
7
|
-
/**
|
|
8
|
-
* Return the byte width for a given scan value type.
|
|
9
|
-
*/
|
|
10
|
-
function getValueSize(type) {
|
|
11
|
-
switch (type) {
|
|
12
|
-
case "byte":
|
|
13
|
-
case "int8": return 1;
|
|
14
|
-
case "int16":
|
|
15
|
-
case "uint16": return 2;
|
|
16
|
-
case "int32":
|
|
17
|
-
case "uint32":
|
|
18
|
-
case "float": return 4;
|
|
19
|
-
case "int64":
|
|
20
|
-
case "uint64":
|
|
21
|
-
case "double":
|
|
22
|
-
case "pointer": return 8;
|
|
23
|
-
case "hex":
|
|
24
|
-
case "string": return 0;
|
|
25
|
-
default: return 4;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Return the natural alignment for a given value type.
|
|
30
|
-
*/
|
|
31
|
-
function getDefaultAlignment(type) {
|
|
32
|
-
switch (type) {
|
|
33
|
-
case "byte":
|
|
34
|
-
case "int8": return 1;
|
|
35
|
-
case "int16":
|
|
36
|
-
case "uint16": return 2;
|
|
37
|
-
case "int32":
|
|
38
|
-
case "uint32":
|
|
39
|
-
case "float": return 4;
|
|
40
|
-
case "int64":
|
|
41
|
-
case "uint64":
|
|
42
|
-
case "double":
|
|
43
|
-
case "pointer": return 8;
|
|
44
|
-
default: return 1;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
function makeReader(type) {
|
|
48
|
-
switch (type) {
|
|
49
|
-
case "byte": return (buf) => buf.readUInt8(0);
|
|
50
|
-
case "int8": return (buf) => buf.readInt8(0);
|
|
51
|
-
case "int16": return (buf) => buf.readInt16LE(0);
|
|
52
|
-
case "uint16": return (buf) => buf.readUInt16LE(0);
|
|
53
|
-
case "int32": return (buf) => buf.readInt32LE(0);
|
|
54
|
-
case "uint32": return (buf) => buf.readUInt32LE(0);
|
|
55
|
-
case "int64": return (buf) => buf.readBigInt64LE(0);
|
|
56
|
-
case "uint64":
|
|
57
|
-
case "pointer": return (buf) => buf.readBigUInt64LE(0);
|
|
58
|
-
case "float": return (buf) => buf.readFloatLE(0);
|
|
59
|
-
case "double": return (buf) => buf.readDoubleLE(0);
|
|
60
|
-
default: return (buf) => buf.readInt32LE(0);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
function makeApproxEqual(type) {
|
|
64
|
-
if (type === "float") return (a, b) => Math.abs(Number(a) - Number(b)) < FLOAT_EPSILON;
|
|
65
|
-
if (type === "double") return (a, b) => Math.abs(Number(a) - Number(b)) < DOUBLE_EPSILON;
|
|
66
|
-
if (type === "int64" || type === "uint64" || type === "pointer") return (a, b) => a === b;
|
|
67
|
-
return (a, b) => Number(a) === Number(b);
|
|
68
|
-
}
|
|
69
|
-
function makeComparator(mode, type) {
|
|
70
|
-
const read = makeReader(type);
|
|
71
|
-
const approxEq = makeApproxEqual(type);
|
|
72
|
-
const compare = type === "int64" || type === "uint64" || type === "pointer" ? (a, b) => {
|
|
73
|
-
const ba = BigInt(a);
|
|
74
|
-
const bb = BigInt(b);
|
|
75
|
-
return ba < bb ? -1 : ba > bb ? 1 : 0;
|
|
76
|
-
} : (a, b) => Number(a) - Number(b);
|
|
77
|
-
switch (mode) {
|
|
78
|
-
case "exact": return (cur, _prev, tgt, _tgt2) => {
|
|
79
|
-
if (!tgt) return false;
|
|
80
|
-
return approxEq(read(cur), read(tgt));
|
|
81
|
-
};
|
|
82
|
-
case "unknown_initial": return () => true;
|
|
83
|
-
case "changed": return (cur, prev, _tgt, _tgt2) => {
|
|
84
|
-
if (!prev) return false;
|
|
85
|
-
return !approxEq(read(cur), read(prev));
|
|
86
|
-
};
|
|
87
|
-
case "unchanged": return (cur, prev, _tgt, _tgt2) => {
|
|
88
|
-
if (!prev) return true;
|
|
89
|
-
return approxEq(read(cur), read(prev));
|
|
90
|
-
};
|
|
91
|
-
case "increased": return (cur, prev, _tgt, _tgt2) => {
|
|
92
|
-
if (!prev) return false;
|
|
93
|
-
return compare(read(cur), read(prev)) > 0;
|
|
94
|
-
};
|
|
95
|
-
case "decreased": return (cur, prev, _tgt, _tgt2) => {
|
|
96
|
-
if (!prev) return false;
|
|
97
|
-
return compare(read(cur), read(prev)) < 0;
|
|
98
|
-
};
|
|
99
|
-
case "greater_than": return (cur, _prev, tgt, _tgt2) => {
|
|
100
|
-
if (!tgt) return false;
|
|
101
|
-
return compare(read(cur), read(tgt)) > 0;
|
|
102
|
-
};
|
|
103
|
-
case "less_than": return (cur, _prev, tgt, _tgt2) => {
|
|
104
|
-
if (!tgt) return false;
|
|
105
|
-
return compare(read(cur), read(tgt)) < 0;
|
|
106
|
-
};
|
|
107
|
-
case "between": return (cur, _prev, tgt, tgt2) => {
|
|
108
|
-
if (!tgt || !tgt2) return false;
|
|
109
|
-
return compare(read(cur), read(tgt)) >= 0 && compare(read(cur), read(tgt2)) <= 0;
|
|
110
|
-
};
|
|
111
|
-
case "not_equal": return (cur, _prev, tgt, _tgt2) => {
|
|
112
|
-
if (!tgt) return false;
|
|
113
|
-
return !approxEq(read(cur), read(tgt));
|
|
114
|
-
};
|
|
115
|
-
default: return () => false;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
const comparatorCache = /* @__PURE__ */ new Map();
|
|
119
|
-
function getComparator(mode, valueType) {
|
|
120
|
-
const key = `${mode}:${valueType}`;
|
|
121
|
-
let comp = comparatorCache.get(key);
|
|
122
|
-
if (!comp) {
|
|
123
|
-
comp = makeComparator(mode, valueType);
|
|
124
|
-
comparatorCache.set(key, comp);
|
|
125
|
-
}
|
|
126
|
-
return comp;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Compare scan values according to the specified mode.
|
|
130
|
-
*
|
|
131
|
-
* Dispatches to a monomorphic specialist comparator that is cached per
|
|
132
|
-
* (mode, valueType) pair. This avoids per-call switch dispatch on valueType
|
|
133
|
-
* in the hot scan loop, allowing V8 TurboFan to inline and optimize the
|
|
134
|
-
* typed read + compare path.
|
|
135
|
-
*/
|
|
136
|
-
function compareScanValues(current, previous, target, target2, mode, valueType) {
|
|
137
|
-
return getComparator(mode, valueType)(current, previous, target, target2);
|
|
138
|
-
}
|
|
139
|
-
//#endregion
|
|
140
|
-
//#region src/native/MemoryScanSession.ts
|
|
141
|
-
/**
|
|
142
|
-
* Scan Session Manager — manages in-memory scan sessions for iterative scanning.
|
|
143
|
-
*
|
|
144
|
-
* Sessions persist scan results across multiple scan iterations, allowing
|
|
145
|
-
* the CE-style workflow: first scan → next scan → narrow down → find target.
|
|
146
|
-
*
|
|
147
|
-
* @module MemoryScanSession
|
|
148
|
-
*/
|
|
149
|
-
var MemoryScanSessionManager = class {
|
|
150
|
-
sessions = /* @__PURE__ */ new Map();
|
|
151
|
-
maxSessions;
|
|
152
|
-
sessionTtlMs;
|
|
153
|
-
constructor(maxSessions = SCAN_SESSION_MAX_COUNT, sessionTtlMs = SCAN_SESSION_TTL_MS) {
|
|
154
|
-
this.maxSessions = maxSessions;
|
|
155
|
-
this.sessionTtlMs = sessionTtlMs;
|
|
156
|
-
}
|
|
157
|
-
/** Create a new scan session for a given PID and value type. */
|
|
158
|
-
createSession(pid, options) {
|
|
159
|
-
this.cleanup();
|
|
160
|
-
if (this.sessions.size >= this.maxSessions) {
|
|
161
|
-
let oldestId = null;
|
|
162
|
-
let oldestTime = Infinity;
|
|
163
|
-
for (const [id, session] of this.sessions) if (session.createdAt < oldestTime) {
|
|
164
|
-
oldestTime = session.createdAt;
|
|
165
|
-
oldestId = id;
|
|
166
|
-
}
|
|
167
|
-
if (oldestId) this.sessions.delete(oldestId);
|
|
168
|
-
}
|
|
169
|
-
const id = randomUUID();
|
|
170
|
-
const alignment = options.alignment ?? getDefaultAlignment(options.valueType);
|
|
171
|
-
const now = Date.now();
|
|
172
|
-
const session = {
|
|
173
|
-
id,
|
|
174
|
-
pid,
|
|
175
|
-
valueType: options.valueType,
|
|
176
|
-
alignment,
|
|
177
|
-
createdAt: now,
|
|
178
|
-
lastScanAt: now,
|
|
179
|
-
scanCount: 0,
|
|
180
|
-
addresses: [],
|
|
181
|
-
previousValues: /* @__PURE__ */ new Map()
|
|
182
|
-
};
|
|
183
|
-
this.sessions.set(id, session);
|
|
184
|
-
return id;
|
|
185
|
-
}
|
|
186
|
-
/** Get session by ID. Throws if not found or expired. */
|
|
187
|
-
getSession(sessionId) {
|
|
188
|
-
const session = this.sessions.get(sessionId);
|
|
189
|
-
if (!session) throw new Error(`Scan session not found: ${sessionId}`);
|
|
190
|
-
if (Date.now() - session.lastScanAt > this.sessionTtlMs) {
|
|
191
|
-
this.sessions.delete(sessionId);
|
|
192
|
-
throw new Error(`Scan session expired: ${sessionId}`);
|
|
193
|
-
}
|
|
194
|
-
return session;
|
|
195
|
-
}
|
|
196
|
-
/** Update session with new scan results (bigint addresses). */
|
|
197
|
-
updateSession(sessionId, addresses, values) {
|
|
198
|
-
const session = this.getSession(sessionId);
|
|
199
|
-
session.addresses = addresses;
|
|
200
|
-
session.previousValues = values;
|
|
201
|
-
session.lastScanAt = Date.now();
|
|
202
|
-
session.scanCount++;
|
|
203
|
-
}
|
|
204
|
-
/** List all active sessions. */
|
|
205
|
-
listSessions() {
|
|
206
|
-
this.cleanup();
|
|
207
|
-
const result = [];
|
|
208
|
-
const now = Date.now();
|
|
209
|
-
for (const session of this.sessions.values()) {
|
|
210
|
-
const ageMs = now - session.createdAt;
|
|
211
|
-
const ageMin = Math.floor(ageMs / 6e4);
|
|
212
|
-
const ageSec = Math.floor(ageMs % 6e4 / 1e3);
|
|
213
|
-
result.push({
|
|
214
|
-
id: session.id,
|
|
215
|
-
pid: session.pid,
|
|
216
|
-
valueType: session.valueType,
|
|
217
|
-
addressCount: session.addresses.length,
|
|
218
|
-
scanCount: session.scanCount,
|
|
219
|
-
age: ageMin > 0 ? `${ageMin}m${ageSec}s` : `${ageSec}s`
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
return result;
|
|
223
|
-
}
|
|
224
|
-
/** Delete a session. */
|
|
225
|
-
deleteSession(sessionId) {
|
|
226
|
-
return this.sessions.delete(sessionId);
|
|
227
|
-
}
|
|
228
|
-
/** Clean up expired sessions. Returns count of cleaned sessions. */
|
|
229
|
-
cleanup() {
|
|
230
|
-
const now = Date.now();
|
|
231
|
-
let count = 0;
|
|
232
|
-
for (const [id, session] of this.sessions) if (now - session.lastScanAt > this.sessionTtlMs) {
|
|
233
|
-
this.sessions.delete(id);
|
|
234
|
-
count++;
|
|
235
|
-
}
|
|
236
|
-
return count;
|
|
237
|
-
}
|
|
238
|
-
/** Export session data for persistence (JSON serialization). */
|
|
239
|
-
exportSession(sessionId) {
|
|
240
|
-
const session = this.getSession(sessionId);
|
|
241
|
-
const serializable = {
|
|
242
|
-
...session,
|
|
243
|
-
addresses: session.addresses.map((addr) => formatAddress(addr)),
|
|
244
|
-
previousValues: Array.from(session.previousValues.entries()).map(([addr, buf]) => [formatAddress(addr), buf.toString("hex")])
|
|
245
|
-
};
|
|
246
|
-
return JSON.stringify(serializable);
|
|
247
|
-
}
|
|
248
|
-
/** Import session from exported JSON data. Returns new session id. */
|
|
249
|
-
importSession(data) {
|
|
250
|
-
const parsed = JSON.parse(data);
|
|
251
|
-
const id = randomUUID();
|
|
252
|
-
const now = Date.now();
|
|
253
|
-
const previousValues = /* @__PURE__ */ new Map();
|
|
254
|
-
if (Array.isArray(parsed.previousValues)) {
|
|
255
|
-
for (const [addr, hex] of parsed.previousValues) if (typeof addr === "string" && typeof hex === "string") previousValues.set(parseAddress(addr), Buffer.from(hex, "hex"));
|
|
256
|
-
}
|
|
257
|
-
const addresses = [];
|
|
258
|
-
if (Array.isArray(parsed.addresses)) {
|
|
259
|
-
for (const addr of parsed.addresses) if (typeof addr === "string") addresses.push(parseAddress(addr));
|
|
260
|
-
}
|
|
261
|
-
const session = {
|
|
262
|
-
id,
|
|
263
|
-
pid: parsed.pid,
|
|
264
|
-
valueType: parsed.valueType,
|
|
265
|
-
alignment: parsed.alignment ?? 4,
|
|
266
|
-
createdAt: now,
|
|
267
|
-
lastScanAt: now,
|
|
268
|
-
scanCount: parsed.scanCount ?? 0,
|
|
269
|
-
addresses,
|
|
270
|
-
previousValues
|
|
271
|
-
};
|
|
272
|
-
this.sessions.set(id, session);
|
|
273
|
-
return id;
|
|
274
|
-
}
|
|
275
|
-
};
|
|
276
|
-
const scanSessionManager = new MemoryScanSessionManager();
|
|
277
|
-
//#endregion
|
|
278
|
-
export { MemoryScanSessionManager, getDefaultAlignment as n, getValueSize as r, scanSessionManager, compareScanValues as t };
|