@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,136 +0,0 @@
|
|
|
1
|
-
//#region src/server/domains/cross-domain/handlers/evidence-graph-bridge.impl.ts
|
|
2
|
-
var CrossDomainEvidenceBridge = class {
|
|
3
|
-
graph;
|
|
4
|
-
constructor(graph) {
|
|
5
|
-
this.graph = graph;
|
|
6
|
-
}
|
|
7
|
-
getGraph() {
|
|
8
|
-
return this.graph;
|
|
9
|
-
}
|
|
10
|
-
addNode(type, label, metadata) {
|
|
11
|
-
return this.graph.addNode(type, label, metadata);
|
|
12
|
-
}
|
|
13
|
-
addV8Object(input, scriptNodeId) {
|
|
14
|
-
const node = this.graph.addNode("v8-heap-object", input.name, {
|
|
15
|
-
domain: "v8-inspector",
|
|
16
|
-
address: input.address,
|
|
17
|
-
name: input.name
|
|
18
|
-
});
|
|
19
|
-
if (scriptNodeId) this.graph.addEdge(scriptNodeId, node.id, "heap-allocates", {
|
|
20
|
-
domain: "cross-domain",
|
|
21
|
-
relation: "script-allocates-heap-object"
|
|
22
|
-
});
|
|
23
|
-
return node;
|
|
24
|
-
}
|
|
25
|
-
addNetworkRequest(input, initiatorHeapNodeId) {
|
|
26
|
-
const label = input.method ? `${input.method} ${input.url}` : input.url;
|
|
27
|
-
const node = this.graph.addNode("network-request", label, {
|
|
28
|
-
domain: "network",
|
|
29
|
-
requestId: input.requestId,
|
|
30
|
-
url: input.url,
|
|
31
|
-
method: input.method ?? "GET"
|
|
32
|
-
});
|
|
33
|
-
let initiatorNode;
|
|
34
|
-
if (initiatorHeapNodeId) {
|
|
35
|
-
initiatorNode = this.graph.getNode(initiatorHeapNodeId);
|
|
36
|
-
this.graph.addEdge(initiatorHeapNodeId, node.id, "network-initiated-by", {
|
|
37
|
-
domain: "cross-domain",
|
|
38
|
-
relation: "heap-initiates-network"
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
return {
|
|
42
|
-
node,
|
|
43
|
-
initiatorNode
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
addCanvasNode(input, creatorHeapNodeId) {
|
|
47
|
-
const node = this.graph.addNode("canvas-scene-node", input.label, {
|
|
48
|
-
domain: "canvas",
|
|
49
|
-
nodeId: input.nodeId,
|
|
50
|
-
label: input.label
|
|
51
|
-
});
|
|
52
|
-
if (creatorHeapNodeId) this.graph.addEdge(creatorHeapNodeId, node.id, "canvas-rendered-by", {
|
|
53
|
-
domain: "cross-domain",
|
|
54
|
-
relation: "heap-creates-canvas-node"
|
|
55
|
-
});
|
|
56
|
-
return node;
|
|
57
|
-
}
|
|
58
|
-
addSyscallEvent(input, jsFunctionNodeId) {
|
|
59
|
-
const node = this.graph.addNode("syscall-event", input.syscallName, {
|
|
60
|
-
domain: "syscall-hook",
|
|
61
|
-
pid: input.pid,
|
|
62
|
-
tid: input.tid,
|
|
63
|
-
syscallName: input.syscallName,
|
|
64
|
-
timestamp: input.timestamp
|
|
65
|
-
});
|
|
66
|
-
if (jsFunctionNodeId) this.graph.addEdge(jsFunctionNodeId, node.id, "syscall-emitted-by", {
|
|
67
|
-
domain: "cross-domain",
|
|
68
|
-
relation: "js-triggers-syscall"
|
|
69
|
-
});
|
|
70
|
-
return node;
|
|
71
|
-
}
|
|
72
|
-
addMojoMessage(input, cdpEventNodeId) {
|
|
73
|
-
const node = this.graph.addNode("mojo-message", `${input.interface}:${input.method}`, {
|
|
74
|
-
domain: "mojo-ipc",
|
|
75
|
-
interface: input.interface,
|
|
76
|
-
method: input.method,
|
|
77
|
-
timestamp: input.timestamp
|
|
78
|
-
});
|
|
79
|
-
if (cdpEventNodeId) this.graph.addEdge(cdpEventNodeId, node.id, "mojo-routed-to", {
|
|
80
|
-
domain: "cross-domain",
|
|
81
|
-
relation: "cdp-routes-to-mojo"
|
|
82
|
-
});
|
|
83
|
-
return node;
|
|
84
|
-
}
|
|
85
|
-
addBinarySymbol(input, jsFunctionNodeId) {
|
|
86
|
-
const node = this.graph.addNode("binary-symbol", input.symbolName, {
|
|
87
|
-
domain: "binary-instrument",
|
|
88
|
-
moduleName: input.moduleName,
|
|
89
|
-
symbolName: input.symbolName,
|
|
90
|
-
address: input.address
|
|
91
|
-
});
|
|
92
|
-
if (jsFunctionNodeId) this.graph.addEdge(jsFunctionNodeId, node.id, "binary-exports", {
|
|
93
|
-
domain: "cross-domain",
|
|
94
|
-
relation: "js-references-native-symbol"
|
|
95
|
-
});
|
|
96
|
-
return node;
|
|
97
|
-
}
|
|
98
|
-
queryByHeapAddress(addr) {
|
|
99
|
-
const snapshot = this.graph.exportJson();
|
|
100
|
-
const matchingIds = [];
|
|
101
|
-
for (const node of snapshot.nodes) {
|
|
102
|
-
const address = node.metadata["address"];
|
|
103
|
-
if (typeof address === "string" && address.includes(addr)) matchingIds.push(node.id);
|
|
104
|
-
}
|
|
105
|
-
return this.collectConnectedNodes(matchingIds);
|
|
106
|
-
}
|
|
107
|
-
queryByNetworkUrl(url) {
|
|
108
|
-
return this.graph.queryByUrl(url);
|
|
109
|
-
}
|
|
110
|
-
exportGraph() {
|
|
111
|
-
return this.graph.exportJson();
|
|
112
|
-
}
|
|
113
|
-
getStats() {
|
|
114
|
-
const snapshot = this.graph.exportJson();
|
|
115
|
-
const nodesByType = {};
|
|
116
|
-
for (const node of snapshot.nodes) {
|
|
117
|
-
const currentCount = nodesByType[node.type] ?? 0;
|
|
118
|
-
nodesByType[node.type] = currentCount + 1;
|
|
119
|
-
}
|
|
120
|
-
return {
|
|
121
|
-
nodeCount: snapshot.nodes.length,
|
|
122
|
-
edgeCount: snapshot.edges.length,
|
|
123
|
-
nodesByType
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
collectConnectedNodes(nodeIds) {
|
|
127
|
-
const collected = /* @__PURE__ */ new Map();
|
|
128
|
-
for (const nodeId of nodeIds) {
|
|
129
|
-
for (const node of this.graph.getEvidenceChain(nodeId, "forward")) collected.set(node.id, node);
|
|
130
|
-
for (const node of this.graph.getEvidenceChain(nodeId, "backward")) collected.set(node.id, node);
|
|
131
|
-
}
|
|
132
|
-
return [...collected.values()];
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
//#endregion
|
|
136
|
-
export { CrossDomainEvidenceBridge };
|
|
@@ -1,575 +0,0 @@
|
|
|
1
|
-
import { t as __exportAll } from "./chunk-CjcI7cDX.mjs";
|
|
2
|
-
import { _ as WriteProcessMemory, b as openProcessForMemory, d as ReadProcessMemory, f as VirtualAllocEx, h as VirtualQueryEx, i as GetModuleBaseName, l as MEM, m as VirtualProtectEx, n as EnumProcessModules, p as VirtualFreeEx, s as GetModuleInformation, t as CloseHandle, u as PAGE, v as isKoffiAvailable, y as isWindows } from "./Win32API-C2kjj0ze.mjs";
|
|
3
|
-
import { _ as machVmReadOverwrite, a as VM_PROT, b as taskForPid, c as dyldImageCount, d as kernReturnName, f as machPortDeallocate, g as machVmProtect, h as machVmDeallocate, i as VM_FLAGS, l as isDarwin, m as machVmAllocate, n as KERN, o as dyldGetImageHeader, p as machTaskSelf, r as SM, s as dyldGetImageName, u as isKoffiAvailableOnDarwin, v as machVmRegion, y as machVmWrite } from "./DarwinAPI-ETyy0xyo.mjs";
|
|
4
|
-
import fs from "node:fs";
|
|
5
|
-
//#region src/native/platform/win32/Win32MemoryProvider.ts
|
|
6
|
-
const handleMap$1 = /* @__PURE__ */ new WeakMap();
|
|
7
|
-
function getWin32Handle(handle) {
|
|
8
|
-
const h = handleMap$1.get(handle);
|
|
9
|
-
if (h === void 0) throw new Error("Invalid ProcessHandle — not a Win32 handle");
|
|
10
|
-
return h;
|
|
11
|
-
}
|
|
12
|
-
function win32ProtToMemoryProtection(prot) {
|
|
13
|
-
let flags = 0;
|
|
14
|
-
if (prot & PAGE.READONLY) flags |= 1;
|
|
15
|
-
if (prot & PAGE.READWRITE) flags |= 3;
|
|
16
|
-
if (prot & PAGE.WRITECOPY) flags |= 17;
|
|
17
|
-
if (prot & PAGE.EXECUTE) flags |= 4;
|
|
18
|
-
if (prot & PAGE.EXECUTE_READ) flags |= 5;
|
|
19
|
-
if (prot & PAGE.EXECUTE_READWRITE) flags |= 7;
|
|
20
|
-
if (prot & PAGE.EXECUTE_WRITECOPY) flags |= 21;
|
|
21
|
-
if (prot & PAGE.GUARD) flags |= 8;
|
|
22
|
-
return flags;
|
|
23
|
-
}
|
|
24
|
-
function memoryProtectionToWin32Prot(prot) {
|
|
25
|
-
const hasRead = (prot & 1) !== 0;
|
|
26
|
-
const hasWrite = (prot & 2) !== 0;
|
|
27
|
-
const hasExec = (prot & 4) !== 0;
|
|
28
|
-
let page = PAGE.NOACCESS;
|
|
29
|
-
if (hasRead && hasWrite && hasExec) page = PAGE.EXECUTE_READWRITE;
|
|
30
|
-
else if (hasRead && hasExec) page = PAGE.EXECUTE_READ;
|
|
31
|
-
else if (hasRead && hasWrite) page = PAGE.READWRITE;
|
|
32
|
-
else if (hasExec) page = PAGE.EXECUTE;
|
|
33
|
-
else if (hasRead) page = PAGE.READONLY;
|
|
34
|
-
if ((prot & 8) !== 0) page |= PAGE.GUARD;
|
|
35
|
-
return page;
|
|
36
|
-
}
|
|
37
|
-
function win32StateToState(state) {
|
|
38
|
-
if (state === MEM.COMMIT) return "committed";
|
|
39
|
-
if (state === MEM.RESERVE) return "reserved";
|
|
40
|
-
return "free";
|
|
41
|
-
}
|
|
42
|
-
function win32TypeToType(type) {
|
|
43
|
-
if (type === 16777216) return "image";
|
|
44
|
-
if (type === 262144) return "mapped";
|
|
45
|
-
if (type === 131072) return "private";
|
|
46
|
-
return "unknown";
|
|
47
|
-
}
|
|
48
|
-
var Win32MemoryProvider = class {
|
|
49
|
-
platform = "win32";
|
|
50
|
-
async checkAvailability() {
|
|
51
|
-
if (!isWindows()) return {
|
|
52
|
-
available: false,
|
|
53
|
-
reason: "Not running on Windows",
|
|
54
|
-
platform: "win32"
|
|
55
|
-
};
|
|
56
|
-
if (!isKoffiAvailable()) return {
|
|
57
|
-
available: false,
|
|
58
|
-
reason: "koffi FFI library not available",
|
|
59
|
-
platform: "win32"
|
|
60
|
-
};
|
|
61
|
-
return {
|
|
62
|
-
available: true,
|
|
63
|
-
platform: "win32"
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
openProcess(pid, writeAccess) {
|
|
67
|
-
const nativeHandle = openProcessForMemory(pid, writeAccess);
|
|
68
|
-
const handle = {
|
|
69
|
-
pid,
|
|
70
|
-
writeAccess
|
|
71
|
-
};
|
|
72
|
-
handleMap$1.set(handle, nativeHandle);
|
|
73
|
-
return handle;
|
|
74
|
-
}
|
|
75
|
-
closeProcess(handle) {
|
|
76
|
-
CloseHandle(getWin32Handle(handle));
|
|
77
|
-
}
|
|
78
|
-
readMemory(handle, address, size) {
|
|
79
|
-
const buffer = ReadProcessMemory(getWin32Handle(handle), address, size);
|
|
80
|
-
return {
|
|
81
|
-
data: buffer,
|
|
82
|
-
bytesRead: buffer.length
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
writeMemory(handle, address, data) {
|
|
86
|
-
return { bytesWritten: WriteProcessMemory(getWin32Handle(handle), address, data) };
|
|
87
|
-
}
|
|
88
|
-
queryRegion(handle, address) {
|
|
89
|
-
const { success, info } = VirtualQueryEx(getWin32Handle(handle), address);
|
|
90
|
-
if (!success || info.RegionSize === 0n) return null;
|
|
91
|
-
const protection = win32ProtToMemoryProtection(info.Protect);
|
|
92
|
-
return {
|
|
93
|
-
baseAddress: info.BaseAddress,
|
|
94
|
-
size: Number(info.RegionSize),
|
|
95
|
-
protection,
|
|
96
|
-
state: win32StateToState(info.State),
|
|
97
|
-
type: win32TypeToType(info.Type),
|
|
98
|
-
isReadable: (protection & 1) !== 0,
|
|
99
|
-
isWritable: (protection & 2) !== 0,
|
|
100
|
-
isExecutable: (protection & 4) !== 0
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
changeProtection(handle, address, size, newProtection) {
|
|
104
|
-
const { success, oldProtect } = VirtualProtectEx(getWin32Handle(handle), address, size, memoryProtectionToWin32Prot(newProtection));
|
|
105
|
-
if (!success) throw new Error("VirtualProtectEx failed");
|
|
106
|
-
return { oldProtection: win32ProtToMemoryProtection(oldProtect) };
|
|
107
|
-
}
|
|
108
|
-
allocateMemory(handle, size, protection) {
|
|
109
|
-
const h = getWin32Handle(handle);
|
|
110
|
-
const win32Prot = memoryProtectionToWin32Prot(protection);
|
|
111
|
-
const address = VirtualAllocEx(h, 0n, size, MEM.COMMIT | MEM.RESERVE, win32Prot);
|
|
112
|
-
if (!address) throw new Error("VirtualAllocEx failed");
|
|
113
|
-
return { address };
|
|
114
|
-
}
|
|
115
|
-
freeMemory(handle, address, _size) {
|
|
116
|
-
VirtualFreeEx(getWin32Handle(handle), address, 0, MEM.RELEASE);
|
|
117
|
-
}
|
|
118
|
-
enumerateModules(handle) {
|
|
119
|
-
const h = getWin32Handle(handle);
|
|
120
|
-
const { success, modules: handles, count } = EnumProcessModules(h);
|
|
121
|
-
if (!success) throw new Error("EnumProcessModules failed");
|
|
122
|
-
const modules = [];
|
|
123
|
-
for (let i = 0; i < count; i++) {
|
|
124
|
-
const hModule = handles[i];
|
|
125
|
-
if (!hModule) continue;
|
|
126
|
-
const name = GetModuleBaseName(h, hModule);
|
|
127
|
-
const { success: infoSuccess, info } = GetModuleInformation(h, hModule);
|
|
128
|
-
if (infoSuccess && info) modules.push({
|
|
129
|
-
name,
|
|
130
|
-
baseAddress: BigInt(info.lpBaseOfDll),
|
|
131
|
-
size: info.SizeOfImage
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
return modules;
|
|
135
|
-
}
|
|
136
|
-
};
|
|
137
|
-
//#endregion
|
|
138
|
-
//#region src/native/platform/darwin/DarwinMemoryProvider.ts
|
|
139
|
-
const handleMap = /* @__PURE__ */ new WeakMap();
|
|
140
|
-
function getDarwinHandle(handle) {
|
|
141
|
-
const h = handleMap.get(handle);
|
|
142
|
-
if (h === void 0) throw new Error("Invalid ProcessHandle — not a Darwin handle");
|
|
143
|
-
return h;
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Map Mach VM_PROT_* flags → platform-agnostic MemoryProtection
|
|
147
|
-
*/
|
|
148
|
-
function machProtToMemoryProtection(prot) {
|
|
149
|
-
let flags = 0;
|
|
150
|
-
if (prot & VM_PROT.READ) flags |= 1;
|
|
151
|
-
if (prot & VM_PROT.WRITE) flags |= 2;
|
|
152
|
-
if (prot & VM_PROT.EXECUTE) flags |= 4;
|
|
153
|
-
return flags;
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Map platform-agnostic MemoryProtection → Mach VM_PROT_* flags
|
|
157
|
-
*/
|
|
158
|
-
function memoryProtectionToMachProt(prot) {
|
|
159
|
-
let machProt = VM_PROT.NONE;
|
|
160
|
-
if (prot & 1) machProt |= VM_PROT.READ;
|
|
161
|
-
if (prot & 2) machProt |= VM_PROT.WRITE;
|
|
162
|
-
if (prot & 4) machProt |= VM_PROT.EXECUTE;
|
|
163
|
-
return machProt;
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Map Mach share mode → platform-agnostic MemoryRegionType.
|
|
167
|
-
* macOS doesn't distinguish "image" from "mapped" at the vm_region level,
|
|
168
|
-
* so we use share mode as the best approximation.
|
|
169
|
-
*/
|
|
170
|
-
function darwinShareModeToType(shareMode) {
|
|
171
|
-
switch (shareMode) {
|
|
172
|
-
case SM.PRIVATE:
|
|
173
|
-
case SM.PRIVATE_ALIASED:
|
|
174
|
-
case SM.COW: return "private";
|
|
175
|
-
case SM.SHARED:
|
|
176
|
-
case SM.TRUESHARED:
|
|
177
|
-
case SM.SHARED_ALIASED: return "mapped";
|
|
178
|
-
case SM.EMPTY: return "unknown";
|
|
179
|
-
default: return "unknown";
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
var DarwinMemoryProvider = class {
|
|
183
|
-
platform = "darwin";
|
|
184
|
-
async checkAvailability() {
|
|
185
|
-
if (!isDarwin()) return {
|
|
186
|
-
available: false,
|
|
187
|
-
reason: "Not running on macOS",
|
|
188
|
-
platform: "darwin"
|
|
189
|
-
};
|
|
190
|
-
if (!isKoffiAvailableOnDarwin()) return {
|
|
191
|
-
available: false,
|
|
192
|
-
reason: "koffi FFI library cannot load libSystem.B.dylib",
|
|
193
|
-
platform: "darwin"
|
|
194
|
-
};
|
|
195
|
-
try {
|
|
196
|
-
const { kr } = taskForPid(machTaskSelf(), process.pid);
|
|
197
|
-
if (kr !== KERN.SUCCESS) return {
|
|
198
|
-
available: false,
|
|
199
|
-
reason: `task_for_pid failed (${kernReturnName(kr)}). Run with sudo or add debugger entitlement.`,
|
|
200
|
-
platform: "darwin"
|
|
201
|
-
};
|
|
202
|
-
} catch (err) {
|
|
203
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
204
|
-
return {
|
|
205
|
-
available: false,
|
|
206
|
-
reason: /signal|bus error|segfault|abort/i.test(message) ? `Mach API call crashed (${message}). This may be caused by SIP (System Integrity Protection) on ARM64 macOS. Disable SIP or use a code-signed binary with com.apple.security.cs.debugger entitlement.` : `task_for_pid permission check failed: ${message}. Run with sudo or add debugger entitlement.`,
|
|
207
|
-
platform: "darwin"
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
return {
|
|
211
|
-
available: true,
|
|
212
|
-
platform: "darwin"
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
openProcess(pid, _writeAccess) {
|
|
216
|
-
const { kr, task } = taskForPid(machTaskSelf(), pid);
|
|
217
|
-
if (kr !== KERN.SUCCESS) throw new Error(`Failed to open process ${pid}: ${kernReturnName(kr)} (${kr}). ` + (kr === KERN.FAILURE ? "Run with sudo or sign with com.apple.security.cs.debugger entitlement." : kr === KERN.INVALID_ARGUMENT ? "Invalid PID — process may not exist." : "Check macOS permissions."));
|
|
218
|
-
const handle = {
|
|
219
|
-
pid,
|
|
220
|
-
writeAccess: _writeAccess
|
|
221
|
-
};
|
|
222
|
-
handleMap.set(handle, { task });
|
|
223
|
-
return handle;
|
|
224
|
-
}
|
|
225
|
-
closeProcess(handle) {
|
|
226
|
-
const h = getDarwinHandle(handle);
|
|
227
|
-
machPortDeallocate(machTaskSelf(), h.task);
|
|
228
|
-
}
|
|
229
|
-
readMemory(handle, address, size) {
|
|
230
|
-
const { kr, data, outsize } = machVmReadOverwrite(getDarwinHandle(handle).task, address, size);
|
|
231
|
-
if (kr !== KERN.SUCCESS) throw new Error(`mach_vm_read_overwrite failed at 0x${address.toString(16)}: ${kernReturnName(kr)} (${kr})`);
|
|
232
|
-
return {
|
|
233
|
-
data,
|
|
234
|
-
bytesRead: Number(outsize)
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
writeMemory(handle, address, data) {
|
|
238
|
-
const kr = machVmWrite(getDarwinHandle(handle).task, address, data);
|
|
239
|
-
if (kr !== KERN.SUCCESS) throw new Error(`mach_vm_write failed at 0x${address.toString(16)}: ${kernReturnName(kr)} (${kr})`);
|
|
240
|
-
return { bytesWritten: data.length };
|
|
241
|
-
}
|
|
242
|
-
queryRegion(handle, address) {
|
|
243
|
-
const { kr, address: regionBase, size: regionSize, info } = machVmRegion(getDarwinHandle(handle).task, address);
|
|
244
|
-
if (kr !== KERN.SUCCESS) return null;
|
|
245
|
-
const protection = machProtToMemoryProtection(info.protection);
|
|
246
|
-
return {
|
|
247
|
-
baseAddress: regionBase,
|
|
248
|
-
size: Number(regionSize),
|
|
249
|
-
protection,
|
|
250
|
-
state: "committed",
|
|
251
|
-
type: darwinShareModeToType(info.behavior),
|
|
252
|
-
isReadable: (protection & 1) !== 0,
|
|
253
|
-
isWritable: (protection & 2) !== 0,
|
|
254
|
-
isExecutable: (protection & 4) !== 0
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
changeProtection(handle, address, size, newProtection) {
|
|
258
|
-
const h = getDarwinHandle(handle);
|
|
259
|
-
const machProt = memoryProtectionToMachProt(newProtection);
|
|
260
|
-
const { kr: queryKr, info } = machVmRegion(h.task, address);
|
|
261
|
-
const oldProtection = queryKr === KERN.SUCCESS ? machProtToMemoryProtection(info.protection) : 0;
|
|
262
|
-
if ((machProt & VM_PROT.WRITE) !== 0 && (machProt & VM_PROT.EXECUTE) !== 0) {
|
|
263
|
-
const maxKr = machVmProtect(h.task, address, BigInt(size), true, VM_PROT.ALL);
|
|
264
|
-
if (maxKr !== KERN.SUCCESS) throw new Error(`mach_vm_protect (set_maximum) failed at 0x${address.toString(16)}: ${kernReturnName(maxKr)} (${maxKr})`);
|
|
265
|
-
}
|
|
266
|
-
const kr = machVmProtect(h.task, address, BigInt(size), false, machProt);
|
|
267
|
-
if (kr !== KERN.SUCCESS) throw new Error(`mach_vm_protect failed at 0x${address.toString(16)}: ${kernReturnName(kr)} (${kr})`);
|
|
268
|
-
return { oldProtection };
|
|
269
|
-
}
|
|
270
|
-
allocateMemory(handle, size, protection) {
|
|
271
|
-
const h = getDarwinHandle(handle);
|
|
272
|
-
const { kr, address } = machVmAllocate(h.task, BigInt(size), VM_FLAGS.ANYWHERE);
|
|
273
|
-
if (kr !== KERN.SUCCESS) throw new Error(`mach_vm_allocate failed: ${kernReturnName(kr)} (${kr})`);
|
|
274
|
-
const machProt = memoryProtectionToMachProt(protection);
|
|
275
|
-
if (machProt !== (VM_PROT.READ | VM_PROT.WRITE)) {
|
|
276
|
-
const protKr = machVmProtect(h.task, address, BigInt(size), false, machProt);
|
|
277
|
-
if (protKr !== KERN.SUCCESS) {
|
|
278
|
-
machVmDeallocate(h.task, address, BigInt(size));
|
|
279
|
-
throw new Error(`mach_vm_protect after allocate failed: ${kernReturnName(protKr)} (${protKr})`);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
return { address };
|
|
283
|
-
}
|
|
284
|
-
freeMemory(handle, address, size) {
|
|
285
|
-
const kr = machVmDeallocate(getDarwinHandle(handle).task, address, BigInt(size));
|
|
286
|
-
if (kr !== KERN.SUCCESS) throw new Error(`mach_vm_deallocate failed at 0x${address.toString(16)}: ${kernReturnName(kr)} (${kr})`);
|
|
287
|
-
}
|
|
288
|
-
enumerateModules(handle) {
|
|
289
|
-
const h = getDarwinHandle(handle);
|
|
290
|
-
if (handle.pid === process.pid) return this.enumerateModulesSelf();
|
|
291
|
-
return this.enumerateModulesRemote(h.task);
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Enumerate modules for the current process using dyld APIs (fast path).
|
|
295
|
-
*/
|
|
296
|
-
enumerateModulesSelf() {
|
|
297
|
-
const count = dyldImageCount();
|
|
298
|
-
const modules = [];
|
|
299
|
-
for (let i = 0; i < count; i++) {
|
|
300
|
-
const name = dyldGetImageName(i);
|
|
301
|
-
const header = dyldGetImageHeader(i);
|
|
302
|
-
if (!name || header === 0n) continue;
|
|
303
|
-
const basename = name.split("/").pop() ?? name;
|
|
304
|
-
modules.push({
|
|
305
|
-
name: basename,
|
|
306
|
-
baseAddress: header,
|
|
307
|
-
size: 0
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
return modules;
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* Enumerate modules for a remote process by reading dyld_all_image_infos.
|
|
314
|
-
*
|
|
315
|
-
* This reads the target process's dyld info structures from memory.
|
|
316
|
-
* Falls back to an empty list if the info struct cannot be located.
|
|
317
|
-
*/
|
|
318
|
-
enumerateModulesRemote(task) {
|
|
319
|
-
const modules = [];
|
|
320
|
-
let address = 0n;
|
|
321
|
-
for (let i = 0; i < 1e4; i++) {
|
|
322
|
-
const { kr, address: regionBase, size: regionSize, info } = machVmRegion(task, address);
|
|
323
|
-
if (kr !== KERN.SUCCESS) break;
|
|
324
|
-
const isReadable = (info.protection & VM_PROT.READ) !== 0;
|
|
325
|
-
const isExecutable = (info.protection & VM_PROT.EXECUTE) !== 0;
|
|
326
|
-
if (isReadable && isExecutable && regionSize > 0n) try {
|
|
327
|
-
const { kr: readKr, data } = machVmReadOverwrite(task, regionBase, 4);
|
|
328
|
-
if (readKr === KERN.SUCCESS && data.length >= 4) {
|
|
329
|
-
const magic = data.readUInt32LE(0);
|
|
330
|
-
if (magic === 4277009103 || magic === 4277009102) modules.push({
|
|
331
|
-
name: `module_0x${regionBase.toString(16)}`,
|
|
332
|
-
baseAddress: regionBase,
|
|
333
|
-
size: Number(regionSize)
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
} catch {}
|
|
337
|
-
address = regionBase + regionSize;
|
|
338
|
-
}
|
|
339
|
-
return modules;
|
|
340
|
-
}
|
|
341
|
-
};
|
|
342
|
-
//#endregion
|
|
343
|
-
//#region src/modules/process/memory/linux/mapsParser.ts
|
|
344
|
-
const PROC_MAPS_LINE_RE = /^([0-9a-f]+)-([0-9a-f]+)\s+([r-][w-][x-][ps])\s+([0-9a-f]+)\s+(\S+)\s+(\d+)\s*(.*)$/i;
|
|
345
|
-
function parseProcMaps(content) {
|
|
346
|
-
const regions = [];
|
|
347
|
-
for (const line of content.split(/\r?\n/)) {
|
|
348
|
-
const match = line.trimEnd().match(PROC_MAPS_LINE_RE);
|
|
349
|
-
if (!match) continue;
|
|
350
|
-
const perms = match[3];
|
|
351
|
-
regions.push({
|
|
352
|
-
start: BigInt(`0x${match[1]}`),
|
|
353
|
-
end: BigInt(`0x${match[2]}`),
|
|
354
|
-
permissions: {
|
|
355
|
-
read: perms[0] === "r",
|
|
356
|
-
write: perms[1] === "w",
|
|
357
|
-
exec: perms[2] === "x",
|
|
358
|
-
private: perms[3] === "p"
|
|
359
|
-
},
|
|
360
|
-
offset: BigInt(`0x${match[4]}`),
|
|
361
|
-
dev: match[5],
|
|
362
|
-
inode: parseInt(match[6], 10),
|
|
363
|
-
pathname: match[7]?.trim() ?? ""
|
|
364
|
-
});
|
|
365
|
-
}
|
|
366
|
-
return regions;
|
|
367
|
-
}
|
|
368
|
-
function formatLinuxProtection(perms) {
|
|
369
|
-
return `${perms.read ? "r" : "-"}${perms.write ? "w" : "-"}${perms.exec ? "x" : "-"}`;
|
|
370
|
-
}
|
|
371
|
-
//#endregion
|
|
372
|
-
//#region src/native/platform/linux/LinuxMemoryProvider.impl.ts
|
|
373
|
-
function isLinuxRuntime() {
|
|
374
|
-
return process.platform === "linux";
|
|
375
|
-
}
|
|
376
|
-
function toProtection(perms) {
|
|
377
|
-
let protection = 0;
|
|
378
|
-
if (perms.includes("r")) protection |= 1;
|
|
379
|
-
if (perms.includes("w")) protection |= 2;
|
|
380
|
-
if (perms.includes("x")) protection |= 4;
|
|
381
|
-
return protection;
|
|
382
|
-
}
|
|
383
|
-
function toRegionInfo(region) {
|
|
384
|
-
const protection = toProtection(region.perms);
|
|
385
|
-
return {
|
|
386
|
-
baseAddress: region.start,
|
|
387
|
-
size: Number(region.end - region.start),
|
|
388
|
-
protection,
|
|
389
|
-
state: "committed",
|
|
390
|
-
type: region.path ? "mapped" : "private",
|
|
391
|
-
isReadable: (protection & 1) !== 0,
|
|
392
|
-
isWritable: (protection & 2) !== 0,
|
|
393
|
-
isExecutable: (protection & 4) !== 0
|
|
394
|
-
};
|
|
395
|
-
}
|
|
396
|
-
function normalizePattern(pattern) {
|
|
397
|
-
if (Buffer.isBuffer(pattern)) return pattern;
|
|
398
|
-
if (pattern.startsWith("0x") && pattern.length % 2 === 0) return Buffer.from(pattern.slice(2), "hex");
|
|
399
|
-
return Buffer.from(pattern, "utf8");
|
|
400
|
-
}
|
|
401
|
-
var LinuxMemoryProviderImpl = class {
|
|
402
|
-
platform = "linux";
|
|
403
|
-
constructor(pid = process.pid) {
|
|
404
|
-
this.pid = pid;
|
|
405
|
-
}
|
|
406
|
-
isAvailable() {
|
|
407
|
-
return isLinuxRuntime();
|
|
408
|
-
}
|
|
409
|
-
async read(address, size) {
|
|
410
|
-
const handle = this.openProcess(this.pid, false);
|
|
411
|
-
return this.readMemory(handle, address, size).data;
|
|
412
|
-
}
|
|
413
|
-
async write(address, data) {
|
|
414
|
-
const handle = this.openProcess(this.pid, true);
|
|
415
|
-
return this.writeMemory(handle, address, data).bytesWritten === data.length;
|
|
416
|
-
}
|
|
417
|
-
async scan(pattern) {
|
|
418
|
-
const patternBuffer = normalizePattern(pattern);
|
|
419
|
-
const handle = this.openProcess(this.pid, false);
|
|
420
|
-
const regions = await this.queryRegions();
|
|
421
|
-
const matches = [];
|
|
422
|
-
for (const region of regions) {
|
|
423
|
-
if (!region.perms.includes("r")) continue;
|
|
424
|
-
const size = Number(region.end - region.start);
|
|
425
|
-
if (size <= 0) continue;
|
|
426
|
-
try {
|
|
427
|
-
const buffer = this.readMemory(handle, region.start, size).data;
|
|
428
|
-
let offset = buffer.indexOf(patternBuffer);
|
|
429
|
-
while (offset >= 0) {
|
|
430
|
-
matches.push(region.start + BigInt(offset));
|
|
431
|
-
offset = buffer.indexOf(patternBuffer, offset + 1);
|
|
432
|
-
}
|
|
433
|
-
} catch {
|
|
434
|
-
continue;
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
return matches;
|
|
438
|
-
}
|
|
439
|
-
async queryRegions() {
|
|
440
|
-
const mapsPath = `/proc/${this.pid}/maps`;
|
|
441
|
-
return parseProcMaps(await fs.promises.readFile(mapsPath, "utf8")).map((region) => ({
|
|
442
|
-
start: region.start,
|
|
443
|
-
end: region.end,
|
|
444
|
-
perms: `${region.permissions.read ? "r" : "-"}${region.permissions.write ? "w" : "-"}${region.permissions.exec ? "x" : "-"}${region.permissions.private ? "p" : "s"}`,
|
|
445
|
-
path: region.pathname || void 0
|
|
446
|
-
}));
|
|
447
|
-
}
|
|
448
|
-
async checkAvailability() {
|
|
449
|
-
if (!this.isAvailable()) return {
|
|
450
|
-
available: false,
|
|
451
|
-
platform: "linux",
|
|
452
|
-
reason: "Not running on Linux"
|
|
453
|
-
};
|
|
454
|
-
return {
|
|
455
|
-
available: true,
|
|
456
|
-
platform: "linux"
|
|
457
|
-
};
|
|
458
|
-
}
|
|
459
|
-
openProcess(pid, writeAccess) {
|
|
460
|
-
return {
|
|
461
|
-
pid,
|
|
462
|
-
writeAccess
|
|
463
|
-
};
|
|
464
|
-
}
|
|
465
|
-
closeProcess(_handle) {}
|
|
466
|
-
readMemory(handle, address, size) {
|
|
467
|
-
const memPath = `/proc/${handle.pid}/mem`;
|
|
468
|
-
const fileDescriptor = fs.openSync(memPath, handle.writeAccess ? "r+" : "r");
|
|
469
|
-
const buffer = Buffer.alloc(size);
|
|
470
|
-
try {
|
|
471
|
-
const bytesRead = fs.readSync(fileDescriptor, buffer, 0, size, Number(address));
|
|
472
|
-
return {
|
|
473
|
-
data: buffer.subarray(0, bytesRead),
|
|
474
|
-
bytesRead
|
|
475
|
-
};
|
|
476
|
-
} finally {
|
|
477
|
-
fs.closeSync(fileDescriptor);
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
writeMemory(handle, address, data) {
|
|
481
|
-
const memPath = `/proc/${handle.pid}/mem`;
|
|
482
|
-
const fileDescriptor = fs.openSync(memPath, "r+");
|
|
483
|
-
try {
|
|
484
|
-
return { bytesWritten: fs.writeSync(fileDescriptor, data, 0, data.length, Number(address)) };
|
|
485
|
-
} finally {
|
|
486
|
-
fs.closeSync(fileDescriptor);
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
queryRegion(handle, address) {
|
|
490
|
-
const mapsPath = `/proc/${handle.pid}/maps`;
|
|
491
|
-
const parsed = parseProcMaps(fs.readFileSync(mapsPath, "utf8"));
|
|
492
|
-
for (const region of parsed) if (address >= region.start && address < region.end) return toRegionInfo({
|
|
493
|
-
start: region.start,
|
|
494
|
-
end: region.end,
|
|
495
|
-
perms: `${region.permissions.read ? "r" : "-"}${region.permissions.write ? "w" : "-"}${region.permissions.exec ? "x" : "-"}${region.permissions.private ? "p" : "s"}`,
|
|
496
|
-
path: region.pathname || void 0
|
|
497
|
-
});
|
|
498
|
-
return null;
|
|
499
|
-
}
|
|
500
|
-
changeProtection(_handle, _address, _size, _newProtection) {
|
|
501
|
-
throw new Error("Linux memory protection changes are not supported by LinuxMemoryProviderImpl");
|
|
502
|
-
}
|
|
503
|
-
allocateMemory(_handle, _size, _protection) {
|
|
504
|
-
throw new Error("Linux remote memory allocation is not supported by LinuxMemoryProviderImpl");
|
|
505
|
-
}
|
|
506
|
-
freeMemory(_handle, _address, _size) {
|
|
507
|
-
throw new Error("Linux remote memory free is not supported by LinuxMemoryProviderImpl");
|
|
508
|
-
}
|
|
509
|
-
enumerateModules(handle) {
|
|
510
|
-
const mapsPath = `/proc/${handle.pid}/maps`;
|
|
511
|
-
const parsed = parseProcMaps(fs.readFileSync(mapsPath, "utf8"));
|
|
512
|
-
const modules = /* @__PURE__ */ new Map();
|
|
513
|
-
for (const region of parsed) {
|
|
514
|
-
if (!region.pathname || region.pathname.startsWith("[")) continue;
|
|
515
|
-
const existing = modules.get(region.pathname);
|
|
516
|
-
if (existing) {
|
|
517
|
-
const newSize = Number(region.end - existing.baseAddress);
|
|
518
|
-
modules.set(region.pathname, {
|
|
519
|
-
...existing,
|
|
520
|
-
size: newSize > existing.size ? newSize : existing.size
|
|
521
|
-
});
|
|
522
|
-
continue;
|
|
523
|
-
}
|
|
524
|
-
modules.set(region.pathname, {
|
|
525
|
-
name: region.pathname.split("/").pop() ?? region.pathname,
|
|
526
|
-
baseAddress: region.start,
|
|
527
|
-
size: Number(region.end - region.start)
|
|
528
|
-
});
|
|
529
|
-
}
|
|
530
|
-
return [...modules.values()];
|
|
531
|
-
}
|
|
532
|
-
};
|
|
533
|
-
var LinuxMemoryProvider = class extends LinuxMemoryProviderImpl {};
|
|
534
|
-
//#endregion
|
|
535
|
-
//#region src/native/platform/factory.ts
|
|
536
|
-
/**
|
|
537
|
-
* Platform factory — auto-selects the correct PlatformMemoryAPI implementation
|
|
538
|
-
* based on the current operating system.
|
|
539
|
-
*
|
|
540
|
-
* Uses createRequire for lazy-loading platform providers in ESM context.
|
|
541
|
-
* This prevents loading Win32 DLLs on macOS and vice versa.
|
|
542
|
-
*
|
|
543
|
-
* Usage:
|
|
544
|
-
* const provider = createPlatformProvider();
|
|
545
|
-
* const handle = provider.openProcess(pid, false);
|
|
546
|
-
*
|
|
547
|
-
* @module platform/factory
|
|
548
|
-
*/
|
|
549
|
-
var factory_exports = /* @__PURE__ */ __exportAll({ createPlatformProvider: () => createPlatformProvider });
|
|
550
|
-
let cachedProvider = null;
|
|
551
|
-
/**
|
|
552
|
-
* Create and cache the platform-appropriate memory provider.
|
|
553
|
-
* Returns Win32MemoryProvider on Windows, DarwinMemoryProvider on macOS,
|
|
554
|
-
* and LinuxMemoryProvider on Linux.
|
|
555
|
-
* Throws on unsupported platforms.
|
|
556
|
-
*/
|
|
557
|
-
function createPlatformProvider() {
|
|
558
|
-
if (cachedProvider) return cachedProvider;
|
|
559
|
-
switch (process.platform) {
|
|
560
|
-
case "win32":
|
|
561
|
-
cachedProvider = new Win32MemoryProvider();
|
|
562
|
-
break;
|
|
563
|
-
case "darwin":
|
|
564
|
-
cachedProvider = new DarwinMemoryProvider();
|
|
565
|
-
break;
|
|
566
|
-
case "linux":
|
|
567
|
-
cachedProvider = new LinuxMemoryProvider();
|
|
568
|
-
break;
|
|
569
|
-
default: throw new Error(`Unsupported platform: ${process.platform}. Memory operations require Windows, macOS, or Linux.`);
|
|
570
|
-
}
|
|
571
|
-
if (!cachedProvider) throw new Error("Failed to create memory provider");
|
|
572
|
-
return cachedProvider;
|
|
573
|
-
}
|
|
574
|
-
//#endregion
|
|
575
|
-
export { parseProcMaps as i, factory_exports as n, formatLinuxProtection as r, createPlatformProvider as t };
|