@jshookmcp/jshook 0.2.9 → 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-CtcdK78Q.mjs → HookGeneratorBuilders.core.generators.storage-Bf1fbrNK.mjs} +66 -174
- 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-CqDTB_uk.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-Bl8zkwz1.mjs → handlers-pVNpaw4A.mjs} +144 -841
- package/dist/handlers.impl-CD2_kOcC.mjs +1 -0
- package/dist/hooks-DDKppogd.mjs +600 -0
- package/dist/index.mjs +12 -5225
- 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 +12 -7
- package/dist/AntiCheatDetector-BNk-EoBt.mjs +0 -244
- package/dist/CacheAdapters-CDe5WPSV.mjs +0 -80
- package/dist/CodeInjector-Cq8q01kp.mjs +0 -150
- package/dist/ConsoleMonitor-CPVQW1Y-.mjs +0 -2201
- package/dist/DarwinAPI-BNPxu0RH.mjs +0 -363
- package/dist/DetailedDataManager-BQQcxh64.mjs +0 -217
- package/dist/EventBus-DgPmwpeu.mjs +0 -141
- package/dist/EvidenceGraphBridge-SFesNera.mjs +0 -153
- package/dist/ExtensionManager-CWYgw0YW.mjs +0 -714
- package/dist/FingerprintManager-gzWtkKuf.mjs +0 -96
- package/dist/HardwareBreakpoint-B9gZCdFP.mjs +0 -239
- package/dist/HeapAnalyzer-BLDH0dCv.mjs +0 -284
- package/dist/InstrumentationSession-CvPC7Jwy.mjs +0 -244
- package/dist/MemoryController-CbVdCIJF.mjs +0 -167
- package/dist/MemoryScanSession-BsDZbLYm.mjs +0 -278
- package/dist/MemoryScanner-Bcpml6II.mjs +0 -425
- package/dist/NativeMemoryManager.impl-dZtA1ZGn.mjs +0 -482
- package/dist/NativeMemoryManager.utils-B-FjA2mJ.mjs +0 -165
- package/dist/PEAnalyzer-D1lzJ_VG.mjs +0 -385
- package/dist/PageController-Bqm2kZ_X.mjs +0 -417
- package/dist/PointerChainEngine-BOhyVsjx.mjs +0 -322
- package/dist/PrerequisiteError-Dl33Svkz.mjs +0 -20
- package/dist/ResponseBuilder-D3iFYx2N.mjs +0 -143
- package/dist/ReverseEvidenceGraph-Dlsk94LC.mjs +0 -269
- package/dist/ScriptManager-aHHq0X7U.mjs +0 -3000
- package/dist/Speedhack-CqdIFlQl.mjs +0 -156
- package/dist/StealthVerifier-Bo4T3bz8.mjs +0 -135
- package/dist/StructureAnalyzer-DhFaPvRO.mjs +0 -426
- package/dist/ToolCatalog-C0JGZoOm.mjs +0 -582
- package/dist/ToolError-jh9whhMd.mjs +0 -15
- package/dist/ToolProbe-oC7aPrkv.mjs +0 -45
- package/dist/ToolRegistry-BjaF4oNz.mjs +0 -131
- package/dist/ToolRouter.policy-BWV67ZK-.mjs +0 -304
- package/dist/TraceRecorder-DgxyVbdQ.mjs +0 -519
- package/dist/VersionDetector-CwVLVdDM.mjs +0 -104
- package/dist/Win32API-CePkipZY.mjs +0 -340
- package/dist/Win32Debug-BvKs-gxc.mjs +0 -274
- package/dist/WorkflowEngine-CuvkZtWu.mjs +0 -598
- package/dist/analysis-CL9uACt9.mjs +0 -463
- package/dist/artifactRetention-CFEprwPw.mjs +0 -591
- package/dist/artifacts-Bk2-_uPq.mjs +0 -59
- package/dist/betterSqlite3-0pqusHHH.mjs +0 -74
- package/dist/binary-instrument-CXfpx6fT.mjs +0 -979
- package/dist/bind-helpers-xFfRF-qm.mjs +0 -22
- package/dist/boringssl-inspector-BH2D3VKc.mjs +0 -180
- package/dist/browser-BpOr5PEx.mjs +0 -4082
- package/dist/chunk-CjcI7cDX.mjs +0 -15
- package/dist/concurrency-Bt0yv1kJ.mjs +0 -41
- package/dist/constants-B0OANIBL.mjs +0 -519
- package/dist/coordination-qUbyF8KU.mjs +0 -259
- package/dist/debugger-gnKxRSN0.mjs +0 -1271
- package/dist/definitions-6M-eejaT.mjs +0 -53
- package/dist/definitions-B18eyf0B.mjs +0 -18
- package/dist/definitions-B3QdlrHv.mjs +0 -34
- package/dist/definitions-B4rAvHNZ.mjs +0 -63
- package/dist/definitions-BB_4jnmy.mjs +0 -37
- package/dist/definitions-BMfYXoNC.mjs +0 -43
- package/dist/definitions-Beid2EB3.mjs +0 -27
- package/dist/definitions-C1UvM5Iy.mjs +0 -126
- package/dist/definitions-CXEI7QC72.mjs +0 -216
- package/dist/definitions-C_4r7Fo-2.mjs +0 -14
- package/dist/definitions-CkFDALoa.mjs +0 -26
- package/dist/definitions-Cke7zEb8.mjs +0 -94
- package/dist/definitions-ClJLzsJQ.mjs +0 -25
- package/dist/definitions-Cq-zroAU.mjs +0 -28
- package/dist/definitions-Cy3Sl6gV.mjs +0 -34
- package/dist/definitions-D3VsGcvz.mjs +0 -47
- package/dist/definitions-DVGfrn7y.mjs +0 -96
- package/dist/definitions-LKpC3-nL.mjs +0 -9
- package/dist/definitions-bAhHQJq9.mjs +0 -359
- package/dist/encoding-Bvz5jLRv.mjs +0 -1065
- package/dist/evidence-graph-bridge-C_fv9PuC.mjs +0 -135
- package/dist/factory-DxlGh9Xf.mjs +0 -575
- package/dist/formatAddress-DVkj9kpI.mjs +0 -17
- package/dist/graphql-DYWzJ29s.mjs +0 -1026
- package/dist/handlers-9sAbfIg-.mjs +0 -2552
- package/dist/handlers-C67ktuRN.mjs +0 -710
- package/dist/handlers-C87g8oCe.mjs +0 -276
- package/dist/handlers-CTsDAO6p.mjs +0 -681
- package/dist/handlers-Cgyg6c0U.mjs +0 -645
- package/dist/handlers-D6j6yka7.mjs +0 -2124
- package/dist/handlers-DdFzXLvF.mjs +0 -446
- package/dist/handlers-DeLOCd5m.mjs +0 -799
- package/dist/handlers-DlCJN4Td.mjs +0 -757
- package/dist/handlers-DxGIq15_2.mjs +0 -917
- package/dist/handlers-U6L4xhuF.mjs +0 -585
- package/dist/handlers-tB9Mp9ZK.mjs +0 -84
- package/dist/handlers-tiy7EIBp.mjs +0 -572
- package/dist/handlers.impl-DS0d9fUw.mjs +0 -761
- package/dist/hooks-CzCWByww.mjs +0 -898
- package/dist/logger-Dh_xb7_2.mjs +0 -93
- package/dist/maintenance-P7ePRXQC.mjs +0 -830
- package/dist/manifest-2ToTpjv8.mjs +0 -106
- package/dist/manifest-3g71z6Bg.mjs +0 -79
- package/dist/manifest-82baTv4U.mjs +0 -45
- package/dist/manifest-B3QVVeBS.mjs +0 -82
- package/dist/manifest-BB2J8IMJ.mjs +0 -149
- package/dist/manifest-BKbgbSiY.mjs +0 -60
- package/dist/manifest-Bcf-TJzH.mjs +0 -848
- package/dist/manifest-BmtZzQiQ2.mjs +0 -45
- package/dist/manifest-Bnd7kqEY.mjs +0 -55
- package/dist/manifest-BqQX6OQC2.mjs +0 -65
- package/dist/manifest-BqrQ4Tpj.mjs +0 -81
- package/dist/manifest-Br4RPFt5.mjs +0 -370
- package/dist/manifest-C5qDjysN.mjs +0 -107
- package/dist/manifest-C9RT5nk32.mjs +0 -34
- package/dist/manifest-CAhOuvSl.mjs +0 -204
- package/dist/manifest-CBYWCUBJ.mjs +0 -51
- package/dist/manifest-CFADCRa1.mjs +0 -37
- package/dist/manifest-CQVhavRF.mjs +0 -114
- package/dist/manifest-CT7zZBV1.mjs +0 -48
- package/dist/manifest-CV12bcrF.mjs +0 -121
- package/dist/manifest-CXsRWjjI.mjs +0 -224
- package/dist/manifest-CZLUCfG02.mjs +0 -95
- package/dist/manifest-D6phHKFd.mjs +0 -131
- package/dist/manifest-DCyjf4n2.mjs +0 -294
- package/dist/manifest-DHsnKgP6.mjs +0 -60
- package/dist/manifest-Df_dliIe.mjs +0 -55
- package/dist/manifest-Dh8WBmEW.mjs +0 -129
- package/dist/manifest-DhKRAT8_.mjs +0 -92
- package/dist/manifest-DlpTj4ic2.mjs +0 -193
- package/dist/manifest-DrbmZcFl2.mjs +0 -253
- package/dist/manifest-DuwHjUa5.mjs +0 -70
- package/dist/manifest-DzwvxPJX.mjs +0 -38
- package/dist/manifest-NXctwWQq.mjs +0 -68
- package/dist/manifest-Sc_0JQ13.mjs +0 -418
- package/dist/manifest-gZ4s_UtG.mjs +0 -96
- package/dist/manifest-qSleDqdO.mjs +0 -1023
- package/dist/modules-C184v-S9.mjs +0 -11365
- package/dist/mojo-ipc-B_H61Afw.mjs +0 -525
- package/dist/network-671Cw6hV.mjs +0 -3346
- package/dist/outputPaths-B1uGmrWZ.mjs +0 -1145
- package/dist/parse-args-BlRjqlkL.mjs +0 -39
- package/dist/platform-WmNn8Sxb.mjs +0 -2070
- package/dist/process-QcbIy5Zq.mjs +0 -1401
- package/dist/proxy-DqNs0bAd.mjs +0 -170
- package/dist/registry-D-6e18lB.mjs +0 -34
- package/dist/response-BQVP-xUn.mjs +0 -28
- package/dist/shared-state-board-DV-dpHFJ.mjs +0 -586
- package/dist/sourcemap-Dq8ez8vS.mjs +0 -650
- package/dist/ssrf-policy-ZaUfvhq7.mjs +0 -166
- package/dist/streaming-BUQ0VJsg.mjs +0 -725
- package/dist/tool-builder-DCbIC5Eo.mjs +0 -186
- package/dist/transform-CiYJfNX0.mjs +0 -1007
- package/dist/types-Bx92KJfT.mjs +0 -4
- package/dist/types-CPhOReNX.mjs +0 -37
- package/dist/wasm-DQTnHDs4.mjs +0 -531
- package/dist/workflow-f3xJOcjx.mjs +0 -725
|
@@ -1,425 +0,0 @@
|
|
|
1
|
-
import { _n as SCAN_UNKNOWN_INITIAL_MAX_ADDRESSES, dn as SCAN_DISPLAY_RESULTS_LIMIT, fn as SCAN_GROUP_MAX_PATTERN_SIZE, mn as SCAN_POINTER_MAX_RESULTS, pn as SCAN_MAX_RESULTS_PER_SCAN } from "./constants-B0OANIBL.mjs";
|
|
2
|
-
import { t as createPlatformProvider } from "./factory-DxlGh9Xf.mjs";
|
|
3
|
-
import { i as parsePattern } from "./NativeMemoryManager.utils-B-FjA2mJ.mjs";
|
|
4
|
-
import { t as nativeMemoryManager } from "./NativeMemoryManager.impl-dZtA1ZGn.mjs";
|
|
5
|
-
import { n as parseAddress, t as formatAddress } from "./formatAddress-DVkj9kpI.mjs";
|
|
6
|
-
import { n as getDefaultAlignment, r as getValueSize, scanSessionManager, t as compareScanValues } from "./MemoryScanSession-BsDZbLYm.mjs";
|
|
7
|
-
//#region src/native/MemoryScanner.ts
|
|
8
|
-
/**
|
|
9
|
-
* Memory Scanner — orchestrates iterative scan workflows.
|
|
10
|
-
*
|
|
11
|
-
* Provides CE-style scanning: first-scan → next-scan → narrow down → find target.
|
|
12
|
-
* Plus AI-native features: pointer scan, group scan, unknown initial value scan.
|
|
13
|
-
*
|
|
14
|
-
* Uses PlatformMemoryAPI for cross-platform memory operations.
|
|
15
|
-
*
|
|
16
|
-
* Performance: addresses stored as bigint internally; only converted to hex
|
|
17
|
-
* strings at API boundaries. This eliminates ~40K+ short-lived string objects
|
|
18
|
-
* and repeated BigInt↔string round-trips during next-scan operations.
|
|
19
|
-
*
|
|
20
|
-
* @module MemoryScanner
|
|
21
|
-
*/
|
|
22
|
-
var MemoryScanner = class {
|
|
23
|
-
nmm;
|
|
24
|
-
_provider = null;
|
|
25
|
-
get provider() {
|
|
26
|
-
if (!this._provider) this._provider = createPlatformProvider();
|
|
27
|
-
return this._provider;
|
|
28
|
-
}
|
|
29
|
-
constructor(nmm) {
|
|
30
|
-
this.nmm = nmm;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* First scan: scan entire process memory for a value.
|
|
34
|
-
* Creates a new session, stores matching addresses + values.
|
|
35
|
-
*/
|
|
36
|
-
async firstScan(pid, value, options) {
|
|
37
|
-
const start = performance.now();
|
|
38
|
-
const valueType = options.valueType;
|
|
39
|
-
const valueSize = getValueSize(valueType);
|
|
40
|
-
const alignment = options.alignment ?? getDefaultAlignment(valueType);
|
|
41
|
-
const maxResults = options.maxResults ?? SCAN_MAX_RESULTS_PER_SCAN;
|
|
42
|
-
if (valueSize === 0) return this.patternFirstScan(pid, value, valueType, options);
|
|
43
|
-
const { patternBytes } = parsePattern(value, valueType === "pointer" ? "uint64" : valueType);
|
|
44
|
-
if (patternBytes.length === 0) throw new Error(`Invalid pattern for type ${valueType}: "${value}"`);
|
|
45
|
-
const targetBuf = Buffer.from(patternBytes);
|
|
46
|
-
const sessionId = scanSessionManager.createSession(pid, options);
|
|
47
|
-
const addresses = [];
|
|
48
|
-
const values = /* @__PURE__ */ new Map();
|
|
49
|
-
const handle = this.provider.openProcess(pid, false);
|
|
50
|
-
try {
|
|
51
|
-
const regions = this.getFilteredRegions(handle, options);
|
|
52
|
-
const totalRegions = regions.length;
|
|
53
|
-
let regionsProcessed = 0;
|
|
54
|
-
for (const region of regions) {
|
|
55
|
-
if (options.onProgress) options.onProgress(regionsProcessed, totalRegions);
|
|
56
|
-
regionsProcessed++;
|
|
57
|
-
if (addresses.length >= maxResults) break;
|
|
58
|
-
const regionBase = region.baseAddress;
|
|
59
|
-
const regionSize = region.size;
|
|
60
|
-
const chunkSize = 16 * 1024 * 1024;
|
|
61
|
-
for (let offset = 0; offset < regionSize && addresses.length < maxResults; offset += chunkSize) {
|
|
62
|
-
const readSize = Math.min(chunkSize, regionSize - offset);
|
|
63
|
-
const chunkAddr = regionBase + BigInt(offset);
|
|
64
|
-
let chunk;
|
|
65
|
-
try {
|
|
66
|
-
chunk = this.provider.readMemory(handle, chunkAddr, readSize).data;
|
|
67
|
-
} catch {
|
|
68
|
-
break;
|
|
69
|
-
}
|
|
70
|
-
if (alignment === valueSize && valueSize > 0) {
|
|
71
|
-
const alignStep = this.getAlignStep(alignment);
|
|
72
|
-
let searchFrom = this.getAlignedChunkStart(chunkAddr, alignStep);
|
|
73
|
-
while (searchFrom <= chunk.length - valueSize && addresses.length < maxResults) {
|
|
74
|
-
const hit = chunk.indexOf(targetBuf, searchFrom);
|
|
75
|
-
if (hit === -1) break;
|
|
76
|
-
if (!this.isAlignedAddress(chunkAddr + BigInt(hit), alignStep)) {
|
|
77
|
-
searchFrom = hit + 1;
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
const addr = chunkAddr + BigInt(hit);
|
|
81
|
-
addresses.push(addr);
|
|
82
|
-
values.set(addr, Buffer.from(chunk.subarray(hit, hit + valueSize)));
|
|
83
|
-
searchFrom = hit + alignStep;
|
|
84
|
-
}
|
|
85
|
-
} else {
|
|
86
|
-
const alignStep = this.getAlignStep(alignment);
|
|
87
|
-
const chunkStart = this.getAlignedChunkStart(chunkAddr, alignStep);
|
|
88
|
-
for (let i = chunkStart; i <= chunk.length - valueSize; i += alignStep) if (Buffer.compare(chunk.subarray(i, i + valueSize), targetBuf) === 0) {
|
|
89
|
-
const addr = chunkAddr + BigInt(i);
|
|
90
|
-
addresses.push(addr);
|
|
91
|
-
values.set(addr, Buffer.from(chunk.subarray(i, i + valueSize)));
|
|
92
|
-
if (addresses.length >= maxResults) break;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
} finally {
|
|
98
|
-
this.provider.closeProcess(handle);
|
|
99
|
-
}
|
|
100
|
-
scanSessionManager.updateSession(sessionId, addresses, values);
|
|
101
|
-
const elapsed = `${(performance.now() - start).toFixed(1)}ms`;
|
|
102
|
-
const displayAddresses = addresses.slice(0, SCAN_DISPLAY_RESULTS_LIMIT).map(formatAddress);
|
|
103
|
-
return {
|
|
104
|
-
sessionId,
|
|
105
|
-
matchCount: addresses.length,
|
|
106
|
-
scanNumber: 1,
|
|
107
|
-
addresses: displayAddresses,
|
|
108
|
-
totalMatches: addresses.length,
|
|
109
|
-
truncated: addresses.length > SCAN_DISPLAY_RESULTS_LIMIT,
|
|
110
|
-
elapsed
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Next scan: re-read stored addresses, filter using comparator.
|
|
115
|
-
*/
|
|
116
|
-
async nextScan(sessionId, mode, value, value2) {
|
|
117
|
-
const start = performance.now();
|
|
118
|
-
const session = scanSessionManager.getSession(sessionId);
|
|
119
|
-
const { pid, valueType, addresses: prevAddresses, previousValues } = session;
|
|
120
|
-
const valueSize = getValueSize(valueType);
|
|
121
|
-
if (valueSize === 0) throw new Error("Next-scan is not supported for variable-length types (hex/string)");
|
|
122
|
-
let targetBuf = null;
|
|
123
|
-
let target2Buf = null;
|
|
124
|
-
if (value !== void 0) {
|
|
125
|
-
const { patternBytes } = parsePattern(value, valueType === "pointer" ? "uint64" : valueType);
|
|
126
|
-
targetBuf = Buffer.from(patternBytes);
|
|
127
|
-
}
|
|
128
|
-
if (value2 !== void 0) {
|
|
129
|
-
const { patternBytes } = parsePattern(value2, valueType === "pointer" ? "uint64" : valueType);
|
|
130
|
-
target2Buf = Buffer.from(patternBytes);
|
|
131
|
-
}
|
|
132
|
-
const newAddresses = [];
|
|
133
|
-
const newValues = /* @__PURE__ */ new Map();
|
|
134
|
-
const handle = this.provider.openProcess(pid, false);
|
|
135
|
-
try {
|
|
136
|
-
for (const addr of prevAddresses) {
|
|
137
|
-
let currentBuf;
|
|
138
|
-
try {
|
|
139
|
-
currentBuf = this.provider.readMemory(handle, addr, valueSize).data;
|
|
140
|
-
} catch {
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
const prevBuf = previousValues.get(addr) ?? null;
|
|
144
|
-
if (compareScanValues(currentBuf, prevBuf, targetBuf, target2Buf, mode, valueType)) {
|
|
145
|
-
newAddresses.push(addr);
|
|
146
|
-
newValues.set(addr, Buffer.from(currentBuf));
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
} finally {
|
|
150
|
-
this.provider.closeProcess(handle);
|
|
151
|
-
}
|
|
152
|
-
scanSessionManager.updateSession(sessionId, newAddresses, newValues);
|
|
153
|
-
const elapsed = `${(performance.now() - start).toFixed(1)}ms`;
|
|
154
|
-
const displayAddresses = newAddresses.slice(0, SCAN_DISPLAY_RESULTS_LIMIT).map(formatAddress);
|
|
155
|
-
return {
|
|
156
|
-
sessionId,
|
|
157
|
-
matchCount: newAddresses.length,
|
|
158
|
-
scanNumber: session.scanCount,
|
|
159
|
-
addresses: displayAddresses,
|
|
160
|
-
totalMatches: newAddresses.length,
|
|
161
|
-
truncated: newAddresses.length > SCAN_DISPLAY_RESULTS_LIMIT,
|
|
162
|
-
elapsed
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Unknown initial value scan: captures all readable memory addresses
|
|
167
|
-
* of the given type, then next-scan narrows.
|
|
168
|
-
*/
|
|
169
|
-
async unknownInitialScan(pid, options) {
|
|
170
|
-
const start = performance.now();
|
|
171
|
-
const valueType = options.valueType;
|
|
172
|
-
const valueSize = getValueSize(valueType);
|
|
173
|
-
const alignment = options.alignment ?? getDefaultAlignment(valueType);
|
|
174
|
-
const maxAddresses = options.maxResults ?? SCAN_UNKNOWN_INITIAL_MAX_ADDRESSES;
|
|
175
|
-
if (valueSize === 0) throw new Error("Unknown initial scan is not supported for variable-length types");
|
|
176
|
-
const sessionId = scanSessionManager.createSession(pid, options);
|
|
177
|
-
const addresses = [];
|
|
178
|
-
const values = /* @__PURE__ */ new Map();
|
|
179
|
-
const handle = this.provider.openProcess(pid, false);
|
|
180
|
-
try {
|
|
181
|
-
const regions = this.getFilteredRegions(handle, options);
|
|
182
|
-
const totalRegions = regions.length;
|
|
183
|
-
let regionsProcessed = 0;
|
|
184
|
-
for (const region of regions) {
|
|
185
|
-
if (options.onProgress) options.onProgress(regionsProcessed, totalRegions);
|
|
186
|
-
regionsProcessed++;
|
|
187
|
-
if (addresses.length >= maxAddresses) break;
|
|
188
|
-
const regionBase = region.baseAddress;
|
|
189
|
-
const regionSize = region.size;
|
|
190
|
-
const chunkSize = 16 * 1024 * 1024;
|
|
191
|
-
for (let offset = 0; offset < regionSize && addresses.length < maxAddresses; offset += chunkSize) {
|
|
192
|
-
const readSize = Math.min(chunkSize, regionSize - offset);
|
|
193
|
-
const chunkAddr = regionBase + BigInt(offset);
|
|
194
|
-
let chunk;
|
|
195
|
-
try {
|
|
196
|
-
chunk = this.provider.readMemory(handle, chunkAddr, readSize).data;
|
|
197
|
-
} catch {
|
|
198
|
-
break;
|
|
199
|
-
}
|
|
200
|
-
const alignStep = this.getAlignStep(alignment);
|
|
201
|
-
const chunkStart = this.getAlignedChunkStart(chunkAddr, alignStep);
|
|
202
|
-
for (let i = chunkStart; i <= chunk.length - valueSize; i += alignStep) {
|
|
203
|
-
const addr = chunkAddr + BigInt(i);
|
|
204
|
-
addresses.push(addr);
|
|
205
|
-
values.set(addr, Buffer.from(chunk.subarray(i, i + valueSize)));
|
|
206
|
-
if (addresses.length >= maxAddresses) break;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
} finally {
|
|
211
|
-
this.provider.closeProcess(handle);
|
|
212
|
-
}
|
|
213
|
-
scanSessionManager.updateSession(sessionId, addresses, values);
|
|
214
|
-
const elapsed = `${(performance.now() - start).toFixed(1)}ms`;
|
|
215
|
-
return {
|
|
216
|
-
sessionId,
|
|
217
|
-
matchCount: addresses.length,
|
|
218
|
-
scanNumber: 1,
|
|
219
|
-
addresses: addresses.slice(0, SCAN_DISPLAY_RESULTS_LIMIT).map(formatAddress),
|
|
220
|
-
totalMatches: addresses.length,
|
|
221
|
-
truncated: addresses.length > SCAN_DISPLAY_RESULTS_LIMIT,
|
|
222
|
-
elapsed
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Pointer scan: find addresses whose value points to a valid target address.
|
|
227
|
-
*/
|
|
228
|
-
async pointerScan(pid, targetAddress, options = {}) {
|
|
229
|
-
const start = performance.now();
|
|
230
|
-
const maxResults = options.maxResults ?? SCAN_POINTER_MAX_RESULTS;
|
|
231
|
-
const targetAddr = parseAddress(targetAddress);
|
|
232
|
-
const scanOptions = {
|
|
233
|
-
valueType: "pointer",
|
|
234
|
-
alignment: 8,
|
|
235
|
-
regionFilter: { moduleOnly: options.moduleOnly }
|
|
236
|
-
};
|
|
237
|
-
const sessionId = scanSessionManager.createSession(pid, scanOptions);
|
|
238
|
-
const pointers = [];
|
|
239
|
-
const handle = this.provider.openProcess(pid, false);
|
|
240
|
-
try {
|
|
241
|
-
const regions = this.getFilteredRegions(handle, scanOptions);
|
|
242
|
-
for (const region of regions) {
|
|
243
|
-
if (options.moduleOnly) {}
|
|
244
|
-
if (pointers.length >= maxResults) break;
|
|
245
|
-
const regionBase = region.baseAddress;
|
|
246
|
-
const regionSize = region.size;
|
|
247
|
-
const chunkSize = 16 * 1024 * 1024;
|
|
248
|
-
for (let offset = 0; offset < regionSize && pointers.length < maxResults; offset += chunkSize) {
|
|
249
|
-
const readSize = Math.min(chunkSize, regionSize - offset);
|
|
250
|
-
const chunkAddr = regionBase + BigInt(offset);
|
|
251
|
-
let chunk;
|
|
252
|
-
try {
|
|
253
|
-
chunk = this.provider.readMemory(handle, chunkAddr, readSize).data;
|
|
254
|
-
} catch {
|
|
255
|
-
break;
|
|
256
|
-
}
|
|
257
|
-
for (let i = 0; i <= chunk.length - 8; i += 8) {
|
|
258
|
-
const ptrValue = chunk.readBigUInt64LE(i);
|
|
259
|
-
if ((ptrValue > targetAddr ? Number(ptrValue - targetAddr) : Number(targetAddr - ptrValue)) <= 4096) {
|
|
260
|
-
const addr = chunkAddr + BigInt(i);
|
|
261
|
-
const offsetFromTarget = ptrValue >= targetAddr ? Number(ptrValue - targetAddr) : -Number(targetAddr - ptrValue);
|
|
262
|
-
pointers.push({
|
|
263
|
-
address: formatAddress(addr),
|
|
264
|
-
value: formatAddress(ptrValue),
|
|
265
|
-
offsetFromTarget
|
|
266
|
-
});
|
|
267
|
-
if (pointers.length >= maxResults) break;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
} finally {
|
|
273
|
-
this.provider.closeProcess(handle);
|
|
274
|
-
}
|
|
275
|
-
const addresses = pointers.map((p) => parseAddress(p.address));
|
|
276
|
-
scanSessionManager.updateSession(sessionId, addresses, /* @__PURE__ */ new Map());
|
|
277
|
-
const elapsed = `${(performance.now() - start).toFixed(1)}ms`;
|
|
278
|
-
return {
|
|
279
|
-
sessionId,
|
|
280
|
-
pointers: pointers.slice(0, SCAN_DISPLAY_RESULTS_LIMIT),
|
|
281
|
-
totalFound: pointers.length,
|
|
282
|
-
elapsed
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Group scan: search for N values at known offsets simultaneously.
|
|
287
|
-
*/
|
|
288
|
-
async groupScan(pid, pattern, options) {
|
|
289
|
-
const start = performance.now();
|
|
290
|
-
if (pattern.length === 0) throw new Error("Group scan requires at least one value pattern");
|
|
291
|
-
const maxOffset = Math.max(...pattern.map((p) => p.offset + getValueSize(p.type)));
|
|
292
|
-
if (maxOffset > SCAN_GROUP_MAX_PATTERN_SIZE) throw new Error(`Group pattern too large: ${maxOffset} bytes (max ${SCAN_GROUP_MAX_PATTERN_SIZE})`);
|
|
293
|
-
const compositePattern = Array.from({ length: maxOffset }, () => 0);
|
|
294
|
-
const compositeMask = Array.from({ length: maxOffset }, () => 0);
|
|
295
|
-
for (const entry of pattern) {
|
|
296
|
-
const effectiveType = entry.type === "pointer" ? "uint64" : entry.type;
|
|
297
|
-
const { patternBytes, mask } = parsePattern(entry.value, effectiveType);
|
|
298
|
-
for (let i = 0; i < patternBytes.length; i++) {
|
|
299
|
-
compositePattern[entry.offset + i] = patternBytes[i];
|
|
300
|
-
compositeMask[entry.offset + i] = mask[i];
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
const alignment = options?.alignment ?? 4;
|
|
304
|
-
const maxResults = options?.maxResults ?? SCAN_MAX_RESULTS_PER_SCAN;
|
|
305
|
-
const scanOptions = {
|
|
306
|
-
valueType: "int32",
|
|
307
|
-
alignment
|
|
308
|
-
};
|
|
309
|
-
const sessionId = scanSessionManager.createSession(pid, scanOptions);
|
|
310
|
-
const addresses = [];
|
|
311
|
-
const handle = this.provider.openProcess(pid, false);
|
|
312
|
-
try {
|
|
313
|
-
const regions = this.getFilteredRegions(handle, scanOptions);
|
|
314
|
-
for (const region of regions) {
|
|
315
|
-
if (addresses.length >= maxResults) break;
|
|
316
|
-
const regionBase = region.baseAddress;
|
|
317
|
-
const regionSize = region.size;
|
|
318
|
-
const chunkSize = 16 * 1024 * 1024;
|
|
319
|
-
const overlap = maxOffset - 1;
|
|
320
|
-
for (let chunkOffset = 0; chunkOffset < regionSize && addresses.length < maxResults; chunkOffset += chunkSize) {
|
|
321
|
-
const readSize = Math.min(chunkSize + overlap, regionSize - chunkOffset);
|
|
322
|
-
const chunkAddr = regionBase + BigInt(chunkOffset);
|
|
323
|
-
let chunk;
|
|
324
|
-
try {
|
|
325
|
-
chunk = this.provider.readMemory(handle, chunkAddr, readSize).data;
|
|
326
|
-
} catch {
|
|
327
|
-
break;
|
|
328
|
-
}
|
|
329
|
-
const alignStep = this.getAlignStep(alignment);
|
|
330
|
-
const chunkStart = this.getAlignedChunkStart(chunkAddr, alignStep);
|
|
331
|
-
for (let i = chunkStart; i <= chunk.length - maxOffset; i += alignStep) {
|
|
332
|
-
let match = true;
|
|
333
|
-
for (let j = 0; j < maxOffset; j++) if (compositeMask[j] === 1 && chunk[i + j] !== compositePattern[j]) {
|
|
334
|
-
match = false;
|
|
335
|
-
break;
|
|
336
|
-
}
|
|
337
|
-
if (match) {
|
|
338
|
-
const addr = chunkAddr + BigInt(i);
|
|
339
|
-
addresses.push(addr);
|
|
340
|
-
if (addresses.length >= maxResults) break;
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
} finally {
|
|
346
|
-
this.provider.closeProcess(handle);
|
|
347
|
-
}
|
|
348
|
-
scanSessionManager.updateSession(sessionId, addresses, /* @__PURE__ */ new Map());
|
|
349
|
-
const elapsed = `${(performance.now() - start).toFixed(1)}ms`;
|
|
350
|
-
return {
|
|
351
|
-
sessionId,
|
|
352
|
-
matchCount: addresses.length,
|
|
353
|
-
scanNumber: 1,
|
|
354
|
-
addresses: addresses.slice(0, SCAN_DISPLAY_RESULTS_LIMIT).map(formatAddress),
|
|
355
|
-
totalMatches: addresses.length,
|
|
356
|
-
truncated: addresses.length > SCAN_DISPLAY_RESULTS_LIMIT,
|
|
357
|
-
elapsed
|
|
358
|
-
};
|
|
359
|
-
}
|
|
360
|
-
getAlignStep(alignment) {
|
|
361
|
-
return alignment > 0 ? alignment : 1;
|
|
362
|
-
}
|
|
363
|
-
getAlignedChunkStart(chunkAddr, alignStep) {
|
|
364
|
-
const align = BigInt(alignStep);
|
|
365
|
-
const remainder = chunkAddr % align;
|
|
366
|
-
return remainder === 0n ? 0 : Number(align - remainder);
|
|
367
|
-
}
|
|
368
|
-
isAlignedAddress(address, alignStep) {
|
|
369
|
-
return address % BigInt(alignStep) === 0n;
|
|
370
|
-
}
|
|
371
|
-
/**
|
|
372
|
-
* Pattern-based first scan for variable-length types (hex/string).
|
|
373
|
-
* Delegates to existing NativeMemoryManager.scanMemory.
|
|
374
|
-
*/
|
|
375
|
-
async patternFirstScan(pid, value, valueType, options) {
|
|
376
|
-
const start = performance.now();
|
|
377
|
-
const patternType = valueType === "pointer" ? "uint64" : valueType;
|
|
378
|
-
const result = await this.nmm.scanMemory(pid, value, patternType);
|
|
379
|
-
if (!result.success) throw new Error(result.error ?? "Scan failed");
|
|
380
|
-
const sessionId = scanSessionManager.createSession(pid, options);
|
|
381
|
-
const maxResultCount = options.maxResults ?? SCAN_MAX_RESULTS_PER_SCAN;
|
|
382
|
-
const addresses = result.addresses.slice(0, maxResultCount).map(parseAddress);
|
|
383
|
-
scanSessionManager.updateSession(sessionId, addresses, /* @__PURE__ */ new Map());
|
|
384
|
-
const elapsed = `${(performance.now() - start).toFixed(1)}ms`;
|
|
385
|
-
return {
|
|
386
|
-
sessionId,
|
|
387
|
-
matchCount: addresses.length,
|
|
388
|
-
scanNumber: 1,
|
|
389
|
-
addresses: addresses.slice(0, SCAN_DISPLAY_RESULTS_LIMIT).map(formatAddress),
|
|
390
|
-
totalMatches: result.addresses.length,
|
|
391
|
-
truncated: addresses.length > SCAN_DISPLAY_RESULTS_LIMIT,
|
|
392
|
-
elapsed
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
/**
|
|
396
|
-
* Get readable memory regions, applying region filters.
|
|
397
|
-
* Uses PlatformMemoryAPI.queryRegion() for cross-platform support.
|
|
398
|
-
*/
|
|
399
|
-
getFilteredRegions(handle, options) {
|
|
400
|
-
const regions = [];
|
|
401
|
-
let address = 0n;
|
|
402
|
-
const maxAddress = BigInt("0x7FFFFFFF0000");
|
|
403
|
-
const filter = options.regionFilter;
|
|
404
|
-
while (address < maxAddress) {
|
|
405
|
-
const regionInfo = this.provider.queryRegion(handle, address);
|
|
406
|
-
if (!regionInfo) break;
|
|
407
|
-
const regionSize = regionInfo.size;
|
|
408
|
-
if (regionInfo.isReadable && regionSize > 0 && regionSize <= Number.MAX_SAFE_INTEGER) {
|
|
409
|
-
let include = true;
|
|
410
|
-
if (filter?.writable && !regionInfo.isWritable) include = false;
|
|
411
|
-
if (filter?.executable && !regionInfo.isExecutable) include = false;
|
|
412
|
-
if (filter?.moduleOnly && regionInfo.type !== "image") include = false;
|
|
413
|
-
if (include) regions.push({
|
|
414
|
-
baseAddress: regionInfo.baseAddress,
|
|
415
|
-
size: regionSize
|
|
416
|
-
});
|
|
417
|
-
}
|
|
418
|
-
address = regionInfo.baseAddress + BigInt(regionInfo.size);
|
|
419
|
-
}
|
|
420
|
-
return regions;
|
|
421
|
-
}
|
|
422
|
-
};
|
|
423
|
-
const memoryScanner = new MemoryScanner(nativeMemoryManager);
|
|
424
|
-
//#endregion
|
|
425
|
-
export { MemoryScanner, memoryScanner };
|