@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,97 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
import { W as EXTERNAL_TOOL_FORCE_KILL_GRACE_MS } from "./constants-B0OANIBL.mjs";
|
|
3
|
-
//#region src/utils/ProcessRegistry.ts
|
|
4
|
-
/**
|
|
5
|
-
* Global singleton registry to track and safely terminate orphaned child
|
|
6
|
-
* processes and worker threads upon server shutdown.
|
|
7
|
-
*/
|
|
8
|
-
var ProcessRegistrySingleton = class {
|
|
9
|
-
processes = /* @__PURE__ */ new Set();
|
|
10
|
-
/**
|
|
11
|
-
* Register a ChildProcess or Worker for automatic cleanup on shutdown.
|
|
12
|
-
*/
|
|
13
|
-
register(proc) {
|
|
14
|
-
if (!proc) return;
|
|
15
|
-
this.processes.add(proc);
|
|
16
|
-
if ("kill" in proc) proc.once("close", () => this.unregister(proc));
|
|
17
|
-
else if ("terminate" in proc) {
|
|
18
|
-
if (typeof proc.once === "function") proc.once("exit", () => this.unregister(proc));
|
|
19
|
-
else if (typeof proc.on === "function") proc.on("exit", () => this.unregister(proc));
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Unregister a process/worker.
|
|
24
|
-
*/
|
|
25
|
-
unregister(proc) {
|
|
26
|
-
if (!proc) return;
|
|
27
|
-
this.processes.delete(proc);
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Terminate all tracked processes and workers.
|
|
31
|
-
* Sends SIGTERM, then after a grace period sends SIGKILL.
|
|
32
|
-
*/
|
|
33
|
-
async terminateAll() {
|
|
34
|
-
if (this.processes.size === 0) return;
|
|
35
|
-
logger.debug(`[ProcessRegistry] Attempting to terminate ${this.processes.size} active processes/workers...`);
|
|
36
|
-
const terminationPromises = [];
|
|
37
|
-
for (const proc of this.processes) if ("terminate" in proc) terminationPromises.push(proc.terminate().then(() => {
|
|
38
|
-
this.processes.delete(proc);
|
|
39
|
-
}).catch((err) => {
|
|
40
|
-
logger.warn(`[ProcessRegistry] Error terminating worker: ${err.message}`);
|
|
41
|
-
}));
|
|
42
|
-
else if ("kill" in proc) terminationPromises.push(new Promise((resolve) => {
|
|
43
|
-
if (proc.killed || proc.exitCode !== null || proc.signalCode !== null) {
|
|
44
|
-
this.processes.delete(proc);
|
|
45
|
-
return resolve();
|
|
46
|
-
}
|
|
47
|
-
proc.kill("SIGTERM");
|
|
48
|
-
let settled = false;
|
|
49
|
-
const handleExit = () => {
|
|
50
|
-
if (settled) return;
|
|
51
|
-
settled = true;
|
|
52
|
-
this.processes.delete(proc);
|
|
53
|
-
resolve();
|
|
54
|
-
};
|
|
55
|
-
proc.once("exit", handleExit);
|
|
56
|
-
proc.once("close", handleExit);
|
|
57
|
-
setTimeout(() => {
|
|
58
|
-
if (!settled && !proc.killed && proc.exitCode === null) {
|
|
59
|
-
logger.debug(`[ProcessRegistry] Force killing child process PID ${proc.pid}`);
|
|
60
|
-
try {
|
|
61
|
-
proc.kill("SIGKILL");
|
|
62
|
-
} catch {}
|
|
63
|
-
handleExit();
|
|
64
|
-
}
|
|
65
|
-
}, EXTERNAL_TOOL_FORCE_KILL_GRACE_MS).unref();
|
|
66
|
-
}));
|
|
67
|
-
await Promise.race([Promise.all(terminationPromises), new Promise((resolve) => setTimeout(resolve, EXTERNAL_TOOL_FORCE_KILL_GRACE_MS + 1e3).unref())]);
|
|
68
|
-
this.processes.clear();
|
|
69
|
-
logger.debug(`[ProcessRegistry] Termination sweep complete.`);
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
const ProcessRegistry = new ProcessRegistrySingleton();
|
|
73
|
-
//#endregion
|
|
74
|
-
//#region src/modules/hook/HookGeneratorBuilders.core.generators.runtime.ts
|
|
75
|
-
function generateFunctionHook(target, action, customCode, condition, performance = false) {
|
|
76
|
-
return `
|
|
1
|
+
function e(e,t,n,r,i=!1){return`
|
|
77
2
|
(function() {
|
|
78
3
|
'use strict';
|
|
79
|
-
${
|
|
4
|
+
${r?`
|
|
80
5
|
let callCount = 0;
|
|
81
6
|
let lastCallTime = 0;
|
|
82
|
-
const maxCalls = ${
|
|
83
|
-
const minInterval = ${
|
|
84
|
-
|
|
7
|
+
const maxCalls = ${r.maxCalls||`Infinity`};
|
|
8
|
+
const minInterval = ${r.minInterval||0};
|
|
9
|
+
`:``}
|
|
85
10
|
|
|
86
|
-
const originalFunction = ${
|
|
11
|
+
const originalFunction = ${e};
|
|
87
12
|
|
|
88
13
|
if (typeof originalFunction !== 'function') {
|
|
89
|
-
console.error('[Hook] Target is not a function: ${
|
|
14
|
+
console.error('[Hook] Target is not a function: ${e}');
|
|
90
15
|
return;
|
|
91
16
|
}
|
|
92
17
|
|
|
93
|
-
${
|
|
94
|
-
${
|
|
18
|
+
${e} = function(...args) {
|
|
19
|
+
${r?`
|
|
95
20
|
const now = Date.now();
|
|
96
21
|
if (callCount >= maxCalls) {
|
|
97
22
|
console.log('[Hook] Max calls reached, skipping');
|
|
@@ -103,14 +28,14 @@ ${target} = function(...args) {
|
|
|
103
28
|
}
|
|
104
29
|
callCount++;
|
|
105
30
|
lastCallTime = now;
|
|
106
|
-
|
|
31
|
+
`:``}
|
|
107
32
|
|
|
108
|
-
${
|
|
33
|
+
${i?`
|
|
109
34
|
const startTime = performance.now();
|
|
110
|
-
|
|
35
|
+
`:``}
|
|
111
36
|
|
|
112
37
|
const hookContext = {
|
|
113
|
-
target: '${
|
|
38
|
+
target: '${e}',
|
|
114
39
|
type: 'function',
|
|
115
40
|
timestamp: Date.now(),
|
|
116
41
|
arguments: args,
|
|
@@ -119,27 +44,24 @@ ${target} = function(...args) {
|
|
|
119
44
|
|
|
120
45
|
console.log('[Hook] Function called:', hookContext);
|
|
121
46
|
|
|
122
|
-
${
|
|
123
|
-
${
|
|
47
|
+
${t===`block`?`return undefined;`:``}
|
|
48
|
+
${t===`modify`&&n?n:``}
|
|
124
49
|
|
|
125
50
|
const result = originalFunction.apply(this, args);
|
|
126
51
|
|
|
127
|
-
${
|
|
52
|
+
${i?`
|
|
128
53
|
const endTime = performance.now();
|
|
129
54
|
console.log('[Hook] Execution time:', (endTime - startTime).toFixed(2), 'ms');
|
|
130
|
-
|
|
55
|
+
`:``}
|
|
131
56
|
|
|
132
57
|
console.log('[Hook] Function result:', result);
|
|
133
58
|
|
|
134
59
|
return result;
|
|
135
60
|
};
|
|
136
61
|
|
|
137
|
-
console.log('[Hook] Successfully hooked: ${
|
|
62
|
+
console.log('[Hook] Successfully hooked: ${e}');
|
|
138
63
|
})();
|
|
139
|
-
`.trim()
|
|
140
|
-
}
|
|
141
|
-
function generateEvalHook(action, customCode, _condition, _performance = false) {
|
|
142
|
-
return `
|
|
64
|
+
`.trim()}function t(e,t,n,r=!1){return`
|
|
143
65
|
(function() {
|
|
144
66
|
'use strict';
|
|
145
67
|
|
|
@@ -162,8 +84,8 @@ window.eval = function(code) {
|
|
|
162
84
|
timestamp: new Date().toISOString()
|
|
163
85
|
});
|
|
164
86
|
|
|
165
|
-
${
|
|
166
|
-
${
|
|
87
|
+
${e===`block`?`return undefined;`:``}
|
|
88
|
+
${t||``}
|
|
167
89
|
|
|
168
90
|
try {
|
|
169
91
|
const result = originalEval.call(this, code);
|
|
@@ -192,8 +114,8 @@ window.Function = function(...args) {
|
|
|
192
114
|
timestamp: new Date().toISOString()
|
|
193
115
|
});
|
|
194
116
|
|
|
195
|
-
${
|
|
196
|
-
${
|
|
117
|
+
${e===`block`?`return function() {};`:``}
|
|
118
|
+
${t||``}
|
|
197
119
|
|
|
198
120
|
try {
|
|
199
121
|
const result = originalFunction.apply(this, args);
|
|
@@ -214,7 +136,7 @@ window.setTimeout = function(handler, timeout, ...args) {
|
|
|
214
136
|
timestamp: new Date().toISOString()
|
|
215
137
|
});
|
|
216
138
|
|
|
217
|
-
${
|
|
139
|
+
${e===`block`?`return 0;`:``}
|
|
218
140
|
}
|
|
219
141
|
|
|
220
142
|
return originalSetTimeout.apply(this, [handler, timeout, ...args]);
|
|
@@ -229,7 +151,7 @@ window.setInterval = function(handler, timeout, ...args) {
|
|
|
229
151
|
timestamp: new Date().toISOString()
|
|
230
152
|
});
|
|
231
153
|
|
|
232
|
-
${
|
|
154
|
+
${e===`block`?`return 0;`:``}
|
|
233
155
|
}
|
|
234
156
|
|
|
235
157
|
return originalSetInterval.apply(this, [handler, timeout, ...args]);
|
|
@@ -237,13 +159,7 @@ window.setInterval = function(handler, timeout, ...args) {
|
|
|
237
159
|
|
|
238
160
|
console.log('[Eval Hook] Successfully hooked eval, Function, setTimeout, setInterval');
|
|
239
161
|
})();
|
|
240
|
-
`.trim();
|
|
241
|
-
}
|
|
242
|
-
function generateObjectMethodHook(target, action, customCode, _condition, _performance = false) {
|
|
243
|
-
const parts = target.split(".");
|
|
244
|
-
const methodName = parts.pop();
|
|
245
|
-
const objectPath = parts.join(".");
|
|
246
|
-
return `
|
|
162
|
+
`.trim()}function n(e,t,n,r,i=!1){let a=e.split(`.`),o=a.pop(),s=a.join(`.`);return`
|
|
247
163
|
(function() {
|
|
248
164
|
'use strict';
|
|
249
165
|
|
|
@@ -262,11 +178,11 @@ function getObjectByPath(path) {
|
|
|
262
178
|
return obj;
|
|
263
179
|
}
|
|
264
180
|
|
|
265
|
-
const targetObject = getObjectByPath('${
|
|
266
|
-
const methodName = '${
|
|
181
|
+
const targetObject = getObjectByPath('${s}');
|
|
182
|
+
const methodName = '${o}';
|
|
267
183
|
|
|
268
184
|
if (!targetObject) {
|
|
269
|
-
console.error('[Object Hook] Target object not found: ${
|
|
185
|
+
console.error('[Object Hook] Target object not found: ${s}');
|
|
270
186
|
return;
|
|
271
187
|
}
|
|
272
188
|
|
|
@@ -274,7 +190,7 @@ const descriptor = Object.getOwnPropertyDescriptor(targetObject, methodName) ||
|
|
|
274
190
|
Object.getOwnPropertyDescriptor(Object.getPrototypeOf(targetObject), methodName);
|
|
275
191
|
|
|
276
192
|
if (!descriptor) {
|
|
277
|
-
console.error('[Object Hook] Property not found: ${
|
|
193
|
+
console.error('[Object Hook] Property not found: ${e}');
|
|
278
194
|
return;
|
|
279
195
|
}
|
|
280
196
|
|
|
@@ -288,7 +204,7 @@ if (typeof targetObject[methodName] === 'function') {
|
|
|
288
204
|
const startTime = performance.now();
|
|
289
205
|
const stackTrace = new Error().stack.split('\\n').slice(2, 5).join('\\n');
|
|
290
206
|
|
|
291
|
-
console.log(\`[Object Hook #\${callId}] ${
|
|
207
|
+
console.log(\`[Object Hook #\${callId}] ${e}:\`, {
|
|
292
208
|
arguments: args,
|
|
293
209
|
this: this,
|
|
294
210
|
thisType: this?.constructor?.name,
|
|
@@ -296,15 +212,15 @@ if (typeof targetObject[methodName] === 'function') {
|
|
|
296
212
|
timestamp: new Date().toISOString()
|
|
297
213
|
});
|
|
298
214
|
|
|
299
|
-
${
|
|
300
|
-
${
|
|
215
|
+
${t===`block`?`return undefined;`:``}
|
|
216
|
+
${n||``}
|
|
301
217
|
|
|
302
218
|
try {
|
|
303
219
|
const result = originalMethod.apply(this, args);
|
|
304
220
|
const endTime = performance.now();
|
|
305
221
|
const duration = (endTime - startTime).toFixed(2);
|
|
306
222
|
|
|
307
|
-
console.log(\`[Object Hook #\${callId}] ${
|
|
223
|
+
console.log(\`[Object Hook #\${callId}] ${e} result:\`, {
|
|
308
224
|
result: result,
|
|
309
225
|
resultType: typeof result,
|
|
310
226
|
duration: duration + 'ms'
|
|
@@ -312,14 +228,14 @@ if (typeof targetObject[methodName] === 'function') {
|
|
|
312
228
|
|
|
313
229
|
return result;
|
|
314
230
|
} catch (error) {
|
|
315
|
-
console.error(\`[Object Hook #\${callId}] ${
|
|
231
|
+
console.error(\`[Object Hook #\${callId}] ${e} error:\`, error);
|
|
316
232
|
throw error;
|
|
317
233
|
}
|
|
318
234
|
};
|
|
319
235
|
|
|
320
236
|
Object.setPrototypeOf(targetObject[methodName], originalMethod);
|
|
321
237
|
|
|
322
|
-
console.log('[Object Hook] Successfully hooked method: ${
|
|
238
|
+
console.log('[Object Hook] Successfully hooked method: ${e}');
|
|
323
239
|
}
|
|
324
240
|
else if (descriptor.get || descriptor.set) {
|
|
325
241
|
const originalGet = descriptor.get;
|
|
@@ -327,12 +243,12 @@ else if (descriptor.get || descriptor.set) {
|
|
|
327
243
|
|
|
328
244
|
Object.defineProperty(targetObject, methodName, {
|
|
329
245
|
get: function() {
|
|
330
|
-
console.log('[Object Hook] getter called: ${
|
|
246
|
+
console.log('[Object Hook] getter called: ${e}');
|
|
331
247
|
return originalGet ? originalGet.call(this) : undefined;
|
|
332
248
|
},
|
|
333
249
|
set: function(value) {
|
|
334
|
-
console.log('[Object Hook] setter called: ${
|
|
335
|
-
${
|
|
250
|
+
console.log('[Object Hook] setter called: ${e}', { value });
|
|
251
|
+
${t===`block`?`return;`:``}
|
|
336
252
|
if (originalSet) {
|
|
337
253
|
originalSet.call(this, value);
|
|
338
254
|
}
|
|
@@ -341,14 +257,10 @@ else if (descriptor.get || descriptor.set) {
|
|
|
341
257
|
enumerable: descriptor.enumerable
|
|
342
258
|
});
|
|
343
259
|
|
|
344
|
-
console.log('[Object Hook] Successfully hooked property: ${
|
|
260
|
+
console.log('[Object Hook] Successfully hooked property: ${e}');
|
|
345
261
|
}
|
|
346
262
|
})();
|
|
347
|
-
`.trim()
|
|
348
|
-
}
|
|
349
|
-
function generateAntiDebugBypass() {
|
|
350
|
-
return `
|
|
351
|
-
(function() {
|
|
263
|
+
`.trim()}function r(){return`(function() {
|
|
352
264
|
'use strict';
|
|
353
265
|
|
|
354
266
|
console.log('[Anti-Debug Bypass] Initializing...');
|
|
@@ -423,44 +335,39 @@ Object.defineProperty(window, 'devtools', {
|
|
|
423
335
|
});
|
|
424
336
|
|
|
425
337
|
console.log('[Anti-Debug Bypass] Successfully bypassed anti-debugging protections');
|
|
426
|
-
})()
|
|
427
|
-
`.trim();
|
|
428
|
-
}
|
|
429
|
-
function generateHookTemplate(targetName, targetType) {
|
|
430
|
-
if (targetType === "function") return `
|
|
338
|
+
})();`}function i(e,t){return t===`function`?`
|
|
431
339
|
(function() {
|
|
432
340
|
'use strict';
|
|
433
341
|
|
|
434
|
-
const original = ${
|
|
342
|
+
const original = ${e};
|
|
435
343
|
|
|
436
|
-
${
|
|
437
|
-
console.log('[Hook] ${
|
|
344
|
+
${e} = function(...args) {
|
|
345
|
+
console.log('[Hook] ${e} called:', args);
|
|
438
346
|
|
|
439
347
|
|
|
440
348
|
const result = original.apply(this, args);
|
|
441
|
-
console.log('[Hook] ${
|
|
349
|
+
console.log('[Hook] ${e} result:', result);
|
|
442
350
|
|
|
443
351
|
return result;
|
|
444
352
|
};
|
|
445
353
|
|
|
446
|
-
console.log('[Hook] Successfully hooked: ${
|
|
354
|
+
console.log('[Hook] Successfully hooked: ${e}');
|
|
447
355
|
})();
|
|
448
|
-
`.trim()
|
|
449
|
-
else if (targetType === "property") return `
|
|
356
|
+
`.trim():t===`property`?`
|
|
450
357
|
(function() {
|
|
451
358
|
'use strict';
|
|
452
359
|
|
|
453
|
-
const descriptor = Object.getOwnPropertyDescriptor(${
|
|
360
|
+
const descriptor = Object.getOwnPropertyDescriptor(${e.split(`.`).slice(0,-1).join(`.`)}, '${e.split(`.`).pop()}');
|
|
454
361
|
const originalGet = descriptor?.get;
|
|
455
362
|
const originalSet = descriptor?.set;
|
|
456
363
|
|
|
457
|
-
Object.defineProperty(${
|
|
364
|
+
Object.defineProperty(${e.split(`.`).slice(0,-1).join(`.`)}, '${e.split(`.`).pop()}', {
|
|
458
365
|
get: function() {
|
|
459
|
-
console.log('[Hook] ${
|
|
366
|
+
console.log('[Hook] ${e} get');
|
|
460
367
|
return originalGet ? originalGet.call(this) : undefined;
|
|
461
368
|
},
|
|
462
369
|
set: function(value) {
|
|
463
|
-
console.log('[Hook] ${
|
|
370
|
+
console.log('[Hook] ${e} set:', value);
|
|
464
371
|
if (originalSet) {
|
|
465
372
|
originalSet.call(this, value);
|
|
466
373
|
}
|
|
@@ -468,17 +375,16 @@ Object.defineProperty(${targetName.split(".").slice(0, -1).join(".")}, '${target
|
|
|
468
375
|
configurable: true
|
|
469
376
|
});
|
|
470
377
|
|
|
471
|
-
console.log('[Hook] Successfully hooked property: ${
|
|
378
|
+
console.log('[Hook] Successfully hooked property: ${e}');
|
|
472
379
|
})();
|
|
473
|
-
`.trim()
|
|
474
|
-
else return `
|
|
380
|
+
`.trim():`
|
|
475
381
|
(function() {
|
|
476
382
|
'use strict';
|
|
477
383
|
|
|
478
|
-
const original = ${
|
|
384
|
+
const original = ${e};
|
|
479
385
|
|
|
480
|
-
${
|
|
481
|
-
console.log('[Hook] ${
|
|
386
|
+
${e} = function(...args) {
|
|
387
|
+
console.log('[Hook] ${e} constructor called:', args);
|
|
482
388
|
|
|
483
389
|
const instance = new original(...args);
|
|
484
390
|
|
|
@@ -496,16 +402,11 @@ ${targetName} = function(...args) {
|
|
|
496
402
|
return instance;
|
|
497
403
|
};
|
|
498
404
|
|
|
499
|
-
${
|
|
405
|
+
${e}.prototype = original.prototype;
|
|
500
406
|
|
|
501
|
-
console.log('[Hook] Successfully hooked prototype: ${
|
|
407
|
+
console.log('[Hook] Successfully hooked prototype: ${e}');
|
|
502
408
|
})();
|
|
503
|
-
`.trim()
|
|
504
|
-
}
|
|
505
|
-
//#endregion
|
|
506
|
-
//#region src/modules/hook/HookGeneratorBuilders.core.generators.storage.ts
|
|
507
|
-
function generateLocalStorageHook(action, customCode, _condition, _performance = false) {
|
|
508
|
-
return `
|
|
409
|
+
`.trim()}function a(e,t,n,r=!1){return`
|
|
509
410
|
(function() {
|
|
510
411
|
'use strict';
|
|
511
412
|
|
|
@@ -526,8 +427,8 @@ Storage.prototype.setItem = function(key, value) {
|
|
|
526
427
|
stackTrace: stackTrace
|
|
527
428
|
});
|
|
528
429
|
|
|
529
|
-
${
|
|
530
|
-
${
|
|
430
|
+
${e===`block`?`return;`:``}
|
|
431
|
+
${t||``}
|
|
531
432
|
|
|
532
433
|
return originalSetItem.apply(this, arguments);
|
|
533
434
|
};
|
|
@@ -571,10 +472,7 @@ Storage.prototype.clear = function() {
|
|
|
571
472
|
|
|
572
473
|
console.log('[Storage Hook] Successfully hooked localStorage and sessionStorage');
|
|
573
474
|
})();
|
|
574
|
-
`.trim()
|
|
575
|
-
}
|
|
576
|
-
function generateCookieHook(action, customCode, _condition, _performance = false) {
|
|
577
|
-
return `
|
|
475
|
+
`.trim()}function o(e,t,n,r=!1){return`
|
|
578
476
|
(function() {
|
|
579
477
|
'use strict';
|
|
580
478
|
|
|
@@ -620,8 +518,8 @@ Object.defineProperty(document, 'cookie', {
|
|
|
620
518
|
stackTrace: stackTrace
|
|
621
519
|
});
|
|
622
520
|
|
|
623
|
-
${
|
|
624
|
-
${
|
|
521
|
+
${e===`block`?`return;`:``}
|
|
522
|
+
${t||``}
|
|
625
523
|
|
|
626
524
|
return originalSet.call(this, value);
|
|
627
525
|
},
|
|
@@ -630,10 +528,4 @@ Object.defineProperty(document, 'cookie', {
|
|
|
630
528
|
|
|
631
529
|
console.log('[Cookie Hook] Successfully hooked document.cookie');
|
|
632
530
|
})();
|
|
633
|
-
`.trim();
|
|
634
|
-
}
|
|
635
|
-
function getInjectionInstructions(type) {
|
|
636
|
-
return `This hook script monitors ${type} operations. Inject it into the target page via page_evaluate or console_execute to activate.`;
|
|
637
|
-
}
|
|
638
|
-
//#endregion
|
|
639
|
-
export { generateEvalHook as a, generateObjectMethodHook as c, generateAntiDebugBypass as i, ProcessRegistry as l, generateLocalStorageHook as n, generateFunctionHook as o, getInjectionInstructions as r, generateHookTemplate as s, generateCookieHook as t };
|
|
531
|
+
`.trim()}function s(e){return`This hook script monitors ${e} operations. Inject it into the target page via page_evaluate or console_execute to activate.`}export{t as a,n as c,r as i,a as n,e as o,s as r,i as s,o as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let e=0;function t(t){return`${t}-${Date.now().toString(36)}-${(++e).toString(36)}`}function n(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function r(e){let t=e.content.find(e=>e.type===`text`&&typeof e.text==`string`);if(!t)throw Error(`Expected JSON text payload from wrapped tool response`);let r;try{r=JSON.parse(t.text)}catch(e){throw Error(`Wrapped tool returned non-JSON text payload: ${e instanceof Error?e.message:String(e)}`,{cause:e})}if(!n(r))throw Error(`Wrapped tool returned JSON that is not an object`);return r}function i(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}var a=class{sessions=new Map;operations=new Map;artifacts=new Map;operationIndex=new Map;evidenceBridge;setEvidenceBridge(e){this.evidenceBridge=e}createSession(e){let n=t(`sess`),r={id:n,name:e,createdAt:Date.now(),operationCount:0,artifactCount:0,status:`active`};return this.sessions.set(n,r),this.operations.set(n,[]),this.artifacts.set(n,[]),r}destroySession(e){let t=this.sessions.get(e);if(!t)throw Error(`Session "${e}" not found`);t.status=`destroyed`;let n=this.operations.get(e)??[];for(let e of n)e.status===`active`&&(e.status=`completed`)}listSessions(){return[...this.sessions.values()].filter(e=>e.status===`active`)}getSession(e){return this.sessions.get(e)}registerOperation(e,n,r,i){let a=this.sessions.get(e);if(!a)throw Error(`Session "${e}" not found`);if(a.status===`destroyed`)throw Error(`Session "${e}" is destroyed — cannot register new operations`);let o=t(`op`),s={id:o,sessionId:e,type:n,target:r,config:i,createdAt:Date.now(),status:`active`},c=this.operations.get(e);return c.push(s),this.operationIndex.set(o,e),a.operationCount=c.length,this.evidenceBridge?.onOperation(s),s}getSessionOperations(e){return this.operations.get(e)??[]}recordArtifact(e,t){let n=this.operationIndex.get(e);if(!n)throw Error(`Operation "${e}" not found`);let r=(this.operations.get(n)??[]).find(t=>t.id===e);if(!r)throw Error(`Operation "${e}" metadata missing`);let i={operationId:e,sessionId:n,type:r.type,timestamp:Date.now(),data:t},a=this.artifacts.get(n);a.push(i);let o=this.sessions.get(n);return o.artifactCount=a.length,this.evidenceBridge?.onArtifact(i),i}getArtifacts(e,t){let n=this.artifacts.get(e)??[];return t?n.filter(e=>e.type===t):n}getSessionSnapshot(e){let t=this.sessions.get(e);if(t)return{session:t,stats:this.getSessionStats(e),operations:[...this.getSessionOperations(e)],artifacts:[...this.getArtifacts(e)]}}listSessionSnapshots(){return this.listSessions().map(e=>({session:e,stats:this.getSessionStats(e.id),operations:[...this.getSessionOperations(e.id)],artifacts:[...this.getArtifacts(e.id)]}))}async applyHookPreset(e,t,r){let a=i(r.presets),o=(typeof r.preset==`string`?r.preset:void 0)??(a.length>0?a.join(`, `):`hook_preset`);return this.executeTrackedTool({sessionId:e,type:`runtime-hook`,target:o,config:{...r},invoke:()=>t.handleHookPreset(r),isSuccessful:e=>i(e.injected).length>0,buildArtifacts:e=>{let t=i(e.injected);return[{presetIds:t,failedPresets:Array.isArray(e.failed)?e.failed.filter(e=>n(e)&&typeof e.preset==`string`&&typeof e.error==`string`):[],injectionPoint:e.method===`evaluateOnNewDocument`?`before-load`:`runtime`,scriptContent:t.join(`, `),body:e}]}})}async replayNetworkRequest(e,t,r){let i=typeof r.requestId==`string`?r.requestId:`network_replay`,a=typeof r.urlOverride==`string`?r.urlOverride:void 0;return this.executeTrackedTool({sessionId:e,type:`network-intercept`,target:i,config:{...r},invoke:()=>t.handleNetworkReplayRequest(r),buildArtifacts:e=>e.dryRun===!0&&n(e.preview)?[{requestId:i,url:typeof e.preview.url==`string`?e.preview.url:a,method:typeof e.preview.method==`string`?e.preview.method:void 0,headers:n(e.preview.headers)?e.preview.headers:void 0,body:e.preview.body,replayMode:`dry-run`}]:[{requestId:typeof e.requestId==`string`?e.requestId:i,url:a,method:typeof r.methodOverride==`string`?r.methodOverride:void 0,headers:n(e.headers)?e.headers:void 0,body:e.body,statusCode:typeof e.status==`number`?e.status:void 0,statusText:typeof e.statusText==`string`?e.statusText:void 0,bodyTruncated:typeof e.bodyTruncated==`boolean`?e.bodyTruncated:void 0,replayMode:`live`}]})}getSessionStats(e){let t=this.sessions.get(e);return t?{operationCount:t.operationCount,artifactCount:t.artifactCount}:{operationCount:0,artifactCount:0}}findOperation(e){let t=this.operationIndex.get(e);if(t)return(this.operations.get(t)??[]).find(t=>t.id===e)}setOperationStatus(e,t){let n=this.findOperation(e);n&&(n.status=t)}async executeTrackedTool(e){let t=this.registerOperation(e.sessionId,e.type,e.target,e.config);try{let n=r(await e.invoke());if(!(e.isSuccessful?e.isSuccessful(n):n.success!==!1))return this.setOperationStatus(t.id,`failed`),{operation:t,artifacts:[],payload:n};let i=(e.buildArtifacts?.(n)??[]).map(e=>this.recordArtifact(t.id,e));return this.setOperationStatus(t.id,`completed`),{operation:t,artifacts:i,payload:n}}catch(e){throw this.setOperationStatus(t.id,`failed`),e}}};export{a as InstrumentationSessionManager};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./chunk-C_pMuVsO.mjs";import{t}from"./logger-sBC6IdRT.mjs";import{$n as n,Bn as r,Fn as i,Gn as a,Hn as o,In as s,Jn as c,Kn as l,Ln as u,Pn as d,Qn as f,Rn as p,Un as m,Vn as h,Wn as g,Xn as _,Yn as v,Zn as y,a as b,ar as x,cr as S,dr as C,er as ee,fr as te,hr as ne,ir as re,nr as ie,or as ae,pr as w,qn as T,rr as oe,sr as E,tr as D,ur as O,zn as se}from"./constants-Cp6hBrrx.mjs";import{r as k}from"./response-C7rKQst4.mjs";import{c as A,d as ce,f as le,i as ue,l as de,n as j,p as M,r as N,s as P,t as F}from"./ToolCatalog-D_IKl1Hu.mjs";import{t as I}from"./ProcessRegistry-Hf12LlR9.mjs";import{t as L}from"./search-defaults-D2bY-rzH.mjs";import{Worker as R}from"worker_threads";function z(e,t){return P(e,t)}function B(e,n,r,i){if(fe(e,n),r<=0)return;let a=r*60*1e3,o=new Set(i),s=setTimeout(()=>{t.info(`Domain "${n}" TTL expired (${r}min) — auto-deactivating ${o.size} tools`),U(e,n).catch(e=>{t.error(`Failed to deactivate domain "${n}" on TTL expiry:`,e)})},a);e.domainTtlEntries.set(n,{timer:s,ttlMs:a,toolNames:o})}function V(e,n){let r=e.domainTtlEntries.get(n);if(!r)return;clearTimeout(r.timer);let i=r.ttlMs/6e4;r.timer=setTimeout(()=>{t.info(`Domain "${n}" TTL expired (${i}min) — auto-deactivating`),U(e,n).catch(e=>{t.error(`Failed to deactivate domain "${n}" on TTL expiry:`,e)})},r.ttlMs)}function H(e,t){let n=N(t);if(!n){let r=e.extensionToolsByName.get(t);r&&(n=r.domain)}n&&e.domainTtlEntries.has(n)&&V(e,n)}function fe(e,t){let n=e.domainTtlEntries.get(t);n&&(clearTimeout(n.timer),e.domainTtlEntries.delete(t))}async function U(e,n){let r=e.domainTtlEntries.get(n);if(!r)return;let i=r.toolNames;e.domainTtlEntries.delete(n);let a=0;for(let n of i){if(!e.activatedToolNames.has(n))continue;let r=e.activatedRegisteredTools.get(n);if(r)try{r.remove()}catch(e){t.warn(`Failed to remove tool "${n}" on domain TTL expiry:`,e)}e.router.removeHandler(n),e.activatedToolNames.delete(n),e.activatedRegisteredTools.delete(n);let i=e.extensionToolsByName.get(n);i&&(i.registeredTool=void 0),a++}if(a>0){e.enabledDomains.delete(n);for(let t of e.activatedToolNames)if(N(t)===n){e.enabledDomains.add(n);break}for(let t of e.selectedTools)if(N(t.name)===n){e.enabledDomains.add(n);break}try{await e.server.sendToolListChanged()}catch(e){t.warn(`sendToolListChanged failed after domain TTL expiry:`,e)}t.info(`Domain "${n}" deactivated: removed ${a} tools`)}}const pe=[[`navigate`,`go`,`open`,`visit`,`browse`,`load`],[`intercept`,`capture`,`monitor`,`sniff`,`collect`,`record`,`track`],[`request`,`fetch`,`xhr`,`ajax`,`http`,`api`],[`authenticate`,`auth`,`login`,`credential`,`token`,`jwt`,`session`],[`breakpoint`,`pause`,`halt`,`stop`,`break`],[`step`,`next`,`continue`,`resume`],[`deobfuscate`,`beautify`,`unminify`,`decode`,`transform`,`decompile`],[`screenshot`,`snapshot`,`image`,`picture`,`photo`],[`evaluate`,`execute`,`run`,`eval`,`invoke`,`call`],[`element`,`node`,`selector`,`dom`,`component`],[`click`,`tap`,`press`,`interact`,`trigger`],[`type`,`input`,`enter`,`fill`,`write`],[`cookie`,`localstorage`,`storage`,`cache`,`indexeddb`],[`websocket`,`ws`,`socket`,`realtime`],[`scroll`,`swipe`,`drag`],[`search`,`find`,`query`,`lookup`,`discover`,`locate`],[`hook`,`patch`,`override`,`replace`,`wrap`,`proxy`],[`script`,`code`,`source`,`javascript`,`js`],[`bundle`,`webpack`,`module`,`pack`,`chunk`],[`block`,`filter`,`deny`,`reject`,`prevent`],[`allow`,`permit`,`whitelist`,`accept`,`enable`],[`remove`,`delete`,`clear`,`clean`,`purge`,`erase`],[`list`,`show`,`display`,`enumerate`,`get`],[`set`,`configure`,`config`,`setup`,`assign`],[`stealth`,`antidetect`,`fingerprint`,`evasion`,`undetected`],[`mobile`,`device`,`emulate`,`responsive`,`phone`],[`performance`,`profile`,`benchmark`,`metric`,`vitals`],[`register`,`signup`,`account`,`enroll`,`join`],[`captcha`,`challenge`,`verification`,`verify`,`solve`],[`tab`,`window`,`page`],[`inspect`,`examine`,`analyze`,`analyse`,`debug`,`investigate`],[`wait`,`delay`,`sleep`,`timeout`,`poll`],[`close`,`disconnect`,`quit`,`exit`,`shutdown`,`terminate`],[`traffic`,`network`,`request`,`response`,`connection`],[`heap`,`memory`,`allocation`,`gc`,`garbage`],[`export`,`save`,`dump`,`download`,`extract`],[`replay`,`resend`,`repeat`,`redo`,`retry`],[`variable`,`scope`,`local`,`closure`,`context`],[`watch`,`observe`,`monitor`,`trace`,`track`],[`protobuf`,`proto`,`binary`,`msgpack`,`grpc`],[`wasm`,`webassembly`,`assembly`],[`sse`,`eventsource`,`stream`,`streaming`],[`graphql`,`gql`,`introspect`,`mutation`,`subscription`],[`v8`,`heap`,`snapshot`,`bytecode`,`jit`,`turbofan`,`ignition`,`hiddenclass`],[`tls`,`ssl`,`boringssl`,`cert`,`certificate`,`pinning`,`handshake`,`keylog`],[`skia`,`gpu`,`render`,`scenegraph`,`scene`,`draw`,`paint`,`raster`,`layer`],[`frida`,`ghidra`,`ida`,`unidbg`,`jadx`,`binary`,`disassemble`,`decompile`,`instrument`],[`mojo`,`ipc`,`chromium`,`interface`,`broker`,`message`],[`syscall`,`etw`,`strace`,`dtrace`,`kernel`,`systemcall`,`tracefs`],[`adb`,`android`,`webview`,`apk`,`dalvik`,`art`,`emulator`],[`extension`,`plugin`,`addon`,`webhook`,`c2`,`bluetooth`,`ble`,`hid`,`serial`,`registry`]];var me=class e{reverseMap;constructor(){this.reverseMap=e.buildReverseMap(pe)}expand(e){let t=this.reverseMap.get(e.toLowerCase());return t?[...t]:[]}expandQuery(e){let t=new Set(e.map(e=>e.toLowerCase())),n=[],r=ee;for(let i of e){let e=this.reverseMap.get(i.toLowerCase());if(!e)continue;let a=0;for(let i of e){if(a>=r)break;t.has(i)||(n.push(i),t.add(i),a++)}}return n}static buildReverseMap(e){let t=new Map;for(let n of e)for(let e of n){let r=e.toLowerCase(),i=t.get(r);i||(i=new Set,t.set(r,i));for(let e of n){let t=e.toLowerCase();t!==r&&i.add(t)}}return t}};const he=p,ge=u;var _e=class e{queryCategoryProfiles;cjkQueryAliases;synonymExpander;constructor(t){this.queryCategoryProfiles=t?.queryCategoryProfiles===void 0?e.compileQueryCategoryProfiles(L.queryCategoryProfiles):e.compileQueryCategoryProfiles(t.queryCategoryProfiles),this.cjkQueryAliases=t?.cjkQueryAliases===void 0?e.compileCjkQueryAliasRules(L.cjkQueryAliases):e.compileCjkQueryAliasRules(t.cjkQueryAliases),this.synonymExpander=new me}static compileQueryCategoryProfiles(e){return e.flatMap(e=>{if(!e||typeof e.pattern!=`string`||!Array.isArray(e.domainBoosts))return[];let t;try{t=new RegExp(e.pattern,e.flags)}catch{return[]}let n=new Map(e.domainBoosts.flatMap(e=>!e||typeof e.domain!=`string`||e.domain.length===0||typeof e.weight!=`number`||!Number.isFinite(e.weight)?[]:[[e.domain,e.weight]]));return[{pattern:t,domainBoosts:n}]})}static compileCjkQueryAliasRules(e){return e.flatMap(e=>{if(!e||typeof e.pattern!=`string`||!Array.isArray(e.tokens))return[];let t;try{t=new RegExp(e.pattern,e.flags)}catch{return[]}let n=e.tokens.filter(e=>typeof e==`string`&&e.length>0);return[{pattern:t,tokens:n}]})}detectQueryCategoryBoosts(e){let t=new Map;for(let n of this.queryCategoryProfiles)if(n.pattern.test(e))for(let[e,r]of n.domainBoosts){let n=t.get(e)??1;t.set(e,Math.max(n,r))}return t}expandCjkAliasTokens(e){let t=e.toLowerCase(),n=new Set;for(let e of this.cjkQueryAliases)if(e.pattern.test(t))for(let t of e.tokens)n.add(t);return[...n]}tokenise(e,t){let n=e.replace(/[_-]/g,` `);n=n.replace(/([\u4e00-\u9fff])/g,` $1 `);let r=n.split(/[^a-zA-Z0-9\u4e00-\u9fff]+/).filter(Boolean),i=[];for(let e of r){let t=e.toLowerCase(),n=e.replace(/([a-z])([A-Z])/g,`$1 $2`).split(/\s+/);if(n.length>1){for(let e of n)i.push(e.toLowerCase());i.push(t)}else i.push(t)}return i.push(...this.expandCjkAliasTokens(e)),t?.expandSynonyms&&i.push(...this.synonymExpander.expandQuery(i)),i}getK1(){return he}getB(){return ge}},ve=class{worker=null;ready=!1;nextId=0;pending=new Map;isReady(){return this.ready}async embed(e){this.ensureWorker();let t=this.nextId++;return new Promise((n,r)=>{this.pending.set(t,{resolve:n,reject:r}),this.worker.postMessage({type:`embed`,id:t,text:e})})}async embedBatch(e){if(e.length===0)return[];this.ensureWorker();let t=this.nextId++;return new Promise((n,r)=>{this.pending.set(t,{resolve:n,reject:r}),this.worker.postMessage({type:`embed_batch`,id:t,texts:e})})}async terminate(){if(this.worker){for(let[,e]of this.pending)e.reject(Error(`EmbeddingEngine terminated`));this.pending.clear(),await this.worker.terminate(),this.worker=null,this.ready=!1}}ensureWorker(){if(this.worker)return;let e=new URL(`./EmbeddingWorker.js`,import.meta.url);this.worker=new R(e),typeof this.worker.unref==`function`&&this.worker.unref(),I.register(this.worker),this.worker.on(`message`,e=>{let t=this.pending.get(e.id);t&&(this.pending.delete(e.id),e.type===`result`?(this.ready=!0,t.resolve(e.embedding)):e.type===`error`&&t.reject(Error(e.message??`Unknown worker error`)))}),this.worker.on(`error`,e=>{for(let[,t]of this.pending)t.reject(e);this.pending.clear(),this.worker=null,this.ready=!1}),this.worker.on(`exit`,e=>{if(e!==0){let t=Error(`Embedding worker exited with code ${e}`);for(let[,e]of this.pending)e.reject(t);this.pending.clear()}this.worker=null,this.ready=!1})}},W=class e{compiledRules;constructor(t){this.compiledRules=t===void 0?e.compileIntentToolBoostRules(L.intentToolBoostRules):e.compileIntentToolBoostRules(t)}static compileIntentToolBoostRules(e){let t=[];for(let n of e){if(!n||typeof n.pattern!=`string`||!Array.isArray(n.boosts)||n.boosts.length===0)continue;let e;try{e=new RegExp(n.pattern,n.flags??`i`)}catch{continue}let r=n.boosts.filter(e=>e&&typeof e.tool==`string`&&e.tool.length>0).map(e=>({tool:e.tool,bonus:Number.isFinite(e.bonus)?e.bonus:0})).filter(e=>e.bonus>0);r.length!==0&&t.push({pattern:e,boosts:r})}return t}resolveIntentToolBonuses(e){let t=e.toLowerCase(),n=new Map;for(let e of this.compiledRules)if(e.pattern.test(t))for(let{tool:t,bonus:r}of e.boosts){let e=n.get(t)??0;n.set(t,Math.max(e,r))}return n}getCompiledRules(){return this.compiledRules}},ye=class e{trigramSets;constructor(t){this.trigramSets=t.map(t=>e.extractTrigrams(t))}search(t,n=x){let r=e.extractTrigrams(t);if(r.size===0)return new Map;let i=new Map;for(let t=0;t<this.trigramSets.length;t++){let a=this.trigramSets[t];if(a.size===0)continue;let o=e.jaccardSimilarity(r,a);o>=n&&i.set(t,o)}return i}static extractTrigrams(e){let t=e.toLowerCase().replace(/[_\-\s]+/g,``),n=new Set;for(let e=0;e<=t.length-3;e++)n.add(t.slice(e,e+3));return n}static jaccardSimilarity(e,t){let n=0,[r,i]=e.size<=t.size?[e,t]:[t,e];for(let e of r)i.has(e)&&n++;let a=e.size+t.size-n;return a===0?0:n/a}};const G=.1,K=.8;var be=class{vectorWeight;lastVectorRanking=null;topN;learnUp;learnDown;constructor(e){this.vectorWeight=e?.vectorCosineWeight??S,this.topN=Math.max(1,te),this.learnUp=Math.max(0,w),this.learnDown=Math.max(0,C)}getVectorWeight(){return this.vectorWeight}recordVectorRanking(e){this.lastVectorRanking=e}recordToolCallFeedback(e,t){if(!this.lastVectorRanking||!t)return!1;let n=this.lastVectorRanking.get(e),r=this.vectorWeight;return n===void 0?this.vectorWeight=Math.max(G,this.vectorWeight-this.learnDown):n<this.topN?this.vectorWeight=Math.min(K,this.vectorWeight+this.learnUp):n<this.topN*2?this.vectorWeight=Math.min(K,this.vectorWeight+this.learnUp*.3):this.vectorWeight=Math.max(G,this.vectorWeight-this.learnDown),this.vectorWeight!==r}};const xe=new Set(`the.a.an.is.are.was.were.be.been.to.of.in.for.on.with.at.by.from.or.and.not.this.that.it.its.if.as.will.can.may.must.should.would.could.e.g.default.optional.required.when.set`.split(`.`)),q={extractParamTokens(e){let t=[];if(!e||typeof e!=`object`)return t;let n=e.properties;if(!n||typeof n!=`object`)return t;for(let[e,r]of Object.entries(n)){let n=e.replace(/([a-z])([A-Z])/g,`$1 $2`).split(/[\s_-]+/);for(let e of n){let n=e.toLowerCase();n.length>1&&t.push(n)}if(r&&typeof r==`object`){let e=r.description;if(typeof e==`string`){let n=e.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean);for(let e of n)e.length>2&&!xe.has(e)&&t.push(e)}}}return t},extractShortDescription(e){if(!e)return``;let t=e.match(/^[^.!?\n]+[.!?]?/);if(t){let e=t[0].trim();return e.length>120?e.slice(0,117)+`...`:e}return e.length>120?e.slice(0,117)+`...`:e},containsCJK(e){return/[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af]/.test(e)},normalizeToolName(e){return e.toLowerCase().replace(/[\s-]+/g,`_`)}};function J(e,t,n){if(!t)return-1;let r=e.indexOf(t);for(;r>=0;){let i=r>0?e[r-1]:null,a=r+t.length<e.length?e[r+t.length]:null,o=i===null||!n.test(i),s=a===null||!n.test(a);if(o&&s)return r;r=e.indexOf(t,r+1)}return-1}function Se(e){let t=new Map,n=new Map;for(let t=0;t<e.length;t++){let r=e[t].name,i=r.indexOf(`_`);if(i<=0)continue;let a=r.slice(0,i),o=n.get(a)??[];o.push(t),n.set(a,o)}for(let[,e]of n){if(e.length<2||e.length>15)continue;let n=d/Math.sqrt(e.length);for(let r of e){let i=t.get(r)??[];for(let t of e)t!==r&&i.push({docIndex:t,weight:n});t.set(r,i)}}return t}function Ce(e){let t=[];for(let n=0;n<e.length;n++)e[n]>0&&t.push({idx:n,score:e[n]});t.sort((e,t)=>t.score-e.score);let n=new Map;for(let e=0;e<t.length;e++)n.set(t[e].idx,e);return n}function Y(e){let t=[...e.entries()].toSorted((e,t)=>t[1]-e[1]),n=new Map;for(let e=0;e<t.length;e++)n.set(t[e][0],e);return n}function we(e,t){for(let n=0;n<e.length;n++){let r=t[n];r<=0||(e[n]=e[n]+r*f*_)}}function Te(e){let{scores:t,docs:n,affinityGraph:r}=e,a=[];for(let e=0;e<t.length;e++)t[e]>0&&a.push({idx:e,score:t[e]});if(a.length!==0){if(a.sort((e,t)=>t.score-e.score),r.size>0){let e=Math.min(s,a.length);for(let n=0;n<e;n++){let{idx:e,score:o}=a[n],s=r.get(e);if(!s)continue;let c=1/(1+n);for(let{docIndex:e,weight:n}of s)t[e]>0&&(t[e]+=o*n*c*i)}}if(o>0&&a.length>=o){let e=a.slice(0,10),r=new Map;for(let{idx:t}of e){let e=n[t].domain;e&&r.set(e,(r.get(e)??0)+1)}for(let[e,i]of r)if(!(i<o))for(let r=0;r<n.length;r++)t[r]>0&&n[r].domain===e&&(t[r]*=h)}}}function Ee(e,t,n,r){return`${`${e}\0${t}`}${!n||n.size===0?``:`\0${[...n].toSorted().join(`|`)}`}${r?`\0${r}`:``}`}var De=class{capacity;map=new Map;constructor(e){this.capacity=Math.max(1,e)}get(e){let t=this.map.get(e);return t!==void 0&&(this.map.delete(e),this.map.set(e,t)),t}set(e,t){if(this.map.delete(e),this.map.set(e,t),this.map.size>this.capacity){let e=this.map.keys().next().value;this.map.delete(e)}}clear(){this.map.clear()}},Oe=class{docs=[];invertedIndex=new Map;sortedKeys;avgDocLength;docCount;domainOverrides;domainScoreMultipliers;toolScoreMultipliers;extensionEtag=``;docNameIndex=new Map;affinityGraph;queryCache;trigramIndex;embeddingEngine;toolEmbeddings=null;feedbackTracker;recencyTracker=new Map;bm25Scorer;intentBoost;constructor(e,t,r,i,a,o){let s=e??F;this.domainOverrides=t,this.domainScoreMultipliers=r,this.toolScoreMultipliers=i,this.docCount=s.length,this.bm25Scorer=new _e(a);let c=a?.vectorEnabled??O;this.embeddingEngine=c?new ve:null,this.feedbackTracker=new be(a),this.intentBoost=new W(a?.intentToolBoostRules);let u=0;for(let e=0;e<s.length;e++){let t=s[e],r=this.domainOverrides?.get(t.name)??N(t.name),i=t.description??``,a=q.extractShortDescription(i),c=this.bm25Scorer.tokenise(t.name),l=new Set(c),d=r?this.bm25Scorer.tokenise(r):[],f=this.bm25Scorer.tokenise(i),p=q.extractParamTokens(t.inputSchema),m=[...c,...d,...f,...p],h={name:t.name,domain:r,description:i,shortDescription:a,tokens:m,length:m.length,nameTokens:c,nameTokenSet:l,nameTokenCount:l.size};this.docs.push(h),this.docNameIndex.set(t.name,e),u+=h.length;let _=new Map;for(let e of c){let t=_.get(e)??{tf:0,weight:0};t.tf++,t.weight=Math.max(t.weight,3),_.set(e,t)}for(let e of d){let t=_.get(e)??{tf:0,weight:0};t.tf++,t.weight=Math.max(t.weight,2),_.set(e,t)}for(let e of f){let t=_.get(e)??{tf:0,weight:0};t.tf++,t.weight=Math.max(t.weight,1),_.set(e,t)}for(let e of p){let t=_.get(e)??{tf:0,weight:0};t.tf++,t.weight=Math.max(t.weight,g),_.set(e,t)}let v=o?.get(t.name);if(v)for(let e of v){let t=_.get(e)??{tf:0,weight:0};t.tf++,t.weight=Math.max(t.weight,n),_.set(e,t)}for(let[t,{tf:n,weight:r}]of _){let i=this.invertedIndex.get(t);i||(i=[],this.invertedIndex.set(t,i)),i.push({docIndex:e,tf:n,weight:r})}}this.avgDocLength=this.docCount>0?u/this.docCount:1,this.sortedKeys=[...this.invertedIndex.keys()].toSorted(),this.affinityGraph=Se(this.docs),this.trigramIndex=new ye(this.docs.map(e=>e.name)),this.queryCache=new De(l)}async search(e,t=10,n,i,o){let s=this.bm25Scorer.tokenise(e);if(s.length===0)return[];if(s.length>6){let e=s.filter(e=>this.invertedIndex.has(e));if(e.length>=3){let t=e.map(e=>{let t=this.invertedIndex.get(e).length;return{token:e,idf:Math.log((this.docCount-t+.5)/(t+.5)+1)}});t.sort((e,t)=>t.idf-e.idf);let n=new Set(t.slice(0,6).map(e=>e.token));s=s.filter(e=>n.has(e))}}let c=this.bm25Scorer.tokenise(s.join(` `),{expandSynonyms:!0}).filter(e=>!s.includes(e));s.push(...c);let l=(()=>{let t=e.toLowerCase();if(!/(?:\b(?:call|use|run|invoke|execute)\b|调用|执行|使用|运行)/i.test(t))return null;let n=/[a-z0-9_]/,r=/[a-z0-9]/,i=null,a=1/0;for(let e of this.docNameIndex.keys()){let o=J(t,e,n);o<0&&e.includes(`_`)&&(o=J(t,e.replace(/_/g,`-`),r),o<0&&(o=J(t,e.replace(/_/g,` `),r))),!(o<0)&&(o<a||o===a&&e.length>(i?.length??0))&&(i=e,a=o)}return i})(),u=Ee(e,t,i,this.extensionEtag),d=this.queryCache.get(u);if(d&&this.isCachedEntryFresh(d)){let e=n??new Set;return d.results.map(t=>({...t,isActive:e.has(t.name)}))}let f=this.intentBoost.resolveIntentToolBonuses(e),p=new Float64Array(this.docCount);for(let e of s)if(this.scoreToken(e,p),e.length>=3){let t=this.findPrefixMatches(e);for(let n of t)if(n!==e){let e=this.invertedIndex.get(n);e&&this.scorePostings(e,this.docCount,p,a)}}await this.applyRRFFusion(s,e,p);let h=this.bm25Scorer.detectQueryCategoryBoosts(e),g=e.toLowerCase().replace(/[\s-]+/g,`_`),_=new Set(s);for(let e=0;e<this.docCount;e++){let t=this.docs[e],n=f.get(t.name)??0;if(p[e]<=0&&n<=0)continue;if(t.name===g){p[e]*=m;continue}let i=0;for(let e of s)t.nameTokenSet.has(e)&&i++;if(i>0&&t.nameTokenCount>0&&_.size>0){let n=i/t.nameTokenCount,a=i/_.size;p[e]*=1+r*n*a}let a=t.domain?this.domainScoreMultipliers?.get(t.domain)??1:1;if(a!==1&&(p[e]*=a),t.domain&&h.size>0){let n=h.get(t.domain);n!==void 0&&n>1&&(p[e]*=n)}let o=this.toolScoreMultipliers?.get(t.name)??1;o!==1&&(p[e]*=o)}if(this.applyIntentBonusBand(p,f),this.applyGraphExpansion(p),this.applyRecencyBoost(p),this.applyTierPenalty(p,i,o),l){let e=this.docNameIndex.get(l);if(e!==void 0){let t=0;for(let e=0;e<this.docCount;e++){let n=p[e];n>t&&(t=n)}let n=Math.max(1,t+1);p[e]+=n}}let v=n??new Set,y=[];for(let e=0;e<this.docCount;e++)if(p[e]>0){let t=this.docs[e];y.push({name:t.name,domain:t.domain,shortDescription:t.shortDescription,score:Math.round(p[e]*1e3)/1e3,isActive:v.has(t.name)})}y.sort((e,t)=>t.score-e.score);let b=y.slice(0,t);return this.queryCache.set(u,{results:b,vectorWeightAtCache:this.feedbackTracker.getVectorWeight(),cachedAtMs:Date.now()}),b}isCachedEntryFresh(e){let t=this.feedbackTracker.getVectorWeight();return Math.abs(t-e.vectorWeightAtCache)<=se}applyRecencyBoost(e){if(T<=0||this.recencyTracker.size===0)return;let t=v;if(t<=0)return;let n=Date.now(),r=T;for(let[i,a]of this.recencyTracker){let o=n-a;if(o<0||o>t)continue;let s=this.docNameIndex.get(i);if(s===void 0||e[s]<=0)continue;let c=1+r*(1-o/t);e[s]*=c}}applyTierPenalty(e,t,n){if(!t||t.size===0)return;let r=n?n===`full`?ie:n===`workflow`?re:oe:D;if(!(r>=1||r<=0))for(let n=0;n<this.docCount;n++){if(e[n]<=0)continue;let i=this.docs[n].domain;i&&(t.has(i)||(e[n]*=r))}}getDomainSummary(){let e=new Map;for(let t of this.docs){let n=e.get(t.domain)??[];n.push(t.name),e.set(t.domain,n)}return Array.from(e.entries()).map(([e,t])=>({domain:e,count:t.length,tools:t})).toSorted((e,t)=>t.count-e.count)}scoreToken(e,t){let n=this.invertedIndex.get(e);n&&this.scorePostings(n,this.docCount,t,1)}findPrefixMatches(e){let t=this.sortedKeys,n=0,r=t.length;for(;n<r;){let i=n+r>>>1;t[i]<e?n=i+1:r=i}let i=[];for(;n<t.length&&t[n].startsWith(e);)i.push(t[n]),n++;return i}scorePostings(e,t,n,r){let i=e.length,a=Math.log((this.docCount-i+.5)/(i+.5)+1),o=u,s=p;for(let{docIndex:t,tf:i,weight:c}of e){let e=this.docs[t],l=1-o+o*(e.length/this.avgDocLength),u=i*(s+1)/(i+s*l);n[t]+=a*u*c*r}}async applyRRFFusion(e,t,n){let r=y,i=ae,a=Ce(n),o=Y(this.trigramIndex.search(t,x)),s,c;if(E>0&&a.size>0){let e=[...a.entries()].find(([,e])=>e===0)?.[0];(e===void 0?0:n[e])>=E?(s=new Map,c=new Map):(s=await this.computeVectorCosineScores(t),c=Y(s))}else s=await this.computeVectorCosineScores(t),c=Y(s);let l=new Map;for(let[e,t]of c)l.set(this.docs[e].name,t);this.feedbackTracker.recordVectorRanking(l);let u=new Float64Array(this.docCount);for(let e=0;e<this.docCount;e++){let t=0,n=a.get(e);n!==void 0&&(t+=1/(r+n));let s=o.get(e);s!==void 0&&i>0&&(t+=i*(1/(r+s)));let l=c.get(e);l!==void 0&&this.feedbackTracker.getVectorWeight()>0&&(t+=this.feedbackTracker.getVectorWeight()*(1/(r+l))),u[e]=t}we(n,u)}async ensureToolEmbeddings(){if(this.toolEmbeddings||!this.embeddingEngine)return;let e=this.docs.map(e=>`${e.name.replace(/_/g,` `)}: ${e.description}`);this.toolEmbeddings=await this.embeddingEngine.embedBatch(e)}async computeVectorCosineScores(e){if(!this.embeddingEngine)return new Map;try{await this.ensureToolEmbeddings()}catch{return new Map}if(!this.toolEmbeddings)return new Map;let t;try{t=await this.embeddingEngine.embed(e)}catch{return new Map}let n=new Map;for(let e=0;e<this.toolEmbeddings.length;e++){let r=this.toolEmbeddings[e],i=0;for(let e=0;e<t.length;e++)i+=t[e]*r[e];i>0&&n.set(e,i)}return n}recordToolCallFeedback(e,t){for(this.feedbackTracker.recordToolCallFeedback(e,!!this.embeddingEngine),this.recencyTracker.delete(e),this.recencyTracker.set(e,Date.now());this.recencyTracker.size>c;){let e=this.recencyTracker.keys().next().value;if(e===void 0)break;this.recencyTracker.delete(e)}}applyIntentBonusBand(e,t){if(t.size===0)return;let n=0;for(let t=0;t<this.docCount;t++)n=Math.max(n,e[t]);let r=0;for(let e of t.values())r=Math.max(r,e);if(r<=0)return;let i=Math.max(1,n+1),a=[...new Set([...t.values()].filter(e=>e>0))].toSorted((e,t)=>e-t),o=new Map;for(let e=0;e<a.length;e++)o.set(a[e],e+1);for(let[n,r]of t){if(r<=0)continue;let t=this.docNameIndex.get(n);if(t===void 0)continue;let a=o.get(r);a!==void 0&&(e[t]+=i*a)}}applyGraphExpansion(e){Te({scores:e,docs:this.docs,affinityGraph:this.affinityGraph})}};function X(e){let t=new Set(e.selectedTools.map(e=>e.name));for(let n of e.activatedToolNames)t.add(n);return t}function ke(e){let t=new Set(j(e.baseTier));for(let n of e.enabledDomains)t.add(n);for(let n of e.extensionToolsByName.values())t.add(n.domain);for(let n of X(e)){let r=e.extensionToolsByName.get(n)?.domain;if(r){t.add(r);continue}let i=N(n);i&&t.add(i)}return t}function Ae(e){return e.baseTier}function je(e){let t=new Map;for(let n of e.extensionToolsByName.values())t.set(n.name,n.domain);return t}async function Z(e){await A();let t=new Map(F.map(e=>[e.name,e]));for(let n of e.extensionToolsByName.values())t.set(n.name,n.tool);return[...t.values()]}async function Me(e){return new Map((await Z(e)).map(e=>[e.name,e]))}const Q=new WeakMap;function Ne(){let e=new Map;for(let t of le())if(t.sceneKeywords)for(let[n,r]of Object.entries(t.sceneKeywords))r.length>0&&e.set(n,r);return e}function Pe(e){let t=[];for(let[n,r]of e.extensionToolsByName)t.push(`${n}:${r.domain}`);return t.sort(),[e.extensionWorkflowRuntimeById.size,t.join(`|`)].join(`::`)}async function Fe(e){await A();let t=Pe(e),n=Q.get(e);if(n?.signature===t)return n.engine;let r=await Z(e),i=je(e),a=new Map,o=new Map;for(let t of e.extensionToolsByName.values())o.set(t.name,1.12);e.extensionWorkflowRuntimeById.size>0&&(a.set(`workflow`,ne),o.set(`run_extension_workflow`,1.35),o.set(`list_extension_workflows`,1.25));let s=new Oe(r,i,a,o,e.config.search,Ne());return s.extensionEtag=t,Q.set(e,{signature:t,engine:s}),s}function Ie(e){let t={};for(let e of M())t[e.domain]=(t[e.domain]??0)+1;for(let n of e.extensionToolsByName.values())t[n.domain]=(t[n.domain]??0)+1;let n=M().length,r=e.extensionToolsByName.size;return`Search ${n+r} tools across ${Object.keys(t).length} capability domains. This includes built-in tools plus any loaded plugin/workflow tools (${r} currently loaded). In search-tier sessions, call this before assuming a capability is unavailable. Use activate_tools for exact matches, activate_domain for an entire domain. Domains: ${Object.entries(t).toSorted((e,t)=>t[1]-e[1]).map(([e,t])=>`${e} (${t})`).join(` | `)}. Query tip: before searching, distill your intent into key concepts (action verb + target + domain). Pass distilled keywords, not full sentences — the search engine works on token matching, not semantic understanding.`}var Le=e({handleActivateDomain:()=>$});async function $(e,n){let r=typeof n.domain==`string`?n.domain:``;if(!r)return k(JSON.stringify({success:!1,error:`domain must be a non-empty string`}));let i=new Set(ce());for(let t of e.extensionToolsByName.values())i.add(t.domain);if(!i.has(r))return k(JSON.stringify({success:!1,error:`Unknown domain "${r}". Valid: ${[...i].join(`, `)}`}));await de(r);let a=typeof n.ttlMinutes==`number`?n.ttlMinutes:b,o=[...ue([r]),...[...e.extensionToolsByName.values()].filter(e=>e.domain===r).map(e=>e.tool)],s=X(e),c=[];e.enabledDomains.add(r);for(let t of o){if(s.has(t.name))continue;let n=e.registerSingleTool(t);e.activatedToolNames.add(t.name),e.activatedRegisteredTools.set(t.name,n);let r=e.extensionToolsByName.get(t.name);r&&(r.registeredTool=n),c.push(t.name)}if(c.length>0){let n=new Set(c.filter(t=>!e.extensionToolsByName.has(t)));if(n.size>0){let t=z(e.handlerDeps,n);e.router.addHandlers(t)}for(let t of c){let n=e.extensionToolsByName.get(t);n?.handler&&e.router.addHandlers({[t]:n.handler})}B(e,r,a,c);try{await e.server.sendToolListChanged()}catch(e){t.warn(`sendToolListChanged failed:`,e)}}return t.info(`activate_domain: domain="${r}", activated ${c.length} tools, ttl=${a}min`),k(JSON.stringify({success:!0,domain:r,activated:c.length,activatedTools:c,totalDomainTools:o.length,ttlMinutes:a>0?a:`no expiry`,hint:c.length>0?`Tools activated. If they do not appear in your tool list, use call_tool({ name: "<tool>", args: {...} }) to invoke them.`:void 0}))}export{Ae as a,ke as c,X as i,H as l,$ as n,Fe as o,Ie as r,Me as s,Le as t,z as u};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Z as e,Zr as t}from"./constants-Cp6hBrrx.mjs";import{_ as n,b as r,d as i,m as a,t as o,u as s}from"./Win32API-Bhi5xFBe.mjs";import{i as c}from"./NativeMemoryManager.utils-DM4NC3FE.mjs";import{randomUUID as l}from"node:crypto";var u=class{freezes=new Map;writeHistory=[];undoneStack=[];async writeValue(e,u,d,f){let p=BigInt(u.startsWith(`0x`)?u:`0x${u}`),{patternBytes:m}=c(d,f),h=Buffer.from(m),g=r(e,!0);try{let r=i(g,p,h.length),{oldProtect:o}=a(g,p,h.length,s.READWRITE);n(g,p,h),a(g,p,h.length,o);let c={id:l(),pid:e,address:`0x${p.toString(16).toUpperCase()}`,oldValue:Array.from(r),newValue:Array.from(h),timestamp:Date.now(),undone:!1};return this.writeHistory.push(c),this.undoneStack=[],this.writeHistory.length>t&&(this.writeHistory=this.writeHistory.slice(-t)),c}finally{o(g)}}async undo(){for(let e=this.writeHistory.length-1;e>=0;e--){let t=this.writeHistory[e];if(!t.undone){let e=BigInt(t.address),i=Buffer.from(t.oldValue),c=r(t.pid,!0);try{let{oldProtect:t}=a(c,e,i.length,s.READWRITE);n(c,e,i),a(c,e,i.length,t)}finally{o(c)}return t.undone=!0,this.undoneStack.push(t),t}}return null}async redo(){let e=this.undoneStack.pop();if(!e)return null;let t=BigInt(e.address),i=Buffer.from(e.newValue),c=r(e.pid,!0);try{let{oldProtect:e}=a(c,t,i.length,s.READWRITE);n(c,t,i),a(c,t,i.length,e)}finally{o(c)}return e.undone=!1,e}async freeze(t,i,u,d,f){let p=BigInt(i.startsWith(`0x`)?i:`0x${i}`),{patternBytes:m}=c(u,d),h=Buffer.from(m),g=f??e,_={id:l(),pid:t,address:`0x${p.toString(16).toUpperCase()}`,value:Array.from(h),valueType:d,intervalMs:g,isActive:!0};return _.timer=setInterval(()=>{try{let e=r(t,!0);try{let{oldProtect:t}=a(e,p,h.length,s.READWRITE);n(e,p,h),a(e,p,h.length,t)}finally{o(e)}}catch{_.isActive=!1,_.timer&&clearInterval(_.timer),this.freezes.delete(_.id)}},g),typeof _.timer.unref==`function`&&_.timer.unref(),this.freezes.set(_.id,_),_}async unfreeze(e){let t=this.freezes.get(e);return t?(t.timer&&clearInterval(t.timer),t.isActive=!1,this.freezes.delete(e),!0):!1}async unfreezeAll(){let e=0;for(let[t]of this.freezes)await this.unfreeze(t),e++;return e}listFreezes(){return Array.from(this.freezes.values()).map(({timer:e,...t})=>t)}async dumpMemory(e,t,n){let a=BigInt(t.startsWith(`0x`)?t:`0x${t}`),s=r(e,!1);try{return i(s,a,n)}finally{o(s)}}async dumpMemoryHex(e,t,n){let r=await this.dumpMemory(e,t,n),i=[],a=BigInt(t.startsWith(`0x`)?t:`0x${t}`);for(let e=0;e<r.length;e+=16){let t=a+BigInt(e),n=Array.from(r.subarray(e,Math.min(e+16,r.length))).map(e=>e.toString(16).padStart(2,`0`)).join(` `),o=Array.from(r.subarray(e,Math.min(e+16,r.length))).map(e=>e>=32&&e<=126?String.fromCharCode(e):`.`).join(``);i.push(`${t.toString(16).padStart(12,`0`)} ${n.padEnd(47)} |${o}|`)}return i.join(`
|
|
2
|
+
`)}getWriteHistory(){return[...this.writeHistory]}};const d=new u;export{u as MemoryController,d as memoryController};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{An as e,jn as t}from"./constants-Cp6hBrrx.mjs";import{n,t as r}from"./formatAddress-C7j2fDlM.mjs";import{randomUUID as i}from"node:crypto";function a(e){switch(e){case`byte`:case`int8`:return 1;case`int16`:case`uint16`:return 2;case`int32`:case`uint32`:case`float`:return 4;case`int64`:case`uint64`:case`double`:case`pointer`:return 8;case`hex`:case`string`:return 0;default:return 4}}function o(e){switch(e){case`byte`:case`int8`:return 1;case`int16`:case`uint16`:return 2;case`int32`:case`uint32`:case`float`:return 4;case`int64`:case`uint64`:case`double`:case`pointer`:return 8;default:return 1}}function s(e){switch(e){case`byte`:return e=>e.readUInt8(0);case`int8`:return e=>e.readInt8(0);case`int16`:return e=>e.readInt16LE(0);case`uint16`:return e=>e.readUInt16LE(0);case`int32`:return e=>e.readInt32LE(0);case`uint32`:return e=>e.readUInt32LE(0);case`int64`:return e=>e.readBigInt64LE(0);case`uint64`:case`pointer`:return e=>e.readBigUInt64LE(0);case`float`:return e=>e.readFloatLE(0);case`double`:return e=>e.readDoubleLE(0);default:return e=>e.readInt32LE(0)}}function c(e){return e===`float`?(e,t)=>Math.abs(Number(e)-Number(t))<1e-6:e===`double`?(e,t)=>Math.abs(Number(e)-Number(t))<1e-12:e===`int64`||e===`uint64`||e===`pointer`?(e,t)=>e===t:(e,t)=>Number(e)===Number(t)}function l(e,t){let n=s(t),r=c(t),i=t===`int64`||t===`uint64`||t===`pointer`?(e,t)=>{let n=BigInt(e),r=BigInt(t);return n<r?-1:+(n>r)}:(e,t)=>Number(e)-Number(t);switch(e){case`exact`:return(e,t,i,a)=>i?r(n(e),n(i)):!1;case`unknown_initial`:return()=>!0;case`changed`:return(e,t,i,a)=>t?!r(n(e),n(t)):!1;case`unchanged`:return(e,t,i,a)=>t?r(n(e),n(t)):!0;case`increased`:return(e,t,r,a)=>t?i(n(e),n(t))>0:!1;case`decreased`:return(e,t,r,a)=>t?i(n(e),n(t))<0:!1;case`greater_than`:return(e,t,r,a)=>r?i(n(e),n(r))>0:!1;case`less_than`:return(e,t,r,a)=>r?i(n(e),n(r))<0:!1;case`between`:return(e,t,r,a)=>!r||!a?!1:i(n(e),n(r))>=0&&i(n(e),n(a))<=0;case`not_equal`:return(e,t,i,a)=>i?!r(n(e),n(i)):!1;default:return()=>!1}}const u=new Map;function d(e,t){let n=`${e}:${t}`,r=u.get(n);return r||(r=l(e,t),u.set(n,r)),r}function f(e,t,n,r,i,a){return d(i,a)(e,t,n,r)}var p=class{sessions=new Map;maxSessions;sessionTtlMs;constructor(n=e,r=t){this.maxSessions=n,this.sessionTtlMs=r}createSession(e,t){if(this.cleanup(),this.sessions.size>=this.maxSessions){let e=null,t=1/0;for(let[n,r]of this.sessions)r.createdAt<t&&(t=r.createdAt,e=n);e&&this.sessions.delete(e)}let n=i(),r=t.alignment??o(t.valueType),a=Date.now(),s={id:n,pid:e,valueType:t.valueType,alignment:r,createdAt:a,lastScanAt:a,scanCount:0,addresses:[],previousValues:new Map};return this.sessions.set(n,s),n}getSession(e){let t=this.sessions.get(e);if(!t)throw Error(`Scan session not found: ${e}`);if(Date.now()-t.lastScanAt>this.sessionTtlMs)throw this.sessions.delete(e),Error(`Scan session expired: ${e}`);return t}updateSession(e,t,n){let r=this.getSession(e);r.addresses=t,r.previousValues=n,r.lastScanAt=Date.now(),r.scanCount++}listSessions(){this.cleanup();let e=[],t=Date.now();for(let n of this.sessions.values()){let r=t-n.createdAt,i=Math.floor(r/6e4),a=Math.floor(r%6e4/1e3);e.push({id:n.id,pid:n.pid,valueType:n.valueType,addressCount:n.addresses.length,scanCount:n.scanCount,age:i>0?`${i}m${a}s`:`${a}s`})}return e}deleteSession(e){return this.sessions.delete(e)}cleanup(){let e=Date.now(),t=0;for(let[n,r]of this.sessions)e-r.lastScanAt>this.sessionTtlMs&&(this.sessions.delete(n),t++);return t}exportSession(e){let t=this.getSession(e),n={...t,addresses:t.addresses.map(e=>r(e)),previousValues:Array.from(t.previousValues.entries()).map(([e,t])=>[r(e),t.toString(`hex`)])};return JSON.stringify(n)}importSession(e){let t=JSON.parse(e),r=i(),a=Date.now(),o=new Map;if(Array.isArray(t.previousValues))for(let[e,r]of t.previousValues)typeof e==`string`&&typeof r==`string`&&o.set(n(e),Buffer.from(r,`hex`));let s=[];if(Array.isArray(t.addresses))for(let e of t.addresses)typeof e==`string`&&s.push(n(e));let c={id:r,pid:t.pid,valueType:t.valueType,alignment:t.alignment??4,createdAt:a,lastScanAt:a,scanCount:t.scanCount??0,addresses:s,previousValues:o};return this.sessions.set(r,c),r}};const m=new p;export{p as MemoryScanSessionManager,o as n,a as r,m as scanSessionManager,f as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Dn as e,En as t,Mn as n,On as r,kn as i}from"./constants-Cp6hBrrx.mjs";import{t as a}from"./ToolError-DWU_z7gp.mjs";import{t as o}from"./factory-Cx_1LorX.mjs";import{i as s}from"./NativeMemoryManager.utils-DM4NC3FE.mjs";import{t as c}from"./NativeMemoryManager.impl-CI554XbY.mjs";import{n as l,t as u}from"./formatAddress-C7j2fDlM.mjs";import{n as d,r as f,scanSessionManager as p,t as m}from"./MemoryScanSession-CaxAjZJf.mjs";var h=class{nmm;providerCache=null;get provider(){return this.providerCache||=o(),this.providerCache}set provider(e){this.providerCache=e}constructor(e){this.nmm=e}async firstScan(e,n,i){let o=performance.now(),c=i.valueType,l=f(c),m=i.alignment??d(c),h=i.maxResults??r;if(l===0)return this.patternFirstScan(e,n,c,i);let{patternBytes:g}=s(n,c===`pointer`?`uint64`:c);if(g.length===0)throw new a(`VALIDATION`,`Invalid pattern for type ${c}: "${n}"`);let _=Buffer.from(g),v=p.createSession(e,i),y=[],b=new Map,x=this.provider.openProcess(e,!1);try{let e=this.getFilteredRegions(x,i),t=e.length,n=0;for(let r of e){if(i.onProgress&&i.onProgress(n,t),n++,y.length>=h)break;let e=r.baseAddress,a=r.size,o=16*1024*1024;for(let t=0;t<a&&y.length<h;t+=o){let n=Math.min(o,a-t),r=e+BigInt(t),i;try{i=this.provider.readMemory(x,r,n).data}catch{break}if(m===l&&l>0){let e=this.getAlignStep(m),t=this.getAlignedChunkStart(r,e);for(;t<=i.length-l&&y.length<h;){let n=i.indexOf(_,t);if(n===-1)break;if(!this.isAlignedAddress(r+BigInt(n),e)){t=n+1;continue}let a=r+BigInt(n);y.push(a),b.set(a,Buffer.from(i.subarray(n,n+l))),t=n+e}}else{let e=this.getAlignStep(m),t=this.getAlignedChunkStart(r,e);for(let n=t;n<=i.length-l;n+=e)if(Buffer.compare(i.subarray(n,n+l),_)===0){let e=r+BigInt(n);if(y.push(e),b.set(e,Buffer.from(i.subarray(n,n+l))),y.length>=h)break}}}}}finally{this.provider.closeProcess(x)}p.updateSession(v,y,b);let S=`${(performance.now()-o).toFixed(1)}ms`,C=y.slice(0,t).map(u);return{sessionId:v,matchCount:y.length,scanNumber:1,addresses:C,totalMatches:y.length,truncated:y.length>t,elapsed:S}}async nextScan(e,n,r,i){let o=performance.now(),c=p.getSession(e),{pid:l,valueType:d,addresses:h,previousValues:g}=c,_=f(d);if(_===0)throw new a(`VALIDATION`,`Next-scan is not supported for variable-length types (hex/string)`);let v=null,y=null;if(r!==void 0){let{patternBytes:e}=s(r,d===`pointer`?`uint64`:d);v=Buffer.from(e)}if(i!==void 0){let{patternBytes:e}=s(i,d===`pointer`?`uint64`:d);y=Buffer.from(e)}let b=[],x=new Map,S=this.provider.openProcess(l,!1);try{for(let e of h){let t;try{t=this.provider.readMemory(S,e,_).data}catch{continue}let r=g.get(e)??null;m(t,r,v,y,n,d)&&(b.push(e),x.set(e,Buffer.from(t)))}}finally{this.provider.closeProcess(S)}p.updateSession(e,b,x);let C=`${(performance.now()-o).toFixed(1)}ms`,w=b.slice(0,t).map(u);return{sessionId:e,matchCount:b.length,scanNumber:c.scanCount,addresses:w,totalMatches:b.length,truncated:b.length>t,elapsed:C}}async unknownInitialScan(e,r){let i=performance.now(),o=r.valueType,s=f(o),c=r.alignment??d(o),l=r.maxResults??n;if(s===0)throw new a(`VALIDATION`,`Unknown initial scan is not supported for variable-length types`);let m=p.createSession(e,r),h=[],g=new Map,_=this.provider.openProcess(e,!1);try{let e=this.getFilteredRegions(_,r),t=e.length,n=0;for(let i of e){if(r.onProgress&&r.onProgress(n,t),n++,h.length>=l)break;let e=i.baseAddress,a=i.size,o=16*1024*1024;for(let t=0;t<a&&h.length<l;t+=o){let n=Math.min(o,a-t),r=e+BigInt(t),i;try{i=this.provider.readMemory(_,r,n).data}catch{break}let u=this.getAlignStep(c),d=this.getAlignedChunkStart(r,u);for(let e=d;e<=i.length-s;e+=u){let t=r+BigInt(e);if(h.push(t),g.set(t,Buffer.from(i.subarray(e,e+s))),h.length>=l)break}}}}finally{this.provider.closeProcess(_)}p.updateSession(m,h,g);let v=`${(performance.now()-i).toFixed(1)}ms`;return{sessionId:m,matchCount:h.length,scanNumber:1,addresses:h.slice(0,t).map(u),totalMatches:h.length,truncated:h.length>t,elapsed:v}}async pointerScan(e,n,r={}){let a=performance.now(),o=r.maxResults??i,s=l(n),c={valueType:`pointer`,alignment:8,regionFilter:{moduleOnly:r.moduleOnly}},d=p.createSession(e,c),f=[],m=this.provider.openProcess(e,!1);try{let e=this.getFilteredRegions(m,c);for(let t of e){if(r.moduleOnly,f.length>=o)break;let e=t.baseAddress,n=t.size,i=16*1024*1024;for(let t=0;t<n&&f.length<o;t+=i){let r=Math.min(i,n-t),a=e+BigInt(t),c;try{c=this.provider.readMemory(m,a,r).data}catch{break}for(let e=0;e<=c.length-8;e+=8){let t=c.readBigUInt64LE(e);if(Number(t>s?t-s:s-t)<=4096){let n=a+BigInt(e),r=t>=s?Number(t-s):-Number(s-t);if(f.push({address:u(n),value:u(t),offsetFromTarget:r}),f.length>=o)break}}}}}finally{this.provider.closeProcess(m)}let h=f.map(e=>l(e.address));p.updateSession(d,h,new Map);let g=`${(performance.now()-a).toFixed(1)}ms`;return{sessionId:d,pointers:f.slice(0,t),totalFound:f.length,elapsed:g}}async groupScan(n,i,o){let c=performance.now();if(i.length===0)throw new a(`VALIDATION`,`Group scan requires at least one value pattern`);let l=Math.max(...i.map(e=>e.offset+f(e.type)));if(l>e)throw new a(`VALIDATION`,`Group pattern too large: ${l} bytes (max ${e})`);let d=Array.from({length:l},()=>0),m=Array.from({length:l},()=>0);for(let e of i){let t=e.type===`pointer`?`uint64`:e.type,{patternBytes:n,mask:r}=s(e.value,t);for(let t=0;t<n.length;t++)d[e.offset+t]=n[t],m[e.offset+t]=r[t]}let h=o?.alignment??4,g=o?.maxResults??r,_={valueType:`int32`,alignment:h},v=p.createSession(n,_),y=[],b=this.provider.openProcess(n,!1);try{let e=this.getFilteredRegions(b,_);for(let t of e){if(y.length>=g)break;let e=t.baseAddress,n=t.size,r=16*1024*1024,i=l-1;for(let t=0;t<n&&y.length<g;t+=r){let a=Math.min(r+i,n-t),o=e+BigInt(t),s;try{s=this.provider.readMemory(b,o,a).data}catch{break}let c=this.getAlignStep(h),u=this.getAlignedChunkStart(o,c);for(let e=u;e<=s.length-l;e+=c){let t=!0;for(let n=0;n<l;n++)if(m[n]===1&&s[e+n]!==d[n]){t=!1;break}if(t){let t=o+BigInt(e);if(y.push(t),y.length>=g)break}}}}}finally{this.provider.closeProcess(b)}p.updateSession(v,y,new Map);let x=`${(performance.now()-c).toFixed(1)}ms`;return{sessionId:v,matchCount:y.length,scanNumber:1,addresses:y.slice(0,t).map(u),totalMatches:y.length,truncated:y.length>t,elapsed:x}}getAlignStep(e){return e>0?e:1}getAlignedChunkStart(e,t){let n=BigInt(t),r=e%n;return r===0n?0:Number(n-r)}isAlignedAddress(e,t){return e%BigInt(t)===0n}async patternFirstScan(e,n,i,o){let s=performance.now(),c=i===`pointer`?`uint64`:i,d=await this.nmm.scanMemory(e,n,c);if(!d.success)throw new a(`RUNTIME`,d.error??`Scan failed`);let f=p.createSession(e,o),m=o.maxResults??r,h=d.addresses.slice(0,m).map(l);p.updateSession(f,h,new Map);let g=`${(performance.now()-s).toFixed(1)}ms`;return{sessionId:f,matchCount:h.length,scanNumber:1,addresses:h.slice(0,t).map(u),totalMatches:d.addresses.length,truncated:h.length>t,elapsed:g}}getFilteredRegions(e,t){let n=[],r=0n,i=BigInt(`0x7FFFFFFF0000`),a=t.regionFilter;for(;r<i;){let t=this.provider.queryRegion(e,r);if(!t)break;let i=t.size;if(t.isReadable&&i>0&&i<=2**53-1){let e=!0;a?.writable&&!t.isWritable&&(e=!1),a?.executable&&!t.isExecutable&&(e=!1),a?.moduleOnly&&t.type!==`image`&&(e=!1),e&&n.push({baseAddress:t.baseAddress,size:i})}r=t.baseAddress+BigInt(t.size)}return n}};const g=new h(c);export{h as MemoryScanner,g as memoryScanner};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./logger-sBC6IdRT.mjs";import{v as t,y as n}from"./Win32API-Bhi5xFBe.mjs";import{n as r}from"./concurrency-CcK46d0h.mjs";import{t as i}from"./factory-Cx_1LorX.mjs";import{i as a,t as o}from"./NativeMemoryManager.utils-DM4NC3FE.mjs";import{exec as s}from"node:child_process";import{promisify as c}from"node:util";async function l(e){if(process.platform===`darwin`)return u(e);if(!n())return{available:!1,reason:`Native memory operations require Windows or macOS. Current platform: ${process.platform}`};if(!t())return{available:!1,reason:`koffi library not available. Install with: pnpm add koffi`};try{let{stdout:t}=await e(`powershell.exe -NoProfile -Command "([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)"`,{timeout:5e3});if(t.trim().toLowerCase()!==`true`)return{available:!1,reason:`Native memory operations require Administrator privileges. Run as Administrator.`}}catch{return{available:!1,reason:`Failed to check Administrator privileges.`}}return{available:!0}}async function u(e){try{(await import(`koffi`)).default.load(`/usr/lib/libSystem.B.dylib`).unload()}catch{return{available:!1,reason:`koffi library cannot load libSystem.B.dylib. Install koffi with: pnpm add koffi`}}let t=``;try{let{stdout:n}=await e(`csrutil status 2>&1 || true`,{timeout:5e3});t=n.trim()}catch{}return process.getuid&&process.getuid()!==0?{available:!1,reason:`macOS memory operations require root privileges for task_for_pid. Run with: sudo node <your-script>.${t?` SIP status: ${t}`:``}`}:{available:!0}}const d=c(s);function f(e,t,n,r,i=16777216){if(t.length===0||e.regionSize<t.length||i<=0)return[];let a=Math.max(t.length-1,0),s=Buffer.alloc(0),c=[];for(let l=0;l<e.regionSize;l+=i){let u=Math.min(i,e.regionSize-l),d=r(e.baseAddress+BigInt(l),u),f=s.length>0?Buffer.concat([s,d]):d,p=o(f,t,n);for(let t of p){let n=l+t-s.length;c.push(e.baseAddress+BigInt(n))}if(a===0||l+u>=e.regionSize){s=Buffer.alloc(0);continue}let m=Math.min(a,f.length);s=f.subarray(f.length-m)}return c}var p=class{providerCache=null;get provider(){return this.providerCache||=i(),this.providerCache}set provider(e){this.providerCache=e}async checkAvailability(){return l(d)}async readMemory(t,n,r){try{let e=BigInt(n.startsWith(`0x`)?n:`0x${n}`),i=this.provider.openProcess(t,!1);try{let{data:t}=this.provider.readMemory(i,e,r);return{success:!0,data:t.toString(`hex`).toUpperCase().match(/.{2}/g)?.join(` `)||``}}finally{this.provider.closeProcess(i)}}catch(i){return e.error(`Native memory read failed`,{pid:t,address:n,size:r,error:i instanceof Error?i.message:String(i)}),{success:!1,error:i instanceof Error?i.message:String(i)}}}async writeMemory(t,n,r,i=`hex`){try{let e=BigInt(n.startsWith(`0x`)?n:`0x${n}`),a;a=i===`base64`?Buffer.from(r,`base64`):Buffer.from(r.replace(/\s/g,``),`hex`);let o=this.provider.openProcess(t,!0);try{let{bytesWritten:t}=this.provider.writeMemory(o,e,a);return{success:!0,bytesWritten:t}}finally{this.provider.closeProcess(o)}}catch(a){return e.error(`Native memory write failed`,{pid:t,address:n,encoding:i,dataLength:r.length,error:a instanceof Error?a.message:String(a)}),{success:!1,error:a instanceof Error?a.message:String(a)}}}async enumerateRegions(t){try{let e=this.provider.openProcess(t,!1),n=[];try{let t=0n,r=BigInt(`0x7FFFFFFF0000`);for(;t<r;){let r=this.provider.queryRegion(e,t);if(!r)break;n.push(m(r)),t=r.baseAddress+BigInt(r.size)}return{success:!0,regions:n}}finally{this.provider.closeProcess(e)}}catch(n){return e.error(`Native region enumeration failed`,{pid:t,error:n instanceof Error?n.message:String(n)}),{success:!1,error:n instanceof Error?n.message:String(n)}}}async checkMemoryProtection(t,n){try{let e=BigInt(n.startsWith(`0x`)?n:`0x${n}`),r=this.provider.openProcess(t,!1);try{let t=this.provider.queryRegion(r,e);return t?{success:!0,protection:h(t.protection),isWritable:t.isWritable,isReadable:t.isReadable,isExecutable:t.isExecutable,regionStart:`0x${t.baseAddress.toString(16).toUpperCase()}`,regionSize:t.size}:{success:!1,error:`Failed to query memory region`}}finally{this.provider.closeProcess(r)}}catch(r){return e.error(`Native protection check failed`,{pid:t,address:n,error:r instanceof Error?r.message:String(r)}),{success:!1,error:r instanceof Error?r.message:String(r)}}}async scanMemory(t,n,i=`hex`){try{let{patternBytes:e,mask:o}=a(n,i);if(e.length===0)return{success:!1,addresses:[],error:`Invalid pattern`};let s=1e4,c=[],l=this.provider.openProcess(t,!1),u=[];try{let t=0n,n=BigInt(`0x7FFFFFFF0000`);for(;t<n;){let e=this.provider.queryRegion(l,t);if(!e)break;e.isReadable&&e.size>0&&e.size<=2**53-1&&c.push({baseAddress:e.baseAddress,regionSize:e.size}),t=e.baseAddress+BigInt(e.size)}let i=this.provider;u=await Promise.all(c.map(t=>r(async()=>{try{return f(t,e,o,(e,t)=>i.readMemory(l,e,t).data)}catch{return[]}})))}finally{this.provider.closeProcess(l)}let d=[];for(let e of u){for(let t of e)if(d.push(`0x${t.toString(16).toUpperCase()}`),d.length>=s)break;if(d.length>=s)break}return{success:!0,addresses:d,stats:{patternLength:e.length,resultsFound:d.length}}}catch(r){return e.error(`Native memory scan failed`,{pid:t,patternType:i,patternLength:n.length,error:r instanceof Error?r.message:String(r)}),{success:!1,addresses:[],error:r instanceof Error?r.message:String(r)}}}async enumerateModules(t){try{let e=this.provider.openProcess(t,!1);try{return{success:!0,modules:this.provider.enumerateModules(e).map(e=>({name:e.name,baseAddress:`0x${e.baseAddress.toString(16).toUpperCase()}`,size:e.size}))}}finally{this.provider.closeProcess(e)}}catch(n){return e.error(`Native module enumeration failed`,{pid:t,error:n instanceof Error?n.message:String(n)}),{success:!1,error:n instanceof Error?n.message:String(n)}}}async injectDll(t,n){if(process.platform!==`win32`)return{success:!1,error:`DLL injection is only supported on Windows`};try{let{openProcessForMemory:e,CloseHandle:r,WriteProcessMemory:i,VirtualAllocEx:a,CreateRemoteThread:o,GetModuleHandle:s,GetProcAddress:c,PAGE:l,MEM:u}=await import(`./Win32API-Bhi5xFBe.mjs`).then(e=>e.g),d=e(t,!0);try{let e=c(s(`kernel32.dll`),`LoadLibraryA`);if(!e)return{success:!1,error:`Failed to get LoadLibraryA address`};let t=Buffer.from(n+`\0`,`ascii`),f=a(d,0n,t.length,u.COMMIT|u.RESERVE,l.READWRITE);if(!f)return{success:!1,error:`Failed to allocate remote memory`};i(d,f,t);let{handle:p,threadId:m}=o(d,e,f);return p?(r(p),{success:!0,remoteThreadId:m}):{success:!1,error:`Failed to create remote thread`}}finally{r(d)}}catch(r){return e.error(`Native DLL injection failed`,{pid:t,dllPath:n,error:r instanceof Error?r.message:String(r)}),{success:!1,error:r instanceof Error?r.message:String(r)}}}async injectShellcode(t,n,r=`hex`){if(process.platform!==`win32`)return{success:!1,error:`Shellcode injection is only supported on Windows`};try{let e;e=r===`base64`?Buffer.from(n,`base64`):Buffer.from(n.replace(/\s/g,``),`hex`);let{openProcessForMemory:i,CloseHandle:a,WriteProcessMemory:o,VirtualAllocEx:s,VirtualProtectEx:c,CreateRemoteThread:l,PAGE:u,MEM:d}=await import(`./Win32API-Bhi5xFBe.mjs`).then(e=>e.g),f=i(t,!0);try{let t=s(f,0n,e.length,d.COMMIT|d.RESERVE,u.READWRITE);if(!t)return{success:!1,error:`Failed to allocate remote memory`};o(f,t,e);let{success:n}=c(f,t,e.length,u.EXECUTE_READWRITE);if(!n)return{success:!1,error:`Failed to change memory protection`};let{handle:r,threadId:i}=l(f,t,0n);return r?(a(r),{success:!0,remoteThreadId:i}):{success:!1,error:`Failed to create remote thread`}}finally{a(f)}}catch(i){return e.error(`Native shellcode injection failed`,{pid:t,encoding:r,shellcodeLength:n.length,error:i instanceof Error?i.message:String(i)}),{success:!1,error:i instanceof Error?i.message:String(i)}}}async checkDebugPort(t){if(process.platform!==`win32`)return{success:!1,error:`Debug port check is only supported on Windows`};try{let{openProcessForMemory:e,CloseHandle:n,NtQueryInformationProcess:r}=await import(`./Win32API-Bhi5xFBe.mjs`).then(e=>e.g),i=e(t,!1);try{let{status:e,debugPort:t}=r(i,7);return e===0?{success:!0,isDebugged:t!==0}:{success:!1,error:`NtQueryInformationProcess failed with status 0x${e.toString(16)}`}}finally{n(i)}}catch(n){return e.error(`Native debug port check failed`,{pid:t,error:n instanceof Error?n.message:String(n)}),{success:!1,error:n instanceof Error?n.message:String(n)}}}};function m(e){return{baseAddress:`0x${e.baseAddress.toString(16).toUpperCase()}`,size:e.size,state:e.state.toUpperCase(),protection:h(e.protection),isReadable:e.isReadable,isWritable:e.isWritable,isExecutable:e.isExecutable,type:e.type.toUpperCase()}}function h(e){if(e===0)return`NOACCESS`;let t=[],n=(e&1)!=0,r=(e&2)!=0,i=(e&4)!=0,a=(e&8)!=0;return n&&r&&i?t.push(`RWX`):n&&i?t.push(`RX`):n&&r?t.push(`RW`):n?t.push(`R`):i&&t.push(`X`),a&&t.push(`GUARD`),t.join(` `)||`UNKNOWN`}const g=new p;export{g as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as e,v as t}from"./Win32API-Bhi5xFBe.mjs";function n(){return t()}function r(e,t){let n=[],r=[];switch(t){case`hex`:{let t=e.trim().split(/\s+/);for(let e of t)if(e===`??`||e===`**`||e===`?`)n.push(0),r.push(0);else{let t=parseInt(e,16);isNaN(t)||(n.push(t),r.push(1))}break}case`int32`:{let t=parseInt(e);if(!isNaN(t)){let e=Buffer.allocUnsafe(4);e.writeInt32LE(t,0),n.push(...e),r.push(1,1,1,1)}break}case`int64`:{let t=BigInt(e),i=Buffer.allocUnsafe(8);i.writeBigInt64LE(t,0),n.push(...i),r.push(1,1,1,1,1,1,1,1);break}case`float`:{let t=parseFloat(e);if(!isNaN(t)){let e=Buffer.allocUnsafe(4);e.writeFloatLE(t,0),n.push(...e),r.push(1,1,1,1)}break}case`double`:{let t=parseFloat(e);if(!isNaN(t)){let e=Buffer.allocUnsafe(8);e.writeDoubleLE(t,0),n.push(...e),r.push(1,1,1,1,1,1,1,1)}break}case`string`:{let t=Buffer.from(e,`utf8`);n.push(...t),r.push(...t.map(()=>1));break}case`byte`:{let t=parseInt(e)&255;n.push(t),r.push(1);break}case`int8`:{let t=parseInt(e),i=Buffer.allocUnsafe(1);i.writeInt8(t,0),n.push(...i),r.push(1);break}case`int16`:{let t=parseInt(e),i=Buffer.allocUnsafe(2);i.writeInt16LE(t,0),n.push(...i),r.push(1,1);break}case`uint16`:{let t=parseInt(e),i=Buffer.allocUnsafe(2);i.writeUInt16LE(t,0),n.push(...i),r.push(1,1);break}case`uint32`:{let t=parseInt(e)>>>0,i=Buffer.allocUnsafe(4);i.writeUInt32LE(t,0),n.push(...i),r.push(1,1,1,1);break}case`uint64`:case`pointer`:{let t=BigInt(e),i=Buffer.allocUnsafe(8);i.writeBigUInt64LE(t,0),n.push(...i),r.push(1,1,1,1,1,1,1,1);break}}return{patternBytes:n,mask:r}}function i(e,t){let n=[],r=t.length;if(r===0||e.length<r)return n;let i=r-1,a=new Uint32Array(256);a.fill(r);for(let e=0;e<i;e++){let n=t[e];n!==void 0&&(a[n]=i-e)}let o=0;for(;o<=e.length-r;){let s=i;for(;s>=0&&e[o+s]===t[s];)s--;if(s<0){n.push(o),o+=1;continue}let c=e[o+i];if(c===void 0)break;o+=a[c]??r}return n}function a(e,t,n){if(t.length===0)return[];if(n.every(e=>e===1))return i(e,t);let r=[];for(let i=0;i<=e.length-t.length;i++){let a=!0;for(let r=0;r<t.length;r++)if(n[r]===1&&e[i+r]!==t[r]){a=!1;break}a&&r.push(i)}return r}function o(t){return(t&e.EXECUTE)!==0||(t&e.EXECUTE_READ)!==0||(t&e.EXECUTE_READWRITE)!==0}export{r as i,o as n,n as r,a as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./logger-sBC6IdRT.mjs";import{a as t,b as n,d as r,i,n as a,s as o,t as s}from"./Win32API-Bhi5xFBe.mjs";import{promises as c}from"node:fs";const l={CNT_CODE:32,CNT_INITIALIZED_DATA:64,CNT_UNINITIALIZED_DATA:128,MEM_EXECUTE:536870912,MEM_READ:1073741824,MEM_WRITE:2147483648},u={EXPORT:0,IMPORT:1,RESOURCE:2,EXCEPTION:3,IAT:12,DELAY_IMPORT:13};var d=class{async parseHeaders(e,t){let i=BigInt(t),a=n(e);try{let e=r(a,i,64),t=e.readUInt16LE(0);if(t!==23117)throw Error(`Invalid DOS header: expected 0x5A4D, got 0x${t.toString(16)}`);let n=e.readUInt32LE(60),o=r(a,i+BigInt(n),264),s=o.readUInt32LE(0);if(s!==17744)throw Error(`Invalid PE signature: expected 0x4550, got 0x${s.toString(16)}`);let c=o.readUInt16LE(4),l=o.readUInt16LE(6),u=o.readUInt32LE(8),d=o.readUInt16LE(22),f=o.readUInt16LE(24),p=f===523,m,h,g,_;return p?(h=o.readUInt32LE(40),m=o.readBigUInt64LE(48),g=o.readUInt32LE(80),_=o.readUInt32LE(132)):(h=o.readUInt32LE(40),m=BigInt(o.readUInt32LE(52)),g=o.readUInt32LE(80),_=o.readUInt32LE(116)),{dosHeader:{e_magic:t,e_lfanew:n},ntSignature:s,fileHeader:{machine:c,numberOfSections:l,timeDateStamp:u,characteristics:d},optionalHeader:{magic:f,imageBase:`0x${m.toString(16)}`,entryPoint:`0x${h.toString(16)}`,sizeOfImage:g,numberOfRvaAndSizes:_}}}finally{s(a)}}async listSections(e,t){let i=BigInt(t),a=n(e);try{let e=await this.readCoreHeaders(a,i),t=[];for(let n=0;n<e.numSections;n++){let o=e.firstSectionOffset+n*40,s=r(a,i+BigInt(o),40),c=s.indexOf(0),u=s.subarray(0,c>0&&c<=8?c:8).toString(`ascii`),d=s.readUInt32LE(8),f=s.readUInt32LE(12),p=s.readUInt32LE(16),m=s.readUInt32LE(36);t.push({name:u,virtualAddress:`0x${f.toString(16)}`,virtualSize:d,rawSize:p,characteristics:m,isExecutable:(m&l.MEM_EXECUTE)!==0,isWritable:(m&l.MEM_WRITE)!==0,isReadable:(m&l.MEM_READ)!==0})}return t}finally{s(a)}}async parseImports(e,t){let i=BigInt(t),a=n(e);try{let e=await this.readCoreHeaders(a,i),t=e.dataDirectories[u.IMPORT];if(!t||t.rva===0)return[];let n=[],o=t.rva;for(let t=0;t<500;t++){let t=r(a,i+BigInt(o),20),s=t.readUInt32LE(12);if(s===0)break;let c=r(a,i+BigInt(s),256),l=c.indexOf(0),u=c.subarray(0,l>0?l:256).toString(`ascii`),d=t.readUInt32LE(0)||t.readUInt32LE(16),f=this.readThunkArray(a,i,d,e.isPE32Plus);n.push({dllName:u,functions:f}),o+=20}return n}finally{s(a)}}async parseExports(e,t){let i=BigInt(t),a=n(e);try{let e=(await this.readCoreHeaders(a,i)).dataDirectories[u.EXPORT];if(!e||e.rva===0)return[];let t=r(a,i+BigInt(e.rva),40),n=t.readUInt32LE(24),o=t.readUInt32LE(28),s=t.readUInt32LE(32),c=t.readUInt32LE(36),l=t.readUInt32LE(16),d=[],f=r(a,i+BigInt(s),n*4),p=r(a,i+BigInt(c),n*2);for(let t=0;t<Math.min(n,2e3);t++){let n=f.readUInt32LE(t*4),s=p.readUInt16LE(t*2),c=r(a,i+BigInt(n),256),u=c.indexOf(0),m=c.subarray(0,u>0?u:256).toString(`ascii`),h=r(a,i+BigInt(o+s*4),4).readUInt32LE(0),g=null;if(h>=e.rva&&h<e.rva+e.size){let e=r(a,i+BigInt(h),256),t=e.indexOf(0);g=e.subarray(0,t>0?t:256).toString(`ascii`)}d.push({name:m,ordinal:l+s,rva:`0x${h.toString(16)}`,forwardedTo:g})}return d}finally{s(a)}}async detectInlineHooks(t,i){let a=n(t),o=[];try{let n=this.enumerateModulesInternal(a),s=i?n.filter(e=>e.name.toLowerCase().includes(i.toLowerCase())):n;for(let n of s)try{let e=await c.readFile(n.path),i=await this.parseExports(t,n.base);for(let t of i){let i=parseInt(t.rva,16);if(i===0||t.forwardedTo)continue;let s=r(a,BigInt(n.base)+BigInt(i),16),c=this.rvaToFileOffset(e,i);if(c<0||c+16>e.length)continue;let l=e.subarray(c,c+16);if(!s.equals(l)){let e=this.classifyHook(s),r=this.decodeJumpTarget(s,BigInt(n.base)+BigInt(i));o.push({address:`0x${(BigInt(n.base)+BigInt(i)).toString(16)}`,moduleName:n.name,functionName:t.name,originalBytes:Array.from(l),currentBytes:Array.from(s),hookType:e,jumpTarget:r})}}}catch(t){e.debug(`Hook check skipped for ${n.name}: ${t}`)}}finally{s(a)}return o}async analyzeSections(e,t){let n=await this.listSections(e,t),r=[];for(let e of n)e.isReadable&&e.isWritable&&e.isExecutable?r.push({sectionName:e.name,anomalyType:`rwx`,severity:`high`,details:`Section ${e.name} has Read+Write+Execute permissions — unusual and potentially malicious`}):e.isWritable&&e.isExecutable?r.push({sectionName:e.name,anomalyType:`writable_code`,severity:`high`,details:`Section ${e.name} is writable and executable — code may be self-modifying or packed`}):e.isExecutable&&!e.name.startsWith(`.text`)&&!e.name.startsWith(`.code`)&&(e.characteristics&l.CNT_INITIALIZED_DATA)!==0&&r.push({sectionName:e.name,anomalyType:`executable_data`,severity:`medium`,details:`Data section ${e.name} has execute permission`});return r}async readCoreHeaders(e,t){let n=r(e,t,64).readUInt32LE(60),i=r(e,t+BigInt(n),264),a=i.readUInt16LE(6),o=i.readUInt16LE(20),s=i.readUInt16LE(24)===523,c=s?i.readUInt32LE(132):i.readUInt32LE(116),l=s?136:120,u=[];for(let e=0;e<Math.min(c,16);e++){let t=l+e*8;t+8<=i.length&&u.push({rva:i.readUInt32LE(t),size:i.readUInt32LE(t+4)})}return{numSections:a,isPE32Plus:s,firstSectionOffset:n+4+20+o,dataDirectories:u}}readThunkArray(e,t,n,i){let a=i?8:4,o=[],s=i?9223372036854775808n:2147483648n;for(let c=0;c<2e3;c++){let l=r(e,t+BigInt(n+c*a),a),u=i?l.readBigUInt64LE(0):BigInt(l.readUInt32LE(0));if(u===0n)break;if((u&s)!==0n)o.push({name:`Ordinal#${Number(u&65535n)}`,ordinal:Number(u&65535n),hint:0,thunkRva:`0x${(n+c*a).toString(16)}`});else{let i=Number(u),s=r(e,t+BigInt(i),258),l=s.readUInt16LE(0),d=s.indexOf(0,2),f=s.subarray(2,d>2?d:258).toString(`ascii`);o.push({name:f,ordinal:0,hint:l,thunkRva:`0x${(n+c*a).toString(16)}`})}}return o}enumerateModulesInternal(n){let r=[];try{let{modules:e,count:s}=a(n);for(let a=0;a<s;a++){let s=e[a],c=i(n,s),l=o(n,s),u=t(n,s)??c;l.success&&r.push({name:c,base:`0x${l.info.lpBaseOfDll.toString(16)}`,path:u,size:l.info.SizeOfImage})}}catch(t){e.debug(`Module enumeration failed: ${t}`)}return r}rvaToFileOffset(e,t){let n=e.readUInt32LE(60),r=e.readUInt16LE(n+6),i=e.readUInt16LE(n+20),a=n+24+i;for(let n=0;n<r;n++){let r=a+n*40;if(r+40>e.length)break;let i=e.readUInt32LE(r+12),o=e.readUInt32LE(r+8),s=e.readUInt32LE(r+20);if(t>=i&&t<i+o)return s+(t-i)}return-1}classifyHook(e){return e[0]===233?`jmp_rel32`:e[0]===255&&e[1]===37?`jmp_abs64`:e[0]===104&&e[5]===195?`push_ret`:`unknown`}decodeJumpTarget(e,t){if(e[0]===233){let n=e.readInt32LE(1);return`0x${(t+5n+BigInt(n)).toString(16)}`}return e[0]===255&&e[1]===37&&e.length>=14?`0x${e.readBigUInt64LE(6).toString(16)}`:e[0]===104?`0x${e.readUInt32LE(1).toString(16)}`:`0x0`}};const f=new d;export{d as PEAnalyzer,f as peAnalyzer};
|