@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,482 +0,0 @@
|
|
|
1
|
-
import { t as logger } from "./logger-Dh_xb7_2.mjs";
|
|
2
|
-
import { v as isKoffiAvailable, y as isWindows } from "./Win32API-CePkipZY.mjs";
|
|
3
|
-
import { n as cpuLimit } from "./concurrency-Bt0yv1kJ.mjs";
|
|
4
|
-
import { t as createPlatformProvider } from "./factory-DxlGh9Xf.mjs";
|
|
5
|
-
import { i as parsePattern, t as findPatternInBuffer } from "./NativeMemoryManager.utils-B-FjA2mJ.mjs";
|
|
6
|
-
import { exec } from "node:child_process";
|
|
7
|
-
import { promisify } from "node:util";
|
|
8
|
-
//#region src/native/NativeMemoryManager.availability.ts
|
|
9
|
-
async function checkNativeMemoryAvailability(execAsync) {
|
|
10
|
-
if (process.platform === "darwin") return checkDarwinAvailability(execAsync);
|
|
11
|
-
if (!isWindows()) return {
|
|
12
|
-
available: false,
|
|
13
|
-
reason: `Native memory operations require Windows or macOS. Current platform: ${process.platform}`
|
|
14
|
-
};
|
|
15
|
-
if (!isKoffiAvailable()) return {
|
|
16
|
-
available: false,
|
|
17
|
-
reason: "koffi library not available. Install with: pnpm add koffi"
|
|
18
|
-
};
|
|
19
|
-
try {
|
|
20
|
-
const { stdout } = await execAsync("powershell.exe -NoProfile -Command \"([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)\"", { timeout: 5e3 });
|
|
21
|
-
if (stdout.trim().toLowerCase() !== "true") return {
|
|
22
|
-
available: false,
|
|
23
|
-
reason: "Native memory operations require Administrator privileges. Run as Administrator."
|
|
24
|
-
};
|
|
25
|
-
} catch {
|
|
26
|
-
return {
|
|
27
|
-
available: false,
|
|
28
|
-
reason: "Failed to check Administrator privileges."
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
return { available: true };
|
|
32
|
-
}
|
|
33
|
-
async function checkDarwinAvailability(execAsync) {
|
|
34
|
-
try {
|
|
35
|
-
(await import("koffi")).default.load("/usr/lib/libSystem.B.dylib").unload();
|
|
36
|
-
} catch {
|
|
37
|
-
return {
|
|
38
|
-
available: false,
|
|
39
|
-
reason: "koffi library cannot load libSystem.B.dylib. Install koffi with: pnpm add koffi"
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
let sipInfo = "";
|
|
43
|
-
try {
|
|
44
|
-
const { stdout } = await execAsync("csrutil status 2>&1 || true", { timeout: 5e3 });
|
|
45
|
-
sipInfo = stdout.trim();
|
|
46
|
-
} catch {}
|
|
47
|
-
if (process.getuid && process.getuid() !== 0) return {
|
|
48
|
-
available: false,
|
|
49
|
-
reason: `macOS memory operations require root privileges for task_for_pid. Run with: sudo node <your-script>.${sipInfo ? ` SIP status: ${sipInfo}` : ""}`
|
|
50
|
-
};
|
|
51
|
-
return { available: true };
|
|
52
|
-
}
|
|
53
|
-
//#endregion
|
|
54
|
-
//#region src/native/NativeMemoryManager.impl.ts
|
|
55
|
-
/**
|
|
56
|
-
* Native Memory Manager — Cross-platform memory operations.
|
|
57
|
-
*
|
|
58
|
-
* Uses PlatformMemoryAPI for read/write/scan/regions/modules.
|
|
59
|
-
* Win32-only injection and debug methods remain guarded by platform checks.
|
|
60
|
-
*
|
|
61
|
-
* Performance improvement: 10-100x faster than PowerShell-based approach
|
|
62
|
-
* - No process spawning overhead
|
|
63
|
-
* - Direct memory access via FFI
|
|
64
|
-
* - Lower latency and higher throughput
|
|
65
|
-
*
|
|
66
|
-
* @module NativeMemoryManager
|
|
67
|
-
*/
|
|
68
|
-
const execAsync = promisify(exec);
|
|
69
|
-
const SCAN_CHUNK_SIZE = 16 * 1024 * 1024;
|
|
70
|
-
function scanRegionInChunks(region, patternBytes, mask, readChunk, chunkSize = SCAN_CHUNK_SIZE) {
|
|
71
|
-
if (patternBytes.length === 0 || region.regionSize < patternBytes.length || chunkSize <= 0) return [];
|
|
72
|
-
const overlap = Math.max(patternBytes.length - 1, 0);
|
|
73
|
-
let carryOver = Buffer.alloc(0);
|
|
74
|
-
const matches = [];
|
|
75
|
-
for (let chunkOffset = 0; chunkOffset < region.regionSize; chunkOffset += chunkSize) {
|
|
76
|
-
const readSize = Math.min(chunkSize, region.regionSize - chunkOffset);
|
|
77
|
-
const chunk = readChunk(region.baseAddress + BigInt(chunkOffset), readSize);
|
|
78
|
-
const scanBuffer = carryOver.length > 0 ? Buffer.concat([carryOver, chunk]) : chunk;
|
|
79
|
-
const chunkMatches = findPatternInBuffer(scanBuffer, patternBytes, mask);
|
|
80
|
-
for (const matchOffset of chunkMatches) {
|
|
81
|
-
const regionOffset = chunkOffset + matchOffset - carryOver.length;
|
|
82
|
-
matches.push(region.baseAddress + BigInt(regionOffset));
|
|
83
|
-
}
|
|
84
|
-
if (overlap === 0 || chunkOffset + readSize >= region.regionSize) {
|
|
85
|
-
carryOver = Buffer.alloc(0);
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
const carrySize = Math.min(overlap, scanBuffer.length);
|
|
89
|
-
carryOver = scanBuffer.subarray(scanBuffer.length - carrySize);
|
|
90
|
-
}
|
|
91
|
-
return matches;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* High-performance cross-platform memory manager.
|
|
95
|
-
* Uses PlatformMemoryAPI for read/write/scan/regions/modules.
|
|
96
|
-
* Win32-only methods (injection, debug) are guarded by platform checks.
|
|
97
|
-
*/
|
|
98
|
-
var NativeMemoryManager = class {
|
|
99
|
-
_provider = null;
|
|
100
|
-
/** Lazily create the platform memory provider */
|
|
101
|
-
get provider() {
|
|
102
|
-
if (!this._provider) this._provider = createPlatformProvider();
|
|
103
|
-
return this._provider;
|
|
104
|
-
}
|
|
105
|
-
async checkAvailability() {
|
|
106
|
-
return checkNativeMemoryAvailability(execAsync);
|
|
107
|
-
}
|
|
108
|
-
async readMemory(pid, address, size) {
|
|
109
|
-
try {
|
|
110
|
-
const addrNum = BigInt(address.startsWith("0x") ? address : `0x${address}`);
|
|
111
|
-
const handle = this.provider.openProcess(pid, false);
|
|
112
|
-
try {
|
|
113
|
-
const { data: buffer } = this.provider.readMemory(handle, addrNum, size);
|
|
114
|
-
return {
|
|
115
|
-
success: true,
|
|
116
|
-
data: buffer.toString("hex").toUpperCase().match(/.{2}/g)?.join(" ") || ""
|
|
117
|
-
};
|
|
118
|
-
} finally {
|
|
119
|
-
this.provider.closeProcess(handle);
|
|
120
|
-
}
|
|
121
|
-
} catch (error) {
|
|
122
|
-
logger.error("Native memory read failed", {
|
|
123
|
-
pid,
|
|
124
|
-
address,
|
|
125
|
-
size,
|
|
126
|
-
error: error instanceof Error ? error.message : String(error)
|
|
127
|
-
});
|
|
128
|
-
return {
|
|
129
|
-
success: false,
|
|
130
|
-
error: error instanceof Error ? error.message : String(error)
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
async writeMemory(pid, address, data, encoding = "hex") {
|
|
135
|
-
try {
|
|
136
|
-
const addrNum = BigInt(address.startsWith("0x") ? address : `0x${address}`);
|
|
137
|
-
let buffer;
|
|
138
|
-
if (encoding === "base64") buffer = Buffer.from(data, "base64");
|
|
139
|
-
else buffer = Buffer.from(data.replace(/\s/g, ""), "hex");
|
|
140
|
-
const handle = this.provider.openProcess(pid, true);
|
|
141
|
-
try {
|
|
142
|
-
const { bytesWritten } = this.provider.writeMemory(handle, addrNum, buffer);
|
|
143
|
-
return {
|
|
144
|
-
success: true,
|
|
145
|
-
bytesWritten
|
|
146
|
-
};
|
|
147
|
-
} finally {
|
|
148
|
-
this.provider.closeProcess(handle);
|
|
149
|
-
}
|
|
150
|
-
} catch (error) {
|
|
151
|
-
logger.error("Native memory write failed", {
|
|
152
|
-
pid,
|
|
153
|
-
address,
|
|
154
|
-
encoding,
|
|
155
|
-
dataLength: data.length,
|
|
156
|
-
error: error instanceof Error ? error.message : String(error)
|
|
157
|
-
});
|
|
158
|
-
return {
|
|
159
|
-
success: false,
|
|
160
|
-
error: error instanceof Error ? error.message : String(error)
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
async enumerateRegions(pid) {
|
|
165
|
-
try {
|
|
166
|
-
const handle = this.provider.openProcess(pid, false);
|
|
167
|
-
const regions = [];
|
|
168
|
-
try {
|
|
169
|
-
let address = 0n;
|
|
170
|
-
const maxAddress = BigInt("0x7FFFFFFF0000");
|
|
171
|
-
while (address < maxAddress) {
|
|
172
|
-
const regionInfo = this.provider.queryRegion(handle, address);
|
|
173
|
-
if (!regionInfo) break;
|
|
174
|
-
regions.push(regionInfoToMemoryRegion(regionInfo));
|
|
175
|
-
address = regionInfo.baseAddress + BigInt(regionInfo.size);
|
|
176
|
-
}
|
|
177
|
-
return {
|
|
178
|
-
success: true,
|
|
179
|
-
regions
|
|
180
|
-
};
|
|
181
|
-
} finally {
|
|
182
|
-
this.provider.closeProcess(handle);
|
|
183
|
-
}
|
|
184
|
-
} catch (error) {
|
|
185
|
-
logger.error("Native region enumeration failed", {
|
|
186
|
-
pid,
|
|
187
|
-
error: error instanceof Error ? error.message : String(error)
|
|
188
|
-
});
|
|
189
|
-
return {
|
|
190
|
-
success: false,
|
|
191
|
-
error: error instanceof Error ? error.message : String(error)
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
async checkMemoryProtection(pid, address) {
|
|
196
|
-
try {
|
|
197
|
-
const addrNum = BigInt(address.startsWith("0x") ? address : `0x${address}`);
|
|
198
|
-
const handle = this.provider.openProcess(pid, false);
|
|
199
|
-
try {
|
|
200
|
-
const regionInfo = this.provider.queryRegion(handle, addrNum);
|
|
201
|
-
if (!regionInfo) return {
|
|
202
|
-
success: false,
|
|
203
|
-
error: "Failed to query memory region"
|
|
204
|
-
};
|
|
205
|
-
return {
|
|
206
|
-
success: true,
|
|
207
|
-
protection: protectionToString(regionInfo.protection),
|
|
208
|
-
isWritable: regionInfo.isWritable,
|
|
209
|
-
isReadable: regionInfo.isReadable,
|
|
210
|
-
isExecutable: regionInfo.isExecutable,
|
|
211
|
-
regionStart: `0x${regionInfo.baseAddress.toString(16).toUpperCase()}`,
|
|
212
|
-
regionSize: regionInfo.size
|
|
213
|
-
};
|
|
214
|
-
} finally {
|
|
215
|
-
this.provider.closeProcess(handle);
|
|
216
|
-
}
|
|
217
|
-
} catch (error) {
|
|
218
|
-
logger.error("Native protection check failed", {
|
|
219
|
-
pid,
|
|
220
|
-
address,
|
|
221
|
-
error: error instanceof Error ? error.message : String(error)
|
|
222
|
-
});
|
|
223
|
-
return {
|
|
224
|
-
success: false,
|
|
225
|
-
error: error instanceof Error ? error.message : String(error)
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
async scanMemory(pid, pattern, patternType = "hex") {
|
|
230
|
-
try {
|
|
231
|
-
const { patternBytes, mask } = parsePattern(pattern, patternType);
|
|
232
|
-
if (patternBytes.length === 0) return {
|
|
233
|
-
success: false,
|
|
234
|
-
addresses: [],
|
|
235
|
-
error: "Invalid pattern"
|
|
236
|
-
};
|
|
237
|
-
const maxResults = 1e4;
|
|
238
|
-
const readableRegions = [];
|
|
239
|
-
const handle = this.provider.openProcess(pid, false);
|
|
240
|
-
let regionMatches = [];
|
|
241
|
-
try {
|
|
242
|
-
let address = 0n;
|
|
243
|
-
const maxAddress = BigInt("0x7FFFFFFF0000");
|
|
244
|
-
while (address < maxAddress) {
|
|
245
|
-
const regionInfo = this.provider.queryRegion(handle, address);
|
|
246
|
-
if (!regionInfo) break;
|
|
247
|
-
if (regionInfo.isReadable && regionInfo.size > 0 && regionInfo.size <= Number.MAX_SAFE_INTEGER) readableRegions.push({
|
|
248
|
-
baseAddress: regionInfo.baseAddress,
|
|
249
|
-
regionSize: regionInfo.size
|
|
250
|
-
});
|
|
251
|
-
address = regionInfo.baseAddress + BigInt(regionInfo.size);
|
|
252
|
-
}
|
|
253
|
-
const providerRef = this.provider;
|
|
254
|
-
regionMatches = await Promise.all(readableRegions.map((region) => cpuLimit(async () => {
|
|
255
|
-
try {
|
|
256
|
-
return scanRegionInChunks(region, patternBytes, mask, (addr, size) => providerRef.readMemory(handle, addr, size).data);
|
|
257
|
-
} catch {
|
|
258
|
-
return [];
|
|
259
|
-
}
|
|
260
|
-
})));
|
|
261
|
-
} finally {
|
|
262
|
-
this.provider.closeProcess(handle);
|
|
263
|
-
}
|
|
264
|
-
const addresses = [];
|
|
265
|
-
for (const matches of regionMatches) {
|
|
266
|
-
for (const foundAddr of matches) {
|
|
267
|
-
addresses.push(`0x${foundAddr.toString(16).toUpperCase()}`);
|
|
268
|
-
if (addresses.length >= maxResults) break;
|
|
269
|
-
}
|
|
270
|
-
if (addresses.length >= maxResults) break;
|
|
271
|
-
}
|
|
272
|
-
return {
|
|
273
|
-
success: true,
|
|
274
|
-
addresses,
|
|
275
|
-
stats: {
|
|
276
|
-
patternLength: patternBytes.length,
|
|
277
|
-
resultsFound: addresses.length
|
|
278
|
-
}
|
|
279
|
-
};
|
|
280
|
-
} catch (error) {
|
|
281
|
-
logger.error("Native memory scan failed", {
|
|
282
|
-
pid,
|
|
283
|
-
patternType,
|
|
284
|
-
patternLength: pattern.length,
|
|
285
|
-
error: error instanceof Error ? error.message : String(error)
|
|
286
|
-
});
|
|
287
|
-
return {
|
|
288
|
-
success: false,
|
|
289
|
-
addresses: [],
|
|
290
|
-
error: error instanceof Error ? error.message : String(error)
|
|
291
|
-
};
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
async enumerateModules(pid) {
|
|
295
|
-
try {
|
|
296
|
-
const handle = this.provider.openProcess(pid, false);
|
|
297
|
-
try {
|
|
298
|
-
return {
|
|
299
|
-
success: true,
|
|
300
|
-
modules: this.provider.enumerateModules(handle).map((m) => ({
|
|
301
|
-
name: m.name,
|
|
302
|
-
baseAddress: `0x${m.baseAddress.toString(16).toUpperCase()}`,
|
|
303
|
-
size: m.size
|
|
304
|
-
}))
|
|
305
|
-
};
|
|
306
|
-
} finally {
|
|
307
|
-
this.provider.closeProcess(handle);
|
|
308
|
-
}
|
|
309
|
-
} catch (error) {
|
|
310
|
-
logger.error("Native module enumeration failed", {
|
|
311
|
-
pid,
|
|
312
|
-
error: error instanceof Error ? error.message : String(error)
|
|
313
|
-
});
|
|
314
|
-
return {
|
|
315
|
-
success: false,
|
|
316
|
-
error: error instanceof Error ? error.message : String(error)
|
|
317
|
-
};
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
/** Win32 only — uses CreateRemoteThread + LoadLibraryA */
|
|
321
|
-
async injectDll(pid, dllPath) {
|
|
322
|
-
if (process.platform !== "win32") return {
|
|
323
|
-
success: false,
|
|
324
|
-
error: "DLL injection is only supported on Windows"
|
|
325
|
-
};
|
|
326
|
-
try {
|
|
327
|
-
const { openProcessForMemory, CloseHandle, WriteProcessMemory, VirtualAllocEx, CreateRemoteThread, GetModuleHandle, GetProcAddress, PAGE, MEM } = await import("./Win32API-CePkipZY.mjs").then((n) => n.g);
|
|
328
|
-
const handle = openProcessForMemory(pid, true);
|
|
329
|
-
try {
|
|
330
|
-
const loadLibraryAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
|
|
331
|
-
if (!loadLibraryAddr) return {
|
|
332
|
-
success: false,
|
|
333
|
-
error: "Failed to get LoadLibraryA address"
|
|
334
|
-
};
|
|
335
|
-
const pathBuffer = Buffer.from(dllPath + "\0", "ascii");
|
|
336
|
-
const remoteMem = VirtualAllocEx(handle, 0n, pathBuffer.length, MEM.COMMIT | MEM.RESERVE, PAGE.READWRITE);
|
|
337
|
-
if (!remoteMem) return {
|
|
338
|
-
success: false,
|
|
339
|
-
error: "Failed to allocate remote memory"
|
|
340
|
-
};
|
|
341
|
-
WriteProcessMemory(handle, remoteMem, pathBuffer);
|
|
342
|
-
const { handle: threadHandle, threadId } = CreateRemoteThread(handle, loadLibraryAddr, remoteMem);
|
|
343
|
-
if (!threadHandle) return {
|
|
344
|
-
success: false,
|
|
345
|
-
error: "Failed to create remote thread"
|
|
346
|
-
};
|
|
347
|
-
CloseHandle(threadHandle);
|
|
348
|
-
return {
|
|
349
|
-
success: true,
|
|
350
|
-
remoteThreadId: threadId
|
|
351
|
-
};
|
|
352
|
-
} finally {
|
|
353
|
-
CloseHandle(handle);
|
|
354
|
-
}
|
|
355
|
-
} catch (error) {
|
|
356
|
-
logger.error("Native DLL injection failed", {
|
|
357
|
-
pid,
|
|
358
|
-
dllPath,
|
|
359
|
-
error: error instanceof Error ? error.message : String(error)
|
|
360
|
-
});
|
|
361
|
-
return {
|
|
362
|
-
success: false,
|
|
363
|
-
error: error instanceof Error ? error.message : String(error)
|
|
364
|
-
};
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
/** Win32 only — uses VirtualAllocEx + CreateRemoteThread */
|
|
368
|
-
async injectShellcode(pid, shellcode, encoding = "hex") {
|
|
369
|
-
if (process.platform !== "win32") return {
|
|
370
|
-
success: false,
|
|
371
|
-
error: "Shellcode injection is only supported on Windows"
|
|
372
|
-
};
|
|
373
|
-
try {
|
|
374
|
-
let buffer;
|
|
375
|
-
if (encoding === "base64") buffer = Buffer.from(shellcode, "base64");
|
|
376
|
-
else buffer = Buffer.from(shellcode.replace(/\s/g, ""), "hex");
|
|
377
|
-
const { openProcessForMemory, CloseHandle, WriteProcessMemory, VirtualAllocEx, VirtualProtectEx, CreateRemoteThread, PAGE, MEM } = await import("./Win32API-CePkipZY.mjs").then((n) => n.g);
|
|
378
|
-
const handle = openProcessForMemory(pid, true);
|
|
379
|
-
try {
|
|
380
|
-
const remoteMem = VirtualAllocEx(handle, 0n, buffer.length, MEM.COMMIT | MEM.RESERVE, PAGE.READWRITE);
|
|
381
|
-
if (!remoteMem) return {
|
|
382
|
-
success: false,
|
|
383
|
-
error: "Failed to allocate remote memory"
|
|
384
|
-
};
|
|
385
|
-
WriteProcessMemory(handle, remoteMem, buffer);
|
|
386
|
-
const { success: protectSuccess } = VirtualProtectEx(handle, remoteMem, buffer.length, PAGE.EXECUTE_READWRITE);
|
|
387
|
-
if (!protectSuccess) return {
|
|
388
|
-
success: false,
|
|
389
|
-
error: "Failed to change memory protection"
|
|
390
|
-
};
|
|
391
|
-
const { handle: threadHandle, threadId } = CreateRemoteThread(handle, remoteMem, 0n);
|
|
392
|
-
if (!threadHandle) return {
|
|
393
|
-
success: false,
|
|
394
|
-
error: "Failed to create remote thread"
|
|
395
|
-
};
|
|
396
|
-
CloseHandle(threadHandle);
|
|
397
|
-
return {
|
|
398
|
-
success: true,
|
|
399
|
-
remoteThreadId: threadId
|
|
400
|
-
};
|
|
401
|
-
} finally {
|
|
402
|
-
CloseHandle(handle);
|
|
403
|
-
}
|
|
404
|
-
} catch (error) {
|
|
405
|
-
logger.error("Native shellcode injection failed", {
|
|
406
|
-
pid,
|
|
407
|
-
encoding,
|
|
408
|
-
shellcodeLength: shellcode.length,
|
|
409
|
-
error: error instanceof Error ? error.message : String(error)
|
|
410
|
-
});
|
|
411
|
-
return {
|
|
412
|
-
success: false,
|
|
413
|
-
error: error instanceof Error ? error.message : String(error)
|
|
414
|
-
};
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
/** Win32 only — uses NtQueryInformationProcess */
|
|
418
|
-
async checkDebugPort(pid) {
|
|
419
|
-
if (process.platform !== "win32") return {
|
|
420
|
-
success: false,
|
|
421
|
-
error: "Debug port check is only supported on Windows"
|
|
422
|
-
};
|
|
423
|
-
try {
|
|
424
|
-
const { openProcessForMemory, CloseHandle, NtQueryInformationProcess } = await import("./Win32API-CePkipZY.mjs").then((n) => n.g);
|
|
425
|
-
const handle = openProcessForMemory(pid, false);
|
|
426
|
-
try {
|
|
427
|
-
const { status, debugPort } = NtQueryInformationProcess(handle, 7);
|
|
428
|
-
if (status !== 0) return {
|
|
429
|
-
success: false,
|
|
430
|
-
error: `NtQueryInformationProcess failed with status 0x${status.toString(16)}`
|
|
431
|
-
};
|
|
432
|
-
return {
|
|
433
|
-
success: true,
|
|
434
|
-
isDebugged: debugPort !== 0
|
|
435
|
-
};
|
|
436
|
-
} finally {
|
|
437
|
-
CloseHandle(handle);
|
|
438
|
-
}
|
|
439
|
-
} catch (error) {
|
|
440
|
-
logger.error("Native debug port check failed", {
|
|
441
|
-
pid,
|
|
442
|
-
error: error instanceof Error ? error.message : String(error)
|
|
443
|
-
});
|
|
444
|
-
return {
|
|
445
|
-
success: false,
|
|
446
|
-
error: error instanceof Error ? error.message : String(error)
|
|
447
|
-
};
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
};
|
|
451
|
-
/** Convert platform-agnostic MemoryRegionInfo to legacy MemoryRegion format */
|
|
452
|
-
function regionInfoToMemoryRegion(info) {
|
|
453
|
-
return {
|
|
454
|
-
baseAddress: `0x${info.baseAddress.toString(16).toUpperCase()}`,
|
|
455
|
-
size: info.size,
|
|
456
|
-
state: info.state.toUpperCase(),
|
|
457
|
-
protection: protectionToString(info.protection),
|
|
458
|
-
isReadable: info.isReadable,
|
|
459
|
-
isWritable: info.isWritable,
|
|
460
|
-
isExecutable: info.isExecutable,
|
|
461
|
-
type: info.type.toUpperCase()
|
|
462
|
-
};
|
|
463
|
-
}
|
|
464
|
-
/** Convert MemoryProtection flags to human-readable string */
|
|
465
|
-
function protectionToString(prot) {
|
|
466
|
-
if (prot === 0) return "NOACCESS";
|
|
467
|
-
const parts = [];
|
|
468
|
-
const hasRead = (prot & 1) !== 0;
|
|
469
|
-
const hasWrite = (prot & 2) !== 0;
|
|
470
|
-
const hasExec = (prot & 4) !== 0;
|
|
471
|
-
const hasGuard = (prot & 8) !== 0;
|
|
472
|
-
if (hasRead && hasWrite && hasExec) parts.push("RWX");
|
|
473
|
-
else if (hasRead && hasExec) parts.push("RX");
|
|
474
|
-
else if (hasRead && hasWrite) parts.push("RW");
|
|
475
|
-
else if (hasRead) parts.push("R");
|
|
476
|
-
else if (hasExec) parts.push("X");
|
|
477
|
-
if (hasGuard) parts.push("GUARD");
|
|
478
|
-
return parts.join(" ") || "UNKNOWN";
|
|
479
|
-
}
|
|
480
|
-
const nativeMemoryManager = new NativeMemoryManager();
|
|
481
|
-
//#endregion
|
|
482
|
-
export { nativeMemoryManager as t };
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import { u as PAGE, v as isKoffiAvailable$1 } from "./Win32API-CePkipZY.mjs";
|
|
2
|
-
//#region src/native/NativeMemoryManager.utils.ts
|
|
3
|
-
function isKoffiAvailable() {
|
|
4
|
-
return isKoffiAvailable$1();
|
|
5
|
-
}
|
|
6
|
-
function parsePattern(pattern, patternType) {
|
|
7
|
-
const patternBytes = [];
|
|
8
|
-
const mask = [];
|
|
9
|
-
switch (patternType) {
|
|
10
|
-
case "hex": {
|
|
11
|
-
const parts = pattern.trim().split(/\s+/);
|
|
12
|
-
for (const part of parts) if (part === "??" || part === "**" || part === "?") {
|
|
13
|
-
patternBytes.push(0);
|
|
14
|
-
mask.push(0);
|
|
15
|
-
} else {
|
|
16
|
-
const byte = parseInt(part, 16);
|
|
17
|
-
if (!isNaN(byte)) {
|
|
18
|
-
patternBytes.push(byte);
|
|
19
|
-
mask.push(1);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
break;
|
|
23
|
-
}
|
|
24
|
-
case "int32": {
|
|
25
|
-
const int32Val = parseInt(pattern);
|
|
26
|
-
if (!isNaN(int32Val)) {
|
|
27
|
-
const buf = Buffer.allocUnsafe(4);
|
|
28
|
-
buf.writeInt32LE(int32Val, 0);
|
|
29
|
-
patternBytes.push(...buf);
|
|
30
|
-
mask.push(1, 1, 1, 1);
|
|
31
|
-
}
|
|
32
|
-
break;
|
|
33
|
-
}
|
|
34
|
-
case "int64": {
|
|
35
|
-
const int64Val = BigInt(pattern);
|
|
36
|
-
const buf64 = Buffer.allocUnsafe(8);
|
|
37
|
-
buf64.writeBigInt64LE(int64Val, 0);
|
|
38
|
-
patternBytes.push(...buf64);
|
|
39
|
-
mask.push(1, 1, 1, 1, 1, 1, 1, 1);
|
|
40
|
-
break;
|
|
41
|
-
}
|
|
42
|
-
case "float": {
|
|
43
|
-
const floatVal = parseFloat(pattern);
|
|
44
|
-
if (!isNaN(floatVal)) {
|
|
45
|
-
const bufFloat = Buffer.allocUnsafe(4);
|
|
46
|
-
bufFloat.writeFloatLE(floatVal, 0);
|
|
47
|
-
patternBytes.push(...bufFloat);
|
|
48
|
-
mask.push(1, 1, 1, 1);
|
|
49
|
-
}
|
|
50
|
-
break;
|
|
51
|
-
}
|
|
52
|
-
case "double": {
|
|
53
|
-
const doubleVal = parseFloat(pattern);
|
|
54
|
-
if (!isNaN(doubleVal)) {
|
|
55
|
-
const bufDouble = Buffer.allocUnsafe(8);
|
|
56
|
-
bufDouble.writeDoubleLE(doubleVal, 0);
|
|
57
|
-
patternBytes.push(...bufDouble);
|
|
58
|
-
mask.push(1, 1, 1, 1, 1, 1, 1, 1);
|
|
59
|
-
}
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
case "string": {
|
|
63
|
-
const strBuf = Buffer.from(pattern, "utf8");
|
|
64
|
-
patternBytes.push(...strBuf);
|
|
65
|
-
mask.push(...strBuf.map(() => 1));
|
|
66
|
-
break;
|
|
67
|
-
}
|
|
68
|
-
case "byte": {
|
|
69
|
-
const byteVal = parseInt(pattern) & 255;
|
|
70
|
-
patternBytes.push(byteVal);
|
|
71
|
-
mask.push(1);
|
|
72
|
-
break;
|
|
73
|
-
}
|
|
74
|
-
case "int8": {
|
|
75
|
-
const int8Val = parseInt(pattern);
|
|
76
|
-
const buf8 = Buffer.allocUnsafe(1);
|
|
77
|
-
buf8.writeInt8(int8Val, 0);
|
|
78
|
-
patternBytes.push(...buf8);
|
|
79
|
-
mask.push(1);
|
|
80
|
-
break;
|
|
81
|
-
}
|
|
82
|
-
case "int16": {
|
|
83
|
-
const int16Val = parseInt(pattern);
|
|
84
|
-
const buf16s = Buffer.allocUnsafe(2);
|
|
85
|
-
buf16s.writeInt16LE(int16Val, 0);
|
|
86
|
-
patternBytes.push(...buf16s);
|
|
87
|
-
mask.push(1, 1);
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
case "uint16": {
|
|
91
|
-
const uint16Val = parseInt(pattern);
|
|
92
|
-
const buf16u = Buffer.allocUnsafe(2);
|
|
93
|
-
buf16u.writeUInt16LE(uint16Val, 0);
|
|
94
|
-
patternBytes.push(...buf16u);
|
|
95
|
-
mask.push(1, 1);
|
|
96
|
-
break;
|
|
97
|
-
}
|
|
98
|
-
case "uint32": {
|
|
99
|
-
const uint32Val = parseInt(pattern) >>> 0;
|
|
100
|
-
const buf32u = Buffer.allocUnsafe(4);
|
|
101
|
-
buf32u.writeUInt32LE(uint32Val, 0);
|
|
102
|
-
patternBytes.push(...buf32u);
|
|
103
|
-
mask.push(1, 1, 1, 1);
|
|
104
|
-
break;
|
|
105
|
-
}
|
|
106
|
-
case "uint64":
|
|
107
|
-
case "pointer": {
|
|
108
|
-
const uint64Val = BigInt(pattern);
|
|
109
|
-
const buf64u = Buffer.allocUnsafe(8);
|
|
110
|
-
buf64u.writeBigUInt64LE(uint64Val, 0);
|
|
111
|
-
patternBytes.push(...buf64u);
|
|
112
|
-
mask.push(1, 1, 1, 1, 1, 1, 1, 1);
|
|
113
|
-
break;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
return {
|
|
117
|
-
patternBytes,
|
|
118
|
-
mask
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
function findExactPatternBMH(buffer, pattern) {
|
|
122
|
-
const matches = [];
|
|
123
|
-
const patternLength = pattern.length;
|
|
124
|
-
if (patternLength === 0 || buffer.length < patternLength) return matches;
|
|
125
|
-
const lastIndex = patternLength - 1;
|
|
126
|
-
const skipTable = new Uint32Array(256);
|
|
127
|
-
skipTable.fill(patternLength);
|
|
128
|
-
for (let i = 0; i < lastIndex; i++) {
|
|
129
|
-
const patternByte = pattern[i];
|
|
130
|
-
if (patternByte !== void 0) skipTable[patternByte] = lastIndex - i;
|
|
131
|
-
}
|
|
132
|
-
let offset = 0;
|
|
133
|
-
while (offset <= buffer.length - patternLength) {
|
|
134
|
-
let patternIndex = lastIndex;
|
|
135
|
-
while (patternIndex >= 0 && buffer[offset + patternIndex] === pattern[patternIndex]) patternIndex--;
|
|
136
|
-
if (patternIndex < 0) {
|
|
137
|
-
matches.push(offset);
|
|
138
|
-
offset += 1;
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
|
-
const skipByte = buffer[offset + lastIndex];
|
|
142
|
-
if (skipByte === void 0) break;
|
|
143
|
-
offset += skipTable[skipByte] ?? patternLength;
|
|
144
|
-
}
|
|
145
|
-
return matches;
|
|
146
|
-
}
|
|
147
|
-
function findPatternInBuffer(buffer, pattern, mask) {
|
|
148
|
-
if (pattern.length === 0) return [];
|
|
149
|
-
if (mask.every((value) => value === 1)) return findExactPatternBMH(buffer, pattern);
|
|
150
|
-
const matches = [];
|
|
151
|
-
for (let i = 0; i <= buffer.length - pattern.length; i++) {
|
|
152
|
-
let found = true;
|
|
153
|
-
for (let j = 0; j < pattern.length; j++) if (mask[j] === 1 && buffer[i + j] !== pattern[j]) {
|
|
154
|
-
found = false;
|
|
155
|
-
break;
|
|
156
|
-
}
|
|
157
|
-
if (found) matches.push(i);
|
|
158
|
-
}
|
|
159
|
-
return matches;
|
|
160
|
-
}
|
|
161
|
-
function isExecutable(protect) {
|
|
162
|
-
return (protect & PAGE.EXECUTE) !== 0 || (protect & PAGE.EXECUTE_READ) !== 0 || (protect & PAGE.EXECUTE_READWRITE) !== 0;
|
|
163
|
-
}
|
|
164
|
-
//#endregion
|
|
165
|
-
export { parsePattern as i, isExecutable as n, isKoffiAvailable as r, findPatternInBuffer as t };
|