@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
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{t as e}from"./logger-sBC6IdRT.mjs";import{d as t,f as n,u as r}from"./constants-Cp6hBrrx.mjs";import{a as i,n as a,r as o,t as s}from"./response-C7rKQst4.mjs";import{a as c,i as l,n as u,r as d,s as f,t as p}from"./parse-args-Cuk7-xUt.mjs";import{s as m}from"./PageController-D9jVkH0i.mjs";import"./definitions-CuJRsJ6N.mjs";import{n as h,t as g}from"./webcrack-CsLLJIs9.mjs";import*as _ from"@babel/parser";import v from"@babel/traverse";import*as y from"@babel/types";import b from"@babel/generator";const x=new Set([`=`,`(`,`[`,`,`,`;`,`{`,`!`,`&`,`|`,`?`,`:`,`~`,`^`,`+`,`-`,`*`,`%`,`<`,`>`,`
|
|
2
|
+
`]);function S(e){return new RegExp(e.source,e.flags)}function ee(e){if(e.length===0)return[];let t=[],n=e.toSorted((e,t)=>e.start-t.start||e.end-t.end);for(let e of n){let n=t[t.length-1];if(!n||e.start>n.end){t.push({...e});continue}n.end=Math.max(n.end,e.end)}return t}function C(e){try{let t=_.parse(e,{sourceType:`unambiguous`,plugins:[`jsx`,`typescript`],errorRecovery:!0}),n=[],r=(e,t)=>{typeof e==`number`&&typeof t==`number`&&t>e&&n.push({start:e,end:t})},i=Array.isArray(t.comments)?t.comments:[];for(let e of i)r(e.start,e.end);return v(t,{StringLiteral(e){r(e.node.start,e.node.end),e.skip()},TemplateElement(e){r(e.node.start,e.node.end),e.skip()},RegExpLiteral(e){r(e.node.start,e.node.end),e.skip()}}),ee(n)}catch{return null}}function w(e){let t=e[e.length-2];if(typeof t==`number`)return t;let n=e[e.length-3];return typeof n==`number`?n:null}function T(e,t){let n=t-1;for(;n>=0&&(e[n]===` `||e[n]===` `||e[n]===`\r`);)n--;if(n<0)return!0;let r=e[n];if(x.has(r))return!0;if(r!==`)`)return!1;let i=1,a=n-1;for(;a>=0&&i>0;)e[a]===`)`&&i++,e[a]===`(`&&i--,a--;for(a--;a>=0&&(e[a]===` `||e[a]===` `);)a--;let o=``;for(;a>=0&&/[a-z]/.test(e[a]);)o=e[a]+o,a--;return[`if`,`while`,`for`,`switch`,`return`,`typeof`,`void`,`in`,`of`,`case`].includes(o)}function E(e,t){let n=null,r=!1,i=!1,a=!1;for(let o=0;o<t;o++){let s=e[o];if(r){s===`*`&&e[o+1]===`/`&&(r=!1,o++);continue}if(i){s===`
|
|
3
|
+
`&&(i=!1);continue}if(a){if(s===`\\`){o++;continue}if(s===`/`){for(a=!1,o++;o<t&&/[gimsuy]/.test(e[o]);)o++;continue}if(s===`[`){for(o++;o<t&&e[o]!==`]`;)e[o]===`\\`&&o++,o++;continue}continue}if(n){if(s===`\\`){o++;continue}s===n&&(n=null);continue}if(s===`/`&&e[o+1]===`/`){i=!0,o++;continue}if(s===`/`&&e[o+1]===`*`){r=!0,o++;continue}if(s===`/`&&T(e,o)){a=!0;continue}(s===`'`||s===`"`||s==="`")&&(n=s)}return n!==null||r||i||a}function D(e,t,n){let r=e=>e.replace(S(t),n),i=C(e);if(i===null)return e.replace(S(t),(...t)=>{let r=typeof t[0]==`string`?t[0]:``,i=w(t);return i!==null&&E(e,i)?r:typeof n==`string`?n:n(r,...t.slice(1))});if(i.length===0)return r(e);let a=``,o=0;for(let t of i)o<t.start&&(a+=r(e.slice(o,t.start))),a+=e.slice(t.start,t.end),o=t.end;return o<e.length&&(a+=r(e.slice(o))),a}const te=/\b(-?\d+(?:\.\d+)?)\s*([+\-%*/])\s*(-?\d+(?:\.\d+)?)\b/g,ne=/if\s*\(\s*false\s*\)\s*\{[^}]*\}\s*/g,O=/if\s*\(\s*false\s*\)\s*\{[^}]*\}\s*else\s*\{([^}]*)\}/g,k=/if\s*\(\s*true\s*\)\s*\{([^}]*)\}\s*(?:else\s*\{[^}]*\}\s*)?/g,A=/var\s+([A-Za-z_$]\w*)\s*=\s*['"]([^'"]+)['"]\.split\(['"]\|['"]\)\s*;\s*var\s+(\w+)\s*=\s*0\s*;\s*while\s*\(\s*!!\[\]\s*\)\s*\{\s*switch\s*\(\s*\1\[\s*\3\+\+\s*\]\s*\)\s*\{([\s\S]*?)\}\s*break;\s*\}/g,j=/var\s+([A-Za-z_$]\w*)\s*=\s*\[(['"][^'"]*['"]\s*(?:,\s*['"][^'"]*['"]\s*)*)\];\s*var\s+(\w+)\s*=\s*(\d+);\s*while\s*\(\s*!!\[\]\s*\)\s*\{\s*switch\s*\(\s*\1\[\s*\3\+\+\]\s*\)\s*\{([\s\S]*?)\}\s*break;\s*\}/g,M=/['"]([^'"]*)['"]\s*\+\s*['"]([^'"]*)['"]/g;function N(e,t,n){for(let r=t;r>=0&&r<e.length;r+=n){let t=e[r];if(t&&!/\s/.test(t))return t}return``}function P(e,t){let n=t.toSorted((e,t)=>t.start-e.start||t.end-e.end),r=e;for(let e of n)r=`${r.slice(0,e.start)}${e.text}${r.slice(e.end)}`;return r}function F(e,t){let n=t.get(e.node.name);if(!n)return null;let r=e.scope.getBinding(e.node.name);if(!r||!y.isVariableDeclarator(r.path.node)||!y.isIdentifier(r.path.node.id)||!t.has(r.path.node.id.name))return null;let i=r.identifier===e.node,a=e.isReferencedIdentifier(),o=e.key===`left`&&e.parentPath.isAssignmentExpression(),s=e.key===`left`&&(e.parentPath.isForInStatement()||e.parentPath.isForOfStatement()),c=e.key===`argument`&&e.parentPath.isUpdateExpression();return!i&&!a&&!o&&!s&&!c?null:n}function I(e,t){try{let n=_.parse(e,{sourceType:`unambiguous`,plugins:[`jsx`,`typescript`],errorRecovery:!0}),r=new Map;return v(n,{ObjectProperty(e){if(!e.node.shorthand||!y.isIdentifier(e.node.key)||!y.isIdentifier(e.node.value))return;let n=e.get(`value`);if(!n.isIdentifier())return;let i=F(n,t),{start:a,end:o}=e.node;!i||a==null||o!=null&&(r.set(`${a}:${o}`,{start:a,end:o,text:`${e.node.key.name}: ${i}`}),e.skip())},Identifier(e){let n=F(e,t),{start:i,end:a}=e.node;!n||i==null||a!=null&&r.set(`${i}:${a}`,{start:i,end:a,text:n})}}),r.size===0?e:P(e,[...r.values()])}catch{return null}}function L(e){let t=e;return t=D(t,te,(e,t,n,r)=>{let i=Number(t),a=Number(r);if(!Number.isFinite(i)||!Number.isFinite(a))return e;let o=null;return n===`+`?o=i+a:n===`-`?o=i-a:n===`*`?o=i*a:n===`/`&&a!==0?o=i/a:n===`%`&&a!==0&&(o=i%a),o===null||!Number.isFinite(o)?e:String(Number.isInteger(o)?o:Number(o.toFixed(12)))}),t=D(t,M,(e,t,n)=>JSON.stringify(`${t}${n}`)),t=D(t,/--(\d)/g,(e,t)=>t),t=D(t,/\+\s*(\d+(?:\.\d+)?)/g,(e,t)=>t),t=D(t,/\b0x([0-9a-fA-F]{2,8})\b/g,(e,t)=>{let n=Number.parseInt(t,16);return Number.isFinite(n)?String(n):e}),t}function R(e){let t=e;return t=D(t,O,(e,t)=>t),t=D(t,ne,``),t=D(t,k,(e,t)=>t),t=D(t,/\btrue\s*\?\s*([^:]+)\s*:\s*([^,;)\]}]+)/g,(e,t)=>t),t=D(t,/\bfalse\s*\?\s*[^:]+\s*:\s*([^,;)}\]]+)/g,(e,t)=>t),t=D(t,/if\s*\([^)]*\)\s*\{\s*\}\s*/g,``),t}function z(e){let t=e;return t=D(t,A,(e,t,n,r,i)=>{let a=/case\s*['"]([^'"]+)['"]\s*:\s*([\s\S]*?)(?=case\s*['"]|default\s*:|$)/g,o=new Map,s;for(;(s=a.exec(i))!==null;){let e=s[1],t=(s[2]??``).replace(/\bcontinue\s*;?/g,``).replace(/\bbreak\s*;?/g,``).trim();e&&t.length>0&&o.set(e,t)}let c=n.split(`|`).map(e=>e.trim()).map(e=>o.get(e)).filter(e=>!!e).join(`
|
|
4
|
+
`);return c.length>0?c:e}),t=D(t,j,(e,t,n,r,i,a)=>{let o=/case\s*['"]([^'"]+)['"]\s*:\s*([\s\S]*?)(?=case\s*['"]|default\s*:|$)/g,s=new Map,c;for(;(c=o.exec(a))!==null;){let e=c[1],t=(c[2]??``).replace(/\bcontinue\s*;?/g,``).replace(/\bbreak\s*;?/g,``).trim();e&&t.length>0&&s.set(e,t)}let l=n.split(/,\s*/).map(e=>e.replace(/^['"]|['"]$/g,``).trim()).map(e=>s.get(e)).filter(e=>!!e).join(`
|
|
5
|
+
`);return l.length>0?l:e}),t}function B(e){let t=new Set,n=/\b(?:var|let|const)\s+([A-Za-z_$]\w{0,3})\b/g,r;for(;(r=n.exec(e))!==null;){let e=r[1];e&&(e.length<=2||e.startsWith(`_0x`)||e.startsWith(`_`))&&t.add(e)}if(t.size===0)return{code:e,count:0};let i=new Map,a=1;for(let e of t)i.set(e,`var_${a}`),a++;let o=I(e,i);if(o!==null)return{code:o,count:o===e?0:i.size};let s=e.replace(RegExp(`\\b(${[...t].map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`)})\\b`,`g`),(e,t,n,r)=>{let a=i.get(t);if(!a)return e;let o=n>0?r[n-1]:``,s=N(r,n-1,-1),c=N(r,n+e.length,1);return o===`.`||o===`'`||o===`"`||o==="`"||o===`$`||(s===`{`||s===`,`)&&(c===`:`||c===`(`)?e:a});return{code:s,count:s===e?0:i.size}}const V={"<":(e,t)=>e<t,">":(e,t)=>e>t,"<=":(e,t)=>e<=t,"<==":(e,t)=>e<=t,">=":(e,t)=>e>=t,">==":(e,t)=>e>=t,"==":(e,t)=>e===t,"===":(e,t)=>e===t,"!=":(e,t)=>e!==t,"!==":(e,t)=>e!==t},H=[{pattern:`jsfuck`,regex:/\[!\[\]\]\[\(['"]\)constructor['"]\)\]\(!!\[\]\+\[\]\)\(\)/g,replacement:`"function Boolean() { [native code] }"`},{pattern:`jsfuck`,regex:/!!\[\]\+\[\]/g,replacement:`"true"`},{pattern:`jsfuck`,regex:/!\[\]\+\[\]/g,replacement:`"false"`},{pattern:`jsfuck`,regex:/\+!!\[\]/g,replacement:`1`},{pattern:`jsfuck`,regex:/\[\]\+\[\]/g,replacement:`""`},{pattern:`jsfuck`,regex:/\+\[\]/g,replacement:`0`}],U=[{pattern:`boolean-literal`,regex:/!!\[\]/g,replacement:`true`},{pattern:`boolean-literal`,regex:/!\[\]/g,replacement:`false`},{pattern:`undefined-literal`,regex:/void\s+0/g,replacement:`undefined`}],W={pattern:`opaque-truthy`,regex:/!0x0\b|!\b0(?![.\d])/g,replacement:`true`},G=[{pattern:`type-coercion`,regex:/typeof\s+undefined\s*===?\s*["']undefined["']/g,replacement:`true`},{pattern:`type-coercion`,regex:/typeof\s+null\s*===?\s*["']object["']/g,replacement:`true`},{pattern:`type-coercion`,regex:/typeof\s+NaN\s*===?\s*["']number["']/g,replacement:`true`},{pattern:`type-coercion`,regex:/null\s*==\s*undefined/g,replacement:`true`},{pattern:`type-coercion`,regex:/null\s*===\s*undefined/g,replacement:`false`},{pattern:`type-coercion`,regex:/NaN\s*===?\s*NaN/g,replacement:`false`}],K=/if\s*\(\s*(-?\d+(?:\.\d+)?)\s*([<>!=]+)\s*(-?\d+(?:\.\d+)?)\s*\)/g,q=/!\s*(-?\d+(?:\.\d+)?)(?![.\d\s\w])/g,re=/(?:var|let|const)\s+(\w+)\s*=\s*\[(['"][^'"]*['"]\s*(?:,\s*['"][^'"]*['"]\s*)*)\]/g;function J(e,t,n,r){return e.solved.push({pattern:t,original:n,result:r}),r}function Y(e,t){for(let n of t)e.output=D(e.output,n.regex,t=>J(e,n.pattern,t,n.replacement))}function X(e){e.output=D(e.output,K,(t,n,r,i)=>{if(e.iterations>=e.maxIterations)return t;let a=V[r];if(!a)return t;e.iterations+=1;let o=a(Number(n),Number(i));return J(e,`constant-comparison`,t,String(o)),e.replaceInPlace?`/* ${t} => ${o} */ if (${o})`:`if (${o})`})}function ie(e){e.output=D(e.output,q,(t,n)=>{let r=Number(n);return r===0||!Number.isFinite(r)?t:J(e,`opaque-falsy`,t,`false`)})}function ae(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function oe(e){let t=new Map;return D(e,re,(e,n,r)=>{let i=r.split(/,\s*/).map(e=>e.replace(/^['"]|['"]$/g,``));return t.set(n,i),e}),t}function se(e){let t=oe(e.output);if(t.size!==0)for(let[n,r]of t){let t=RegExp(`${ae(n)}\\(['"]?(0x[0-9a-fA-F]+|\\d+)['"]?\\)`,`g`);e.output=D(e.output,t,(t,n)=>{if(e.iterations>=e.maxIterations)return t;let i=n.startsWith(`0x`)?Number.parseInt(n,16):Number(n);return i<0||i>=r.length?t:(e.iterations+=1,J(e,`string-array-access`,t,JSON.stringify(r[i])))})}}function ce(e){let t={output:e.code,solved:[],replaceInPlace:e.replaceInPlace,maxIterations:e.maxIterations,iterations:0};return X(t),Y(t,H),Y(t,U),Y(t,[W]),ie(t),se(t),Y(t,G),{success:!0,solvedCount:t.solved.length,solved:t.solved,transformedCode:e.replaceInPlace?t.output:void 0}}const le=[{type:`for-switch`,test:/for.*switch/s},{type:`while-switch`,test:/while.*switch/s},{type:`if-else-chain`,test:/if\s*\(\s*\w+\s*===?\s*\w+/}];function ue(e){for(let t of le)if(t.test.test(e))return t.type;return`switch`}function de(e){let t=new Map;for(let n of e){let e=n.type||`unknown`;t.set(e,(t.get(e)||0)+1)}return Object.fromEntries(t)}function fe(e){let{code:t,extractBytecode:n,mapOpcodes:r,vmResult:i}=e;if(!i.isJSVMP)return{success:!0,isVM:!1,message:`No VM/JSVMP patterns detected.`};let a={isVM:!0,vmType:i.vmType,dispatchType:ue(t),complexity:i.vmFeatures?.complexity,instructionCount:i.vmFeatures?.instructionCount,interpreterLocation:i.vmFeatures?.interpreterLocation};return n&&i.instructions&&(a.bytecode=i.instructions),r&&i.instructions&&(a.opcodeDistribution=de(i.instructions),a.suggestedStrategy=i.vmFeatures?.complexity===`high`?`Use symbolic execution (js_deobfuscate_jsvmp with aggressive=true) for high-complexity VMs`:`Use standard deobfuscation pipeline (js_deobfuscate_pipeline)`),{success:!0,analysis:a}}async function pe(t,n){let r=c(n,`searchKeyword`,``),i=p(n,`forceRequireAll`,!!r),o=Math.min(d(n,`maxResults`,20),100);try{let n=await m(await t.getActivePage(),async e=>{let t=window,n=null;typeof t.__webpack_require__==`function`&&(n=t.__webpack_require__);let r=Object.keys(t).filter(e=>e.startsWith(`webpackChunk`)||e.startsWith(`webpackJsonp`)),i=new Set;for(let e of r){let n=t[e];if(!Array.isArray(n))continue;let r=n;if(r.m&&typeof r.m==`object`)for(let e of Object.keys(r.m))i.add(e);for(let e of n)if(Array.isArray(e)&&e[1]&&typeof e[1]==`object`)for(let t of Object.keys(e[1]))i.add(t)}if(typeof t.__webpack_modules__==`object`&&t.__webpack_modules__)for(let e of Object.keys(t.__webpack_modules__))i.add(e);if(!n)for(let e of r){let r=t[e];if(r?.m&&typeof r.m==`object`){let e=r.m;n=t=>{try{let n=e[t];return typeof n==`function`?n():n}catch{return}};break}}let a=Array.from(i);if(!e.forceRequireAll||!n)return{total:a.length,requireFound:!!n,chunkKeys:r,moduleIds:a.slice(0,200),matches:[]};let o=n,s=[];for(let t of a){if(s.length>=e.maxResults)break;try{let n=o(t);if(n==null)continue;let r;try{r=JSON.stringify(n)}catch{r=String(n)}(!e.searchKeyword||r.toLowerCase().includes(e.searchKeyword.toLowerCase()))&&s.push({id:t,preview:r.slice(0,600)})}catch{}}return{total:a.length,requireFound:!0,chunkKeys:r,moduleIds:a.slice(0,200),matches:s}},{searchKeyword:r,forceRequireAll:i,maxResults:o});return e.info(`webpack_enumerate: found ${n.total} modules, ${n.matches.length} matches`),a(n)}catch(e){return s(e)}}function me(t){e.info(`Derotating string array...`);try{let n=_.parse(t,{sourceType:`module`,plugins:[`jsx`,`typescript`]}),r=0;return v(n,{CallExpression(t){if(!y.isFunctionExpression(t.node.callee)&&!y.isArrowFunctionExpression(t.node.callee))return;let n=t.node.callee;if(!y.isFunctionExpression(n)||!y.isBlockStatement(n.body))return;let i=n.body.body.some(e=>y.isWhileStatement(e)),a=JSON.stringify(n.body).includes(`push`)&&JSON.stringify(n.body).includes(`shift`);i&&a&&(e.debug(`Found string array rotation IIFE`),t.remove(),r++)}}),r>0?(e.info(`Removed ${r} string array rotation functions`),b(n,{comments:!0,compact:!1}).code):t}catch(n){return e.error(`Failed to derotate string array:`,n),t}}const Z=v.default??v,Q=b.default??b,he=new Set([`summary`,`priority`,`incremental`,`full`]),ge=new Set([`structure`,`business`,`security`,`all`]),$=new Set([`function`,`xhr`,`fetch`,`websocket`,`localstorage`,`cookie`]),_e=new Set([`log`,`block`,`modify`]),ve=new Set([`call`,`apply`]);var ye=class{collector;scriptManager;deobfuscator;advancedDeobfuscator;obfuscationDetector;analyzer;cryptoDetector;hookManager;jsvmpDeobfuscator;constructor(e){this.collector=e.collector,this.scriptManager=e.scriptManager,this.deobfuscator=e.deobfuscator,this.advancedDeobfuscator=e.advancedDeobfuscator,this.obfuscationDetector=e.obfuscationDetector,this.analyzer=e.analyzer,this.cryptoDetector=e.cryptoDetector,this.hookManager=e.hookManager,this.jsvmpDeobfuscator=new h}requireCodeArg(t,n){let r=t.code;return typeof r!=`string`||r.trim().length===0?(e.warn(`${n} called without valid code argument`),null):r}extractWebcrackArgs(e){let t={},n=p(e,`unpack`),r=p(e,`unminify`),i=p(e,`jsx`),a=p(e,`mangle`),o=p(e,`forceOutput`),s=p(e,`includeModuleCode`),l=c(e,`outputDir`),u=d(e,`maxBundleModules`);return n!==void 0&&(t.unpack=n),r!==void 0&&(t.unminify=r),i!==void 0&&(t.jsx=i),a!==void 0&&(t.mangle=a),o!==void 0&&(t.forceOutput=o),s!==void 0&&(t.includeModuleCode=s),l?.trim()&&(t.outputDir=l),u!==void 0&&(t.maxBundleModules=u),Array.isArray(e.mappings)&&(t.mappings=e.mappings.filter(e=>typeof e==`object`&&!!e&&typeof e.path==`string`&&typeof e.pattern==`string`)),t}async handleCollectCode(i){let o=p(i,`returnSummaryOnly`,!1),s=u(i,`smartMode`,he),c=n,l=e=>e.slice(0,c).map(e=>({url:e.url,type:e.type,size:e.size,sizeKB:(e.size/1024).toFixed(2),truncated:e.metadata?.truncated||!1,preview:`${e.content.substring(0,200)}...`})),m=e=>{let t=(Array.isArray(e.summaries)&&e.summaries.length>0?e.summaries:l(e.files)).slice(0,c),n=Array.isArray(e.summaries)?e.summaries.length:e.files.length,r=e.totalSize>0?e.totalSize:Array.isArray(e.summaries)?e.summaries.reduce((e,t)=>e+(typeof t.size==`number`?t.size:0),0):e.files.reduce((e,t)=>e+t.size,0);return{totalSize:r,totalSizeKB:(r/1024).toFixed(2),filesCount:n,summarizedFiles:t.length,omittedFiles:Math.max(0,n-t.length),collectTime:e.collectTime,summary:t}};s||=`summary`;let h=await this.collector.collect({url:f(i,`url`),includeInline:p(i,`includeInline`),includeExternal:p(i,`includeExternal`),includeDynamic:p(i,`includeDynamic`),smartMode:s,compress:p(i,`compress`),maxTotalSize:d(i,`maxTotalSize`),maxFileSize:i.maxFileSize?d(i,`maxFileSize`,0)*1024:void 0,priorities:i.priorities});if(o)return a({mode:`summary`,...m(h),hint:`Use get_script_source for specific files.`});let g=r,_=t,v=Buffer.byteLength(JSON.stringify(h),`utf8`);return h.totalSize>g||v>_?(e.warn(`Collected code is too large (collected=${(h.totalSize/1024).toFixed(2)}KB, response=${(v/1024).toFixed(2)}KB), returning summary mode.`),a({warning:`Code size exceeds safe response threshold; summary returned.`,...m(h),estimatedResponseSize:v,estimatedResponseSizeKB:(v/1024).toFixed(2),recommendations:[`Use get_script_source for targeted files.`,`Use more specific priority filters.`,`Use smartMode=summary for initial reconnaissance.`]})):a(h)}async handleSearchInScripts(e){await this.scriptManager.init();let t=c(e,`keyword`);if(!t)return a({success:!1,error:`keyword is required`});let n=d(e,`maxMatches`,100),r=p(e,`returnSummary`,!1),i=d(e,`maxContextSize`,5e4),o=await this.scriptManager.searchInScripts(t,{isRegex:p(e,`isRegex`),caseSensitive:p(e,`caseSensitive`),contextLines:d(e,`contextLines`),maxMatches:n}),s=JSON.stringify(o).length;if(r||s>i){let t=o.matches??[];return a({success:!0,keyword:e.keyword,totalMatches:t.length,resultSize:s,resultSizeKB:(s/1024).toFixed(2),truncated:s>i,reason:s>i?`Result too large (${(s/1024).toFixed(2)}KB > ${(i/1024).toFixed(2)}KB)`:`Summary mode enabled`,matchesSummary:t.slice(0,10).map(e=>({scriptId:e.scriptId,url:e.url,line:e.line,preview:`${(e.context??``).substring(0,100)}...`})),recommendations:[`Use more specific keywords.`,`Reduce maxMatches (current: ${n}).`,`Use get_script_source for targeted file retrieval.`]})}return a(o)}async handleExtractFunctionTree(e){let t=c(e,`scriptId`),n=c(e,`functionName`);if(!t)return a({success:!1,error:`scriptId is required`,hint:`Use get_all_scripts() to list available scripts and their scriptIds`});if(!n)return a({success:!1,error:`functionName is required`,hint:`Specify the name of the function to extract`});await this.scriptManager.init();let r=await this.scriptManager.getAllScripts();if(!r.some(e=>String(e.scriptId)===String(t))){let e=r.slice(0,10).map(e=>({scriptId:e.scriptId,url:e.url?.substring(0,80)}));return a({success:!1,error:`Script not found: ${t}`,hint:`The specified scriptId does not exist. Use get_all_scripts() to list available scripts.`,availableScripts:e.length>0?e:`No scripts loaded. Navigate to a page first.`,totalScripts:r.length})}try{return a({success:!0,...await this.scriptManager.extractFunctionTree(t,n,{maxDepth:d(e,`maxDepth`),maxSize:d(e,`maxSize`),includeComments:p(e,`includeComments`)})})}catch(e){return a({success:!1,error:e instanceof Error?e.message:String(e),hint:`Make sure the function name exists in the specified script`})}}async handleDeobfuscate(e){let t=this.requireCodeArg(e,`deobfuscate`);if(!t)return a({success:!1,error:`code is required and must be a non-empty string`});if(u(e,`engine`,new Set([`auto`,`webcrack`]),`auto`)===`webcrack`)return a(await this.advancedDeobfuscator.deobfuscate({code:t,...this.extractWebcrackArgs(e),...typeof e.detectOnly==`boolean`?{detectOnly:e.detectOnly}:{}}));let n=await this.deobfuscator.deobfuscate({code:t,...this.extractWebcrackArgs(e)});return n&&typeof n==`object`&&`success`in n&&n.success===!1&&!(`error`in n)?a({...n,error:n.reason||`deobfuscation failed`}):a(n)}async handleUnderstandCode(e){let t=this.requireCodeArg(e,`understand_code`);return a(t?await this.analyzer.understand({code:t,context:l(e,`context`),focus:u(e,`focus`,ge,`all`)}):{success:!1,error:`code is required and must be a non-empty string`})}async handleDetectCrypto(e){let t=this.requireCodeArg(e,`detect_crypto`);return a(t?await this.cryptoDetector.detect({code:t}):{success:!1,error:`code is required and must be a non-empty string`})}async handleManageHooks(e){let t=f(e,`action`);switch(t){case`create`:return a(await this.hookManager.createHook({target:f(e,`target`),type:u(e,`type`,$)??`function`,action:u(e,`hookAction`,_e,`log`),customCode:c(e,`customCode`)}));case`list`:return a({hooks:this.hookManager.getAllHooks()});case`records`:return a({records:this.hookManager.getHookRecords(f(e,`hookId`))});case`clear`:return this.hookManager.clearHookRecords(c(e,`hookId`)),a({success:!0,message:`Hook records cleared`});default:return a({success:!1,message:`Unknown hook action: ${t}. Valid actions: create, list, records, clear`})}}async handleDetectObfuscation(e){let t=this.requireCodeArg(e,`detect_obfuscation`);if(!t)return a({success:!1,error:`code is required and must be a non-empty string`});let n=p(e,`generateReport`,!0),r=this.obfuscationDetector.detect(t);if(!n)return a(r);let i=this.obfuscationDetector.generateReport(r);return o(`${JSON.stringify(r,null,2)}\n\n${i}`)}async handleWebcrackUnpack(e){let t=this.requireCodeArg(e,`webcrack_unpack`);if(!t)return a({success:!1,error:`code is required and must be a non-empty string`});let n=await g(t,{unpack:p(e,`unpack`,!0),unminify:p(e,`unminify`,!0),jsx:p(e,`jsx`,!0),mangle:p(e,`mangle`,!1),...this.extractWebcrackArgs(e)});return n.applied?a({success:!0,code:n.code,bundle:n.bundle,savedTo:n.savedTo,savedArtifacts:n.savedArtifacts,optionsUsed:n.optionsUsed,engine:`webcrack`}):a({success:!1,error:n.reason||`webcrack execution failed`,optionsUsed:n.optionsUsed,engine:`webcrack`})}async handleWebpackEnumerate(e){return pe(this.collector,e)}async handleClearCollectedData(){try{return await this.collector.clearAllData(),this.scriptManager.clear(),a({success:!0,message:`All collected data cleared.`,cleared:{fileCache:!0,compressionCache:!0,collectedUrls:!0,scriptManager:!0}})}catch(t){return e.error(`Failed to clear collected data:`,t),a(i(t))}}async handleGetCollectionStats(){try{let e=await this.collector.getAllStats();return a({success:!0,stats:e,summary:{totalCachedFiles:e.cache.memoryEntries+e.cache.diskEntries,totalCacheSize:`${(e.cache.totalSize/1024).toFixed(2)} KB`,compressionRatio:`${e.compression.averageRatio.toFixed(1)}%`,cacheHitRate:e.compression.cacheHits>0?`${(e.compression.cacheHits/(e.compression.cacheHits+e.compression.cacheMisses)*100).toFixed(1)}%`:`0%`,collectedUrls:e.collector.collectedUrls}})}catch(t){return e.error(`Failed to get collection stats:`,t),a(i(t))}}async handleJsDeobfuscateJsvmp(e){let t=this.requireCodeArg(e,`js_deobfuscate_jsvmp`);if(!t)return a({success:!1,error:`code is required and must be a non-empty string`});let n=p(e,`detectOnly`,!1),r=await this.jsvmpDeobfuscator.deobfuscate({code:t,aggressive:p(e,`aggressive`,!1),extractInstructions:p(e,`extractInstructions`,!0),timeout:d(e,`timeout`,3e4)});return a(n?{success:!0,isJSVMP:r.isJSVMP,vmType:r.vmType,vmFeatures:r.vmFeatures,confidence:r.confidence,instructionCount:r.instructions?.length}:{success:r.isJSVMP,isJSVMP:r.isJSVMP,vmType:r.vmType,vmFeatures:r.vmFeatures,instructions:r.instructions,deobfuscatedCode:r.deobfuscatedCode,confidence:r.confidence,warnings:r.warnings,unresolvedParts:r.unresolvedParts,stats:r.stats})}async handleJsDeobfuscatePipeline(e){let t=this.requireCodeArg(e,`js_deobfuscate_pipeline`);if(!t)return a({success:!1,error:`code is required`});let n=p(e,`useWebcrack`,!0),r=p(e,`aggressive`,!1),i=p(e,`humanize`,!0),o=p(e,`returnStageDetails`,!1),s=Date.now(),c=t,l=[],u=L(c);u!==c&&(c=u,l.push(`constant_fold`));let d=R(c);d!==c&&(c=d,l.push(`dead_code_remove`));let f=c,m=!1,h,_;if(n)try{let e=await g(c,{unminify:!0,unpack:!0});e.applied?(f=e.code,m=!0):h=e.reason?`webcrack stage did not apply: ${e.reason}`:`webcrack stage did not apply any transformation.`}catch(e){_=e instanceof Error?e.message:String(e)}if(r){let e=z(f);e!==f&&(f=e)}let v=f,y=0;if(i){let e=B(v);e.code!==v&&(v=e.code,y=e.count)}let b=Date.now()-s,x=t.length>0?1-v.length/t.length:0,S={success:!h&&!_,deobfuscatedCode:v,...h?{warning:h}:{},..._?{error:`webcrack stage failed: ${_}`}:{},stats:{originalSize:t.length,finalSize:v.length,reductionRate:Math.round(x*1e3)/10,processingTimeMs:b,stages:{preprocessor:{transforms:l,sizeAfter:c.length},deobfuscator:{webcrackApplied:m,sizeAfter:f.length,...h?{warning:h}:{},..._?{error:_}:{}},humanizer:{renameCount:y,sizeAfter:v.length}}}};return o&&(S.stageDetails={preprocessed:c.substring(0,5e3),deobfuscated:f.substring(0,5e3)}),a(S)}async handleJsAnalyzeVm(e){let t=this.requireCodeArg(e,`js_analyze_vm`);if(!t)return a({success:!1,error:`code is required`});let n=p(e,`extractBytecode`,!0);return a(fe({code:t,extractBytecode:n,mapOpcodes:p(e,`mapOpcodes`,!0),vmResult:await this.jsvmpDeobfuscator.deobfuscate({code:t,aggressive:!1,extractInstructions:n,timeout:15e3})}))}async handleJsSolveConstraints(e){let t=this.requireCodeArg(e,`js_solve_constraints`);return a(t?ce({code:t,replaceInPlace:p(e,`replaceInPlace`,!0),maxIterations:d(e,`maxIterations`,100)}):{success:!1,error:`code is required`})}async handleAnalysisAstMatch(e){let t=c(e,`code`);if(!t)return a({success:!1,error:`code is required`});let n=c(e,`nodeType`);if(!n)return a({success:!1,error:`nodeType is required`});let r=d(e,`maxResults`,50),i=c(e,`filter`),o;if(i)try{o=JSON.parse(i)}catch{return a({success:!1,error:`filter must be valid JSON`})}let s;try{s=_.parse(t,{sourceType:`unambiguous`,plugins:[`jsx`,`typescript`]})}catch(e){return a({success:!1,error:`Parse error: ${e instanceof Error?e.message:String(e)}`})}let l=[],u=n;function f(e){if(!o)return!0;for(let[t,n]of Object.entries(o)){let r=t.split(`.`),i=e;for(let e of r){if(typeof i!=`object`||!i)return!1;i=i[e]}if(String(i)!==String(n))return!1}return!0}function p(e){let t={};for(let n of Object.keys(e)){if(n===`type`||n===`start`||n===`end`||n===`loc`||n===`range`)continue;let r=e[n];r==null||typeof r==`string`||typeof r==`number`||typeof r==`boolean`?t[n]=r:Array.isArray(r)&&r.length<=5?t[n]=r.map(e=>typeof e==`object`&&e&&`type`in e?{type:e.type}:e):typeof r==`object`&&r&&`type`in r&&(t[n]={type:r.type})}return t}return Z(s,{enter(e){let n=e.node;n.type===u&&f(n)&&(l.push({type:n.type,start:n.start??-1,end:n.end??-1,code:t.slice(n.start??0,n.end??0),properties:p(n)}),l.length>=r&&e.stop())}}),a({success:!0,matches:l,total:l.length,nodeType:n})}async handleAnalysisDeflatControlFlow(e){let t=c(e,`code`);if(!t)return a({success:!1,error:`code is required`});let n;try{n=_.parse(t,{sourceType:`unambiguous`})}catch(e){return a({success:!1,error:`Parse error: ${e instanceof Error?e.message:String(e)}`})}let r=p(e,`removeDispatcher`,!0),i=this.preprocessDeflatCode(t);if(i.code!==t)try{n=_.parse(i.code,{sourceType:`unambiguous`})}catch(e){return a({success:!1,error:`Parse error: ${e instanceof Error?e.message:String(e)}`})}let o=0,s=new Set,l=this.resolveDispatcherArray.bind(this);Z(n,{WhileStatement:e=>{let t=e.node.test;if(t.type!==`BooleanLiteral`||t.value!==!0)return;let n=e.node.body;if(n.type!==`BlockStatement`)return;let r=n.body.find(e=>e.type===`SwitchStatement`);if(!r)return;let i=r.discriminant;if(i.type!==`MemberExpression`||!i.computed)return;let a=i.object;if(a.type!==`Identifier`)return;let c=a.name,u,d=i.property;if(d.type===`Identifier`?u=d.name:d.type===`UpdateExpression`&&d.argument.type===`Identifier`&&(u=d.argument.name),!u)return;let f=r.cases;if(f.length===0)return;let p=new Map;for(let e of f)!e.test||e.test.type!==`StringLiteral`||p.set(e.test.value,e.consequent);let m=e.scope.getBinding(c),h=e.scope.getBinding(u);if(!m||!h)return;let g=l(e,c);if(!g)return;let _=[];if(g.type===`ArrayExpression`)for(let e of g.elements)e&&e.type===`StringLiteral`&&_.push(e.value);else if(g.type===`CallExpression`&&g.callee.type===`MemberExpression`&&g.callee.property.type===`Identifier`&&g.callee.property.name===`split`&&g.arguments[0]?.type===`StringLiteral`){let e=g.arguments[0].value,t=g.callee.object;t.type===`StringLiteral`&&_.push(...t.value.split(e))}if(_.length===0)return;let v=[];for(let e of _){let t=p.get(e);if(t)for(let e of t)e.type!==`BreakStatement`&&e.type!==`ContinueStatement`&&v.push(e)}e.replaceWith(y.blockStatement(v)),s.add(m.identifier),s.add(h.identifier),o++}}),r&&s.size>0&&Z(n,{VariableDeclarator(e){if(e.node.id.type===`Identifier`&&s.has(e.node.id)){let t=e.parent;t.type===`VariableDeclaration`&&t.declarations.length===1?e.parentPath.remove():e.remove()}}});let u=Q(n,{retainLines:!0}).code;return a({success:!0,code:u,flattenedCount:o,dispatchersRemoved:r?s.size:0,helperTransforms:i.transforms})}async handleAnalysisDecodeStringArray(e){let t=c(e,`code`);if(!t)return a({success:!1,error:`code is required`});let n=d(e,`maxReplacements`,200),r=p(e,`removeRotation`,!0),i=r?me(t):t,o=new Map,s;try{s=_.parse(i,{sourceType:`unambiguous`,plugins:[`jsx`,`typescript`]})}catch(e){return a({success:!1,error:`Parse error: ${e instanceof Error?e.message:String(e)}`})}Z(s,{VariableDeclarator(e){if(!y.isIdentifier(e.node.id)||!y.isArrayExpression(e.node.init))return;let t=[];for(let n of e.node.init.elements){if(!y.isStringLiteral(n))return;t.push(n.value)}o.set(e.node.id.name,t)}});let l=[],u=0;return Z(s,{CallExpression(e){if(u>=n){e.stop();return}if(!y.isIdentifier(e.node.callee))return;let t=e.node.callee.name,r=o.get(t);if(!r||e.node.arguments.length!==1)return;let i=e.node.arguments[0];if(!y.isNumericLiteral(i)&&!y.isStringLiteral(i))return;let a=y.isNumericLiteral(i)?i.value:i.value.startsWith(`0x`)?Number.parseInt(i.value,16):Number(i.value);if(!Number.isInteger(a)||a<0||a>=r.length)return;let s=r[a];typeof s==`string`&&(l.push({arrayName:t,index:a,value:s,original:Q(e.node,{compact:!0}).code}),e.replaceWith(y.stringLiteral(s)),u+=1)}}),a({success:!0,code:Q(s,{retainLines:!0}).code,replacedCount:u,arraysFound:o.size,rotationRemoved:r&&i!==t,replacements:l})}preprocessDeflatCode(e){let t=e,n=[];return t=t.replace(/(\b[a-zA-Z_$][\w$]*)\[['"]([a-zA-Z_$][\w$]*)['"]\]\(([^)]*)\)/g,(e,t,r,i)=>ve.has(r)?(n.push(`helper-member-call`),`${t}.${r}(${i})`):e),{code:t,transforms:n}}resolveDispatcherArray(e,t){let n=e.scope.getBinding(t);if(!n?.path.isVariableDeclarator())return null;let r=n.path.node.init;if(r)return r;let i=n.path.parentPath;if(!i.isVariableDeclaration())return null;let a=i.getAllNextSiblings();for(let e of a){if(!e.isExpressionStatement())continue;let n=e.node.expression;if(!(!y.isAssignmentExpression(n)||n.operator!==`=`||!y.isIdentifier(n.left,{name:t})))return n.right}return null}};export{ye as CoreAnalysisHandlers};
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { o as evaluateOnNewDocumentWithTimeout, s as evaluateWithTimeout } from "./PageController-Bqm2kZ_X.mjs";
|
|
3
|
-
import "./definitions-B18eyf0B.mjs";
|
|
4
|
-
//#region src/server/domains/antidebug/scripts.data.bypass-core.ts
|
|
5
|
-
const ANTI_DEBUG_BYPASS_CORE_SCRIPTS = {
|
|
6
|
-
bypassDebuggerStatement: `(function () {
|
|
1
|
+
import{o as e,r as t,t as n}from"./parse-args-Cuk7-xUt.mjs";import{o as r,s as i}from"./PageController-D9jVkH0i.mjs";import"./definitions-BGwNSkVm.mjs";const a={bypassDebuggerStatement:`(function () {
|
|
7
2
|
var globalObj = typeof window !== 'undefined' ? window : globalThis;
|
|
8
3
|
var installFlag = '__ANTI_DEBUGGER_STATEMENT_INSTALLED__';
|
|
9
4
|
if (Object.prototype.hasOwnProperty.call(globalObj, installFlag)) {
|
|
@@ -155,8 +150,7 @@ const ANTI_DEBUG_BYPASS_CORE_SCRIPTS = {
|
|
|
155
150
|
for (var i = 0; i < existingScripts.length; i += 1) {
|
|
156
151
|
patchScriptElement(existingScripts[i]);
|
|
157
152
|
}
|
|
158
|
-
})();`,
|
|
159
|
-
bypassTiming: `(function () {
|
|
153
|
+
})();`,bypassTiming:`(function () {
|
|
160
154
|
var globalObj = typeof window !== 'undefined' ? window : globalThis;
|
|
161
155
|
var installFlag = '__ANTI_DEBUG_TIMING_INSTALLED__';
|
|
162
156
|
if (Object.prototype.hasOwnProperty.call(globalObj, installFlag)) {
|
|
@@ -292,8 +286,7 @@ const ANTI_DEBUG_BYPASS_CORE_SCRIPTS = {
|
|
|
292
286
|
console.timeEnd = wrappedTimeEnd;
|
|
293
287
|
} catch (_) {}
|
|
294
288
|
}
|
|
295
|
-
})();`,
|
|
296
|
-
bypassStackTrace: `(function () {
|
|
289
|
+
})();`,bypassStackTrace:`(function () {
|
|
297
290
|
var globalObj = typeof window !== 'undefined' ? window : globalThis;
|
|
298
291
|
var installFlag = '__ANTI_DEBUG_STACK_TRACE_INSTALLED__';
|
|
299
292
|
if (Object.prototype.hasOwnProperty.call(globalObj, installFlag)) {
|
|
@@ -493,11 +486,7 @@ const ANTI_DEBUG_BYPASS_CORE_SCRIPTS = {
|
|
|
493
486
|
globalObj.Error = PatchedError;
|
|
494
487
|
} catch (_) {}
|
|
495
488
|
}
|
|
496
|
-
})();`
|
|
497
|
-
};
|
|
498
|
-
//#endregion
|
|
499
|
-
//#region src/server/domains/antidebug/scripts.data.bypass-console.ts
|
|
500
|
-
const ANTI_DEBUG_BYPASS_CONSOLE_SCRIPT = { bypassConsoleDetect: `(function () {
|
|
489
|
+
})();`},o={bypassConsoleDetect:`(function () {
|
|
501
490
|
var globalObj = typeof window !== 'undefined' ? window : globalThis;
|
|
502
491
|
var installFlag = '__ANTI_DEBUG_CONSOLE_INSTALLED__';
|
|
503
492
|
if (Object.prototype.hasOwnProperty.call(globalObj, installFlag)) {
|
|
@@ -574,7 +563,8 @@ const ANTI_DEBUG_BYPASS_CONSOLE_SCRIPT = { bypassConsoleDetect: `(function () {
|
|
|
574
563
|
}
|
|
575
564
|
|
|
576
565
|
var valueType = typeof value;
|
|
577
|
-
if (value == null || valueType === 'string' || valueType === 'number' || valueType === 'boolean' || valueType === 'bigint')
|
|
566
|
+
if (value == null || valueType === 'string' || valueType === 'number' || valueType === 'boolean' || valueType === 'bigint')
|
|
567
|
+
{
|
|
578
568
|
return value;
|
|
579
569
|
}
|
|
580
570
|
|
|
@@ -682,10 +672,7 @@ const ANTI_DEBUG_BYPASS_CONSOLE_SCRIPT = { bypassConsoleDetect: `(function () {
|
|
|
682
672
|
} catch (_) {}
|
|
683
673
|
}
|
|
684
674
|
}
|
|
685
|
-
})();`
|
|
686
|
-
//#endregion
|
|
687
|
-
//#region src/server/domains/antidebug/scripts.data.detect.ts
|
|
688
|
-
const ANTI_DEBUG_DETECT_SCRIPTS = { detectProtections: `(async function () {
|
|
675
|
+
})();`},s={detectProtections:`(async function () {
|
|
689
676
|
function pushUnique(list, value) {
|
|
690
677
|
if (list.indexOf(value) === -1) {
|
|
691
678
|
list.push(value);
|
|
@@ -840,242 +827,4 @@ const ANTI_DEBUG_DETECT_SCRIPTS = { detectProtections: `(async function () {
|
|
|
840
827
|
sourceBytesApprox: sourceBlob.length
|
|
841
828
|
}
|
|
842
829
|
};
|
|
843
|
-
})();` };
|
|
844
|
-
//#endregion
|
|
845
|
-
//#region src/server/domains/antidebug/scripts.data.ts
|
|
846
|
-
const ANTI_DEBUG_SCRIPTS = {
|
|
847
|
-
...ANTI_DEBUG_BYPASS_CORE_SCRIPTS,
|
|
848
|
-
...ANTI_DEBUG_BYPASS_CONSOLE_SCRIPT,
|
|
849
|
-
...ANTI_DEBUG_DETECT_SCRIPTS
|
|
850
|
-
};
|
|
851
|
-
//#endregion
|
|
852
|
-
//#region src/server/domains/antidebug/handlers.ts
|
|
853
|
-
var AntiDebugToolHandlers = class AntiDebugToolHandlers {
|
|
854
|
-
static DEFAULT_DEBUGGER_MODE = "remove";
|
|
855
|
-
static DEFAULT_MAX_DRIFT = 50;
|
|
856
|
-
static DEFAULT_STACK_FILTER_PATTERNS = [
|
|
857
|
-
"puppeteer",
|
|
858
|
-
"devtools",
|
|
859
|
-
"__puppeteer",
|
|
860
|
-
"CDP"
|
|
861
|
-
];
|
|
862
|
-
constructor(collector) {
|
|
863
|
-
this.collector = collector;
|
|
864
|
-
}
|
|
865
|
-
toTextResponse(payload) {
|
|
866
|
-
return { content: [{
|
|
867
|
-
type: "text",
|
|
868
|
-
text: JSON.stringify(payload, null, 2)
|
|
869
|
-
}] };
|
|
870
|
-
}
|
|
871
|
-
parseDebuggerMode(value) {
|
|
872
|
-
if (value === "remove" || value === "noop") return value;
|
|
873
|
-
if (typeof value === "string") {
|
|
874
|
-
const normalized = value.trim().toLowerCase();
|
|
875
|
-
if (normalized === "remove" || normalized === "noop") return normalized;
|
|
876
|
-
}
|
|
877
|
-
return AntiDebugToolHandlers.DEFAULT_DEBUGGER_MODE;
|
|
878
|
-
}
|
|
879
|
-
mergeStackFilterPatterns(extraPatterns) {
|
|
880
|
-
const merged = [...AntiDebugToolHandlers.DEFAULT_STACK_FILTER_PATTERNS, ...extraPatterns].map((item) => item.trim());
|
|
881
|
-
return Array.from(new Set(merged.filter((item) => item.length > 0)));
|
|
882
|
-
}
|
|
883
|
-
buildScript(template, replacements) {
|
|
884
|
-
let output = template;
|
|
885
|
-
for (const [token, value] of Object.entries(replacements)) output = output.split(token).join(value);
|
|
886
|
-
return output;
|
|
887
|
-
}
|
|
888
|
-
buildDebuggerBypassScript(mode) {
|
|
889
|
-
return this.buildScript(ANTI_DEBUG_SCRIPTS.bypassDebuggerStatement, { __ANTI_DEBUG_MODE__: JSON.stringify(mode) });
|
|
890
|
-
}
|
|
891
|
-
buildTimingBypassScript(maxDrift) {
|
|
892
|
-
return this.buildScript(ANTI_DEBUG_SCRIPTS.bypassTiming, { __ANTI_DEBUG_MAX_DRIFT__: String(maxDrift) });
|
|
893
|
-
}
|
|
894
|
-
buildStackTraceBypassScript(filterPatterns) {
|
|
895
|
-
return this.buildScript(ANTI_DEBUG_SCRIPTS.bypassStackTrace, { __ANTI_DEBUG_FILTER_PATTERNS__: JSON.stringify(filterPatterns) });
|
|
896
|
-
}
|
|
897
|
-
async injectScripts(page, scripts, persistent) {
|
|
898
|
-
if (persistent) for (const script of scripts) await evaluateOnNewDocumentWithTimeout(page, script);
|
|
899
|
-
for (const script of scripts) await evaluateWithTimeout(page, script);
|
|
900
|
-
}
|
|
901
|
-
async getPage() {
|
|
902
|
-
return this.collector.getActivePage();
|
|
903
|
-
}
|
|
904
|
-
async handleAntiDebugBypassAll(args) {
|
|
905
|
-
try {
|
|
906
|
-
const persistent = argBool(args, "persistent", true);
|
|
907
|
-
const page = await this.getPage();
|
|
908
|
-
const scripts = [
|
|
909
|
-
this.buildDebuggerBypassScript(AntiDebugToolHandlers.DEFAULT_DEBUGGER_MODE),
|
|
910
|
-
this.buildTimingBypassScript(AntiDebugToolHandlers.DEFAULT_MAX_DRIFT),
|
|
911
|
-
this.buildStackTraceBypassScript(this.mergeStackFilterPatterns([])),
|
|
912
|
-
ANTI_DEBUG_SCRIPTS.bypassConsoleDetect
|
|
913
|
-
];
|
|
914
|
-
await this.injectScripts(page, scripts, persistent);
|
|
915
|
-
return this.toTextResponse({
|
|
916
|
-
success: true,
|
|
917
|
-
tool: "antidebug_bypass_all",
|
|
918
|
-
persistent,
|
|
919
|
-
injectedCount: scripts.length,
|
|
920
|
-
injected: [
|
|
921
|
-
"bypassDebuggerStatement",
|
|
922
|
-
"bypassTiming",
|
|
923
|
-
"bypassStackTrace",
|
|
924
|
-
"bypassConsoleDetect"
|
|
925
|
-
]
|
|
926
|
-
});
|
|
927
|
-
} catch (error) {
|
|
928
|
-
return this.toTextResponse({
|
|
929
|
-
success: false,
|
|
930
|
-
tool: "antidebug_bypass_all",
|
|
931
|
-
error: error instanceof Error ? error.message : String(error)
|
|
932
|
-
});
|
|
933
|
-
}
|
|
934
|
-
}
|
|
935
|
-
async handleAntiDebugBypassDebuggerStatement(args) {
|
|
936
|
-
try {
|
|
937
|
-
const mode = this.parseDebuggerMode(args.mode);
|
|
938
|
-
const page = await this.getPage();
|
|
939
|
-
const script = this.buildDebuggerBypassScript(mode);
|
|
940
|
-
await this.injectScripts(page, [script], true);
|
|
941
|
-
return this.toTextResponse({
|
|
942
|
-
success: true,
|
|
943
|
-
tool: "antidebug_bypass_debugger_statement",
|
|
944
|
-
mode,
|
|
945
|
-
persistent: true
|
|
946
|
-
});
|
|
947
|
-
} catch (error) {
|
|
948
|
-
return this.toTextResponse({
|
|
949
|
-
success: false,
|
|
950
|
-
tool: "antidebug_bypass_debugger_statement",
|
|
951
|
-
error: error instanceof Error ? error.message : String(error)
|
|
952
|
-
});
|
|
953
|
-
}
|
|
954
|
-
}
|
|
955
|
-
async handleAntiDebugBypassTiming(args) {
|
|
956
|
-
try {
|
|
957
|
-
const maxDrift = argNumber(args, "maxDrift", AntiDebugToolHandlers.DEFAULT_MAX_DRIFT) ?? AntiDebugToolHandlers.DEFAULT_MAX_DRIFT;
|
|
958
|
-
const page = await this.getPage();
|
|
959
|
-
const script = this.buildTimingBypassScript(maxDrift);
|
|
960
|
-
await this.injectScripts(page, [script], true);
|
|
961
|
-
return this.toTextResponse({
|
|
962
|
-
success: true,
|
|
963
|
-
tool: "antidebug_bypass_timing",
|
|
964
|
-
maxDrift,
|
|
965
|
-
persistent: true
|
|
966
|
-
});
|
|
967
|
-
} catch (error) {
|
|
968
|
-
return this.toTextResponse({
|
|
969
|
-
success: false,
|
|
970
|
-
tool: "antidebug_bypass_timing",
|
|
971
|
-
error: error instanceof Error ? error.message : String(error)
|
|
972
|
-
});
|
|
973
|
-
}
|
|
974
|
-
}
|
|
975
|
-
async handleAntiDebugBypassStackTrace(args) {
|
|
976
|
-
try {
|
|
977
|
-
const userPatterns = argStringArray(args, "filterPatterns");
|
|
978
|
-
const mergedPatterns = this.mergeStackFilterPatterns(userPatterns);
|
|
979
|
-
const page = await this.getPage();
|
|
980
|
-
const script = this.buildStackTraceBypassScript(mergedPatterns);
|
|
981
|
-
await this.injectScripts(page, [script], true);
|
|
982
|
-
return this.toTextResponse({
|
|
983
|
-
success: true,
|
|
984
|
-
tool: "antidebug_bypass_stack_trace",
|
|
985
|
-
filterPatterns: mergedPatterns,
|
|
986
|
-
persistent: true
|
|
987
|
-
});
|
|
988
|
-
} catch (error) {
|
|
989
|
-
return this.toTextResponse({
|
|
990
|
-
success: false,
|
|
991
|
-
tool: "antidebug_bypass_stack_trace",
|
|
992
|
-
error: error instanceof Error ? error.message : String(error)
|
|
993
|
-
});
|
|
994
|
-
}
|
|
995
|
-
}
|
|
996
|
-
async handleAntiDebugBypassConsoleDetect(_args) {
|
|
997
|
-
try {
|
|
998
|
-
const page = await this.getPage();
|
|
999
|
-
await this.injectScripts(page, [ANTI_DEBUG_SCRIPTS.bypassConsoleDetect], true);
|
|
1000
|
-
return this.toTextResponse({
|
|
1001
|
-
success: true,
|
|
1002
|
-
tool: "antidebug_bypass_console_detect",
|
|
1003
|
-
persistent: true
|
|
1004
|
-
});
|
|
1005
|
-
} catch (error) {
|
|
1006
|
-
return this.toTextResponse({
|
|
1007
|
-
success: false,
|
|
1008
|
-
tool: "antidebug_bypass_console_detect",
|
|
1009
|
-
error: error instanceof Error ? error.message : String(error)
|
|
1010
|
-
});
|
|
1011
|
-
}
|
|
1012
|
-
}
|
|
1013
|
-
async handleAntiDebugDetectProtections(_args) {
|
|
1014
|
-
try {
|
|
1015
|
-
const result = await evaluateWithTimeout(await this.getPage(), ANTI_DEBUG_SCRIPTS.detectProtections);
|
|
1016
|
-
return this.toTextResponse({
|
|
1017
|
-
success: result?.success ?? true,
|
|
1018
|
-
tool: "antidebug_detect_protections",
|
|
1019
|
-
detected: result?.detected ?? false,
|
|
1020
|
-
count: result?.count ?? 0,
|
|
1021
|
-
protections: result?.protections ?? [],
|
|
1022
|
-
recommendations: result?.recommendations ?? [],
|
|
1023
|
-
evidence: result?.evidence ?? {}
|
|
1024
|
-
});
|
|
1025
|
-
} catch (error) {
|
|
1026
|
-
return this.toTextResponse({
|
|
1027
|
-
success: false,
|
|
1028
|
-
tool: "antidebug_detect_protections",
|
|
1029
|
-
error: error instanceof Error ? error.message : String(error)
|
|
1030
|
-
});
|
|
1031
|
-
}
|
|
1032
|
-
}
|
|
1033
|
-
async handleAntidebugBypass(args) {
|
|
1034
|
-
const rawTypes = args["types"];
|
|
1035
|
-
const typesArr = Array.isArray(rawTypes) ? rawTypes : ["all"];
|
|
1036
|
-
const types = typesArr.length === 0 ? ["all"] : typesArr;
|
|
1037
|
-
if (types.includes("all")) return this.handleAntiDebugBypassAll(args);
|
|
1038
|
-
const persistent = argBool(args, "persistent", true);
|
|
1039
|
-
const mode = this.parseDebuggerMode(args["mode"]);
|
|
1040
|
-
const maxDrift = argNumber(args, "maxDrift", AntiDebugToolHandlers.DEFAULT_MAX_DRIFT) ?? AntiDebugToolHandlers.DEFAULT_MAX_DRIFT;
|
|
1041
|
-
const userPatterns = argStringArray(args, "filterPatterns");
|
|
1042
|
-
const applied = [];
|
|
1043
|
-
try {
|
|
1044
|
-
const page = await this.getPage();
|
|
1045
|
-
if (types.includes("debugger_statement")) {
|
|
1046
|
-
const script = this.buildDebuggerBypassScript(mode);
|
|
1047
|
-
await this.injectScripts(page, [script], persistent);
|
|
1048
|
-
applied.push("debugger_statement");
|
|
1049
|
-
}
|
|
1050
|
-
if (types.includes("timing")) {
|
|
1051
|
-
const script = this.buildTimingBypassScript(maxDrift);
|
|
1052
|
-
await this.injectScripts(page, [script], persistent);
|
|
1053
|
-
applied.push("timing");
|
|
1054
|
-
}
|
|
1055
|
-
if (types.includes("stack_trace")) {
|
|
1056
|
-
const mergedPatterns = this.mergeStackFilterPatterns(userPatterns);
|
|
1057
|
-
const script = this.buildStackTraceBypassScript(mergedPatterns);
|
|
1058
|
-
await this.injectScripts(page, [script], persistent);
|
|
1059
|
-
applied.push("stack_trace");
|
|
1060
|
-
}
|
|
1061
|
-
if (types.includes("console_detect")) {
|
|
1062
|
-
await this.injectScripts(page, [ANTI_DEBUG_SCRIPTS.bypassConsoleDetect], persistent);
|
|
1063
|
-
applied.push("console_detect");
|
|
1064
|
-
}
|
|
1065
|
-
return this.toTextResponse({
|
|
1066
|
-
success: true,
|
|
1067
|
-
tool: "antidebug_bypass",
|
|
1068
|
-
applied,
|
|
1069
|
-
persistent
|
|
1070
|
-
});
|
|
1071
|
-
} catch (error) {
|
|
1072
|
-
return this.toTextResponse({
|
|
1073
|
-
success: false,
|
|
1074
|
-
tool: "antidebug_bypass",
|
|
1075
|
-
error: error instanceof Error ? error.message : String(error)
|
|
1076
|
-
});
|
|
1077
|
-
}
|
|
1078
|
-
}
|
|
1079
|
-
};
|
|
1080
|
-
//#endregion
|
|
1081
|
-
export { AntiDebugToolHandlers };
|
|
830
|
+
})();`},c={...a,...o,...s};var l=class a{collector;static DEFAULT_DEBUGGER_MODE=`remove`;static DEFAULT_MAX_DRIFT=50;static DEFAULT_STACK_FILTER_PATTERNS=[`puppeteer`,`devtools`,`__puppeteer`,`CDP`];constructor(e){this.collector=e}toTextResponse(e){return{content:[{type:`text`,text:JSON.stringify(e,null,2)}]}}parseDebuggerMode(e){if(e===`remove`||e===`noop`)return e;if(typeof e==`string`){let t=e.trim().toLowerCase();if(t===`remove`||t===`noop`)return t}return a.DEFAULT_DEBUGGER_MODE}mergeStackFilterPatterns(e){let t=[...a.DEFAULT_STACK_FILTER_PATTERNS,...e].map(e=>e.trim());return Array.from(new Set(t.filter(e=>e.length>0)))}buildScript(e,t){let n=e;for(let[e,r]of Object.entries(t))n=n.split(e).join(r);return n}buildDebuggerBypassScript(e){return this.buildScript(c.bypassDebuggerStatement,{__ANTI_DEBUG_MODE__:JSON.stringify(e)})}buildTimingBypassScript(e){return this.buildScript(c.bypassTiming,{__ANTI_DEBUG_MAX_DRIFT__:String(e)})}buildStackTraceBypassScript(e){return this.buildScript(c.bypassStackTrace,{__ANTI_DEBUG_FILTER_PATTERNS__:JSON.stringify(e)})}async injectScripts(e,t,n){if(n)for(let n of t)await r(e,n);for(let n of t)await i(e,n)}async getPage(){return this.collector.getActivePage()}async handleAntiDebugBypassAll(e){try{let t=n(e,`persistent`,!0),r=await this.getPage(),i=[this.buildDebuggerBypassScript(a.DEFAULT_DEBUGGER_MODE),this.buildTimingBypassScript(a.DEFAULT_MAX_DRIFT),this.buildStackTraceBypassScript(this.mergeStackFilterPatterns([])),c.bypassConsoleDetect];return await this.injectScripts(r,i,t),this.toTextResponse({success:!0,tool:`antidebug_bypass_all`,persistent:t,injectedCount:i.length,injected:[`bypassDebuggerStatement`,`bypassTiming`,`bypassStackTrace`,`bypassConsoleDetect`]})}catch(e){return this.toTextResponse({success:!1,tool:`antidebug_bypass_all`,error:e instanceof Error?e.message:String(e)})}}async handleAntiDebugBypassDebuggerStatement(e){try{let t=this.parseDebuggerMode(e.mode),n=await this.getPage(),r=this.buildDebuggerBypassScript(t);return await this.injectScripts(n,[r],!0),this.toTextResponse({success:!0,tool:`antidebug_bypass_debugger_statement`,mode:t,persistent:!0})}catch(e){return this.toTextResponse({success:!1,tool:`antidebug_bypass_debugger_statement`,error:e instanceof Error?e.message:String(e)})}}async handleAntiDebugBypassTiming(e){try{let n=t(e,`maxDrift`,a.DEFAULT_MAX_DRIFT)??a.DEFAULT_MAX_DRIFT,r=await this.getPage(),i=this.buildTimingBypassScript(n);return await this.injectScripts(r,[i],!0),this.toTextResponse({success:!0,tool:`antidebug_bypass_timing`,maxDrift:n,persistent:!0})}catch(e){return this.toTextResponse({success:!1,tool:`antidebug_bypass_timing`,error:e instanceof Error?e.message:String(e)})}}async handleAntiDebugBypassStackTrace(t){try{let n=e(t,`filterPatterns`),r=this.mergeStackFilterPatterns(n),i=await this.getPage(),a=this.buildStackTraceBypassScript(r);return await this.injectScripts(i,[a],!0),this.toTextResponse({success:!0,tool:`antidebug_bypass_stack_trace`,filterPatterns:r,persistent:!0})}catch(e){return this.toTextResponse({success:!1,tool:`antidebug_bypass_stack_trace`,error:e instanceof Error?e.message:String(e)})}}async handleAntiDebugBypassConsoleDetect(e){try{let e=await this.getPage();return await this.injectScripts(e,[c.bypassConsoleDetect],!0),this.toTextResponse({success:!0,tool:`antidebug_bypass_console_detect`,persistent:!0})}catch(e){return this.toTextResponse({success:!1,tool:`antidebug_bypass_console_detect`,error:e instanceof Error?e.message:String(e)})}}async handleAntiDebugDetectProtections(e){try{let e=await i(await this.getPage(),c.detectProtections);return this.toTextResponse({success:e?.success??!0,tool:`antidebug_detect_protections`,detected:e?.detected??!1,count:e?.count??0,protections:e?.protections??[],recommendations:e?.recommendations??[],evidence:e?.evidence??{}})}catch(e){return this.toTextResponse({success:!1,tool:`antidebug_detect_protections`,error:e instanceof Error?e.message:String(e)})}}async handleAntidebugBypass(r){let i=r.types,o=Array.isArray(i)?i:[`all`],s=o.length===0?[`all`]:o;if(s.includes(`all`))return this.handleAntiDebugBypassAll(r);let l=n(r,`persistent`,!0),u=this.parseDebuggerMode(r.mode),d=t(r,`maxDrift`,a.DEFAULT_MAX_DRIFT)??a.DEFAULT_MAX_DRIFT,f=e(r,`filterPatterns`),p=[];try{let e=await this.getPage();if(s.includes(`debugger_statement`)){let t=this.buildDebuggerBypassScript(u);await this.injectScripts(e,[t],l),p.push(`debugger_statement`)}if(s.includes(`timing`)){let t=this.buildTimingBypassScript(d);await this.injectScripts(e,[t],l),p.push(`timing`)}if(s.includes(`stack_trace`)){let t=this.mergeStackFilterPatterns(f),n=this.buildStackTraceBypassScript(t);await this.injectScripts(e,[n],l),p.push(`stack_trace`)}return s.includes(`console_detect`)&&(await this.injectScripts(e,[c.bypassConsoleDetect],l),p.push(`console_detect`)),this.toTextResponse({success:!0,tool:`antidebug_bypass`,applied:p,persistent:l})}catch(e){return this.toTextResponse({success:!1,tool:`antidebug_bypass`,error:e instanceof Error?e.message:String(e)})}}};export{l as AntiDebugToolHandlers};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./logger-sBC6IdRT.mjs";import{Tr as t,b as n,y as r}from"./constants-Cp6hBrrx.mjs";import{i,l as a,n as o}from"./outputPaths-BonGThuc.mjs";import{n as s,r as c}from"./artifacts-B5xQuEa_.mjs";import{join as l,resolve as u}from"node:path";import{readdir as d,rm as f,stat as p}from"node:fs/promises";var m=class n{static instance;MAX_TOKENS=t;WARNING_THRESHOLDS=[.8,.9,.95];BYTES_PER_TOKEN=4;AUTO_CLEANUP_THRESHOLD=.9;HISTORY_RETENTION=300*1e3;currentUsage=0;toolCallHistory=[];warnings=new Set;sessionStartTime=Date.now();trackingEnabled=!0;MAX_ESTIMATION_DEPTH=4;MAX_ESTIMATION_ARRAY_ITEMS=50;MAX_ESTIMATION_OBJECT_KEYS=50;MAX_ESTIMATION_STRING_LENGTH=2e3;MAX_ESTIMATION_BYTES=256*1024;externalCleanupFn=null;constructor(){e.info(`TokenBudgetManager initialized`)}static getInstance(){return this.instance||=new n,this.instance}setExternalCleanup(e){this.externalCleanupFn=e}recordToolCall(t,n,r){if(this.trackingEnabled)try{let i=this.calculateSize(n),a=this.calculateSize(r),o=i+a,s=this.estimateTokens(o);this.currentUsage+=s;let c={toolName:t,timestamp:Date.now(),requestSize:i,responseSize:a,estimatedTokens:s,cumulativeTokens:this.currentUsage};this.toolCallHistory.push(c),e.debug(`Token usage: ${this.currentUsage}/${this.MAX_TOKENS} (${this.getUsagePercentage()}%) | Tool: ${t} | Size: ${(o/1024).toFixed(1)}KB | Tokens: ${s}`),this.checkWarnings(),this.shouldAutoCleanup()&&this.autoCleanup()}catch(t){e.error(`Failed to record tool call:`,t)}}isRecord(e){return typeof e==`object`&&!!e}hasDetailedSummarySize(e){if(!this.isRecord(e)||!(`detailId`in e))return!1;let t=e.summary;if(!this.isRecord(t))return!1;let{size:n}=t;return typeof n==`number`&&Number.isFinite(n)&&n>0}tryEstimateMcpEnvelope(e){if(!this.isRecord(e))return null;let t=e.content;if(!Array.isArray(t)||t.length===0)return null;let n=t[0];if(!this.isRecord(n)||n.type!==`text`||typeof n.text!=`string`)return null;let r=n.text,i=r.length>this.MAX_ESTIMATION_STRING_LENGTH?`${r.slice(0,this.MAX_ESTIMATION_STRING_LENGTH)}...[truncated:${r.length}]`:r,a=42+(e.isError===!0?14:0),o=Buffer.byteLength(i,`utf8`);return Math.min(a+o,this.MAX_ESTIMATION_BYTES)}calculateSize(t){try{if(this.hasDetailedSummarySize(t))return Math.min(t.summary.size,this.MAX_ESTIMATION_BYTES);let e=this.tryEstimateMcpEnvelope(t);if(e!==null)return e;let n=this.normalizeForSizeEstimate(t,0,new WeakSet),r=JSON.stringify(n);return r?Math.min(Buffer.byteLength(r,`utf8`),this.MAX_ESTIMATION_BYTES):0}catch(t){return e.warn(`Failed to calculate data size:`,t),0}}normalizeForSizeEstimate(e,t,n){if(e==null)return e;let r=typeof e;if(r===`boolean`||r===`number`)return e;if(r===`string`){let t=e;if(t.length<=this.MAX_ESTIMATION_STRING_LENGTH)return t;let n=`...[truncated:${t.length}]`,r=Math.max(this.MAX_ESTIMATION_STRING_LENGTH-n.length,0);return`${t.slice(0,r)}${n}`}if(r===`bigint`||r===`symbol`)return e.toString();if(r===`function`)return`[Function]`;if(e instanceof Error)return{name:e.name,message:e.message,stack:e.stack?.slice(0,this.MAX_ESTIMATION_STRING_LENGTH)};if(Buffer.isBuffer(e))return`[Buffer:${e.byteLength}]`;if(t>=this.MAX_ESTIMATION_DEPTH)return Array.isArray(e)?`[Array:${e.length}]`:`[Object]`;if(Array.isArray(e)){let r=e.slice(0,this.MAX_ESTIMATION_ARRAY_ITEMS).map(e=>this.normalizeForSizeEstimate(e,t+1,n));return e.length>this.MAX_ESTIMATION_ARRAY_ITEMS&&r.push(`[truncated:${e.length-this.MAX_ESTIMATION_ARRAY_ITEMS}]`),r}if(r===`object`){if(!this.isRecord(e))return`[Object]`;if(n.has(e))return`[Circular]`;n.add(e);let r=Object.entries(e),i=r.slice(0,this.MAX_ESTIMATION_OBJECT_KEYS),a={};for(let[e,r]of i)a[e]=this.normalizeForSizeEstimate(r,t+1,n);return r.length>this.MAX_ESTIMATION_OBJECT_KEYS&&(a.__truncatedKeys=r.length-this.MAX_ESTIMATION_OBJECT_KEYS),a}return String(e)}estimateTokens(e){return Math.ceil(e/this.BYTES_PER_TOKEN)}getUsagePercentage(){return Math.round(this.currentUsage/this.MAX_TOKENS*100)}checkWarnings(){let e=this.currentUsage/this.MAX_TOKENS;for(let t of this.WARNING_THRESHOLDS)e>=t&&!this.warnings.has(t)&&(this.emitWarning(t),this.warnings.add(t))}emitWarning(t){let n=Math.round(t*100),r=this.MAX_TOKENS-this.currentUsage;e.warn(`Token Budget Warning: ${n}% used! (${this.currentUsage}/${this.MAX_TOKENS}, ${r} tokens remaining)`),t>=.95?e.warn(`CRITICAL: Consider clearing caches or starting a new session.`):t>=.9?e.warn(`HIGH: Auto-cleanup will trigger soon. Consider using summary modes.`):t>=.8&&e.warn(`MODERATE: Monitor usage. Use get_token_budget_stats for details.`)}shouldAutoCleanup(){return this.currentUsage/this.MAX_TOKENS>=this.AUTO_CLEANUP_THRESHOLD}autoCleanup(){e.info(`Auto-cleanup triggered at 90% usage.`);let t=this.currentUsage;if(this.externalCleanupFn)try{this.externalCleanupFn(),e.info(`External cleanup callback invoked`)}catch(t){e.warn(`External cleanup callback failed:`,t)}let n=Date.now()-this.HISTORY_RETENTION,r=this.toolCallHistory.length;this.toolCallHistory=this.toolCallHistory.filter(e=>e.timestamp>n);let i=r-this.toolCallHistory.length;e.info(`Removed ${i} old tool call records`),this.recalculateUsage();let a=this.currentUsage,o=t-a,s=Math.round(o/this.MAX_TOKENS*100);e.info(`Cleanup complete. Freed ${o} tokens (${s}%). Usage: ${a}/${this.MAX_TOKENS} (${this.getUsagePercentage()}%)`);let c=a/this.MAX_TOKENS;this.warnings=new Set(Array.from(this.warnings).filter(e=>c>=e))}recalculateUsage(){this.currentUsage=this.toolCallHistory.reduce((e,t)=>e+t.estimatedTokens,0)}getStats(){let e=new Map;for(let t of this.toolCallHistory){let n=e.get(t.toolName)||0;e.set(t.toolName,n+t.estimatedTokens)}let t=Array.from(e.entries()).map(([e,t])=>({tool:e,tokens:t,percentage:Math.round(t/this.currentUsage*100)})).toSorted((e,t)=>t.tokens-e.tokens).slice(0,10),n=this.generateSuggestions(t),r=this.toolCallHistory.slice(-20);return{currentUsage:this.currentUsage,maxTokens:this.MAX_TOKENS,usagePercentage:this.getUsagePercentage(),toolCallCount:this.toolCallHistory.length,topTools:t,warnings:Array.from(this.warnings).map(e=>Math.round(e*100)),recentCalls:r,suggestions:n,sessionStartTime:this.sessionStartTime}}generateSuggestions(e){let t=[],n=this.currentUsage/this.MAX_TOKENS;n>=.95?t.push(` CRITICAL: Clear all caches immediately or start a new session`):n>=.9?t.push(`HIGH: Auto-cleanup triggered. Consider manual cleanup for better control`):n>=.8&&t.push(`MODERATE: Monitor usage closely. Use summary modes for large data`);for(let{tool:n,percentage:r}of e)r>30&&(n.includes(`collect_code`)?t.push(` ${n} uses ${r}% tokens. Try smartMode="summary" or "priority"`):n.includes(`get_script_source`)?t.push(` ${n} uses ${r}% tokens. Try preview=true first`):n.includes(`network_get_requests`)?t.push(` ${n} uses ${r}% tokens. Reduce limit or use filters`):n.includes(`page_evaluate`)&&t.push(` ${n} uses ${r}% tokens. Query specific properties instead of full objects`));return t.length===0&&t.push(` Token usage is healthy. Continue monitoring.`),t}manualCleanup(){e.info(`Manual cleanup requested.`),this.autoCleanup()}setTrackingEnabled(t){this.trackingEnabled!==t&&(this.trackingEnabled=t,e.warn(`Token budget tracking ${t?`enabled`:`disabled`}`))}isTrackingEnabled(){return this.trackingEnabled}reset(){e.info(`Resetting token budget...`),this.currentUsage=0,this.toolCallHistory=[],this.warnings.clear(),this.sessionStartTime=Date.now(),e.info(`Token budget reset complete`)}},h=class t{static instance;GLOBAL_MAX_SIZE=r;LOW_HIT_RATE_THRESHOLD=n;caches=new Map;constructor(){e.info(`UnifiedCacheManager initialized`)}static getInstance(){return this.instance||=new t,this.instance}registerCache(t){this.caches.set(t.name,t),e.info(`Registered cache: ${t.name}`)}unregisterCache(t){this.caches.delete(t),e.info(`Unregistered cache: ${t}`)}async getGlobalStats(){let t=0,n=0,r=0,i=0,a=[];for(let[o,s]of this.caches)try{let e=await s.getStats();t+=e.entries,n+=e.size,r+=e.hits||0,i+=e.misses||0,a.push({name:o,entries:e.entries,size:e.size,sizeMB:(e.size/1024/1024).toFixed(2),hitRate:e.hitRate,ttl:e.ttl})}catch(t){e.error(`Failed to get stats for cache ${o}:`,t)}let o=r+i>0?r/(r+i):0,s=this.generateRecommendations(n,o,a);return{totalEntries:t,totalSize:n,totalSizeMB:(n/1024/1024).toFixed(2),hitRate:o,caches:a,recommendations:s}}async smartCleanup(t){let n=t||this.GLOBAL_MAX_SIZE*.7,r=await this.getGlobalStats(),i=r.totalSize;if(i<=n)return e.info(`No cleanup needed`),{before:i,after:i,freed:0,freedPercentage:0};e.info(`Smart cleanup: current ${r.totalSizeMB}MB, target ${(n/1024/1024).toFixed(2)}MB`),await this.cleanupExpired();let a=await this.getGlobalStats();if(a.totalSize<=n||(await this.cleanupLowHitRate(),a=await this.getGlobalStats(),a.totalSize<=n))return this.calculateCleanupResult(i,a.totalSize);await this.cleanupLargeItems();let o=await this.getGlobalStats();return this.calculateCleanupResult(i,o.totalSize)}async cleanupExpired(){e.info(`Cleaning up expired data...`);for(let[t,n]of this.caches)if(n.cleanup)try{await n.cleanup(),e.debug(`Cleaned up expired data in ${t}`)}catch(n){e.error(`Failed to cleanup ${t}:`,n)}}async cleanupLowHitRate(){e.info(`Cleaning up low hit rate caches...`);let t=await this.getGlobalStats(),n=t.hitRate;for(let r of t.caches)if(r.hitRate!==void 0&&r.hitRate<n*this.LOW_HIT_RATE_THRESHOLD){let t=this.caches.get(r.name);if(t?.clear)try{await t.clear(),e.info(`Cleared low hit rate cache: ${r.name} (${(r.hitRate*100).toFixed(1)}%)`)}catch(t){e.error(`Failed to clear ${r.name}:`,t)}}}async cleanupLargeItems(){e.info(`Cleaning up large caches...`);let t=(await this.getGlobalStats()).caches.toSorted((e,t)=>t.size-e.size);for(let n of t.slice(0,2)){let t=this.caches.get(n.name);if(t?.clear)try{await t.clear(),e.info(`Cleared large cache: ${n.name} (${n.sizeMB}MB)`)}catch(t){e.error(`Failed to clear ${n.name}:`,t)}}}calculateCleanupResult(t,n){let r=t-n,i=Math.round(r/this.GLOBAL_MAX_SIZE*100);return e.info(`Cleanup complete! Freed ${(r/1024/1024).toFixed(2)}MB (${i}%). Usage: ${(n/1024/1024).toFixed(2)}MB/${(this.GLOBAL_MAX_SIZE/1024/1024).toFixed(0)}MB`),{before:t,after:n,freed:r,freedPercentage:i}}async clearAll(){e.info(`Clearing all caches...`);for(let[t,n]of this.caches)if(n.clear)try{await n.clear(),e.info(`Cleared cache: ${t}`)}catch(n){e.error(`Failed to clear ${t}:`,n)}e.success(`All caches cleared`)}async preheat(t){e.info(`Preheating cache for ${t.length} URLs...`),e.info(`Cache preheat completed`)}generateRecommendations(e,t,n){let r=[],i=e/this.GLOBAL_MAX_SIZE;i>=.9?r.push(` CRITICAL: Cache size at 90%. Run smart_cache_cleanup immediately!`):i>=.7?r.push(`WARNING: Cache size at 70%. Consider cleanup soon.`):i>=.5&&r.push(`INFO: Cache size at 50%. Monitor usage.`),t<.3?r.push(` Low cache hit rate (<30%). Consider adjusting TTL or cache strategy.`):t>.7&&r.push(` Good cache hit rate (>70%). Cache is working well.`);for(let t of n){let n=t.size/e;n>.5&&r.push(` ${t.name} uses ${Math.round(n*100)}% of total cache. Consider cleanup.`),t.hitRate!==void 0&&t.hitRate<.2&&r.push(` ${t.name} has low hit rate (${(t.hitRate*100).toFixed(1)}%). Consider disabling or adjusting.`)}return r.length===0&&r.push(` Cache health is good. No action needed.`),r}};function g(e=process.env){let t=Math.max(0,parseInt(e.MCP_ARTIFACT_RETENTION_DAYS??`0`,10)||0),n=Math.max(0,parseInt(e.MCP_ARTIFACT_MAX_TOTAL_MB??`0`,10)||0),r=Math.max(0,parseInt(e.MCP_ARTIFACT_CLEANUP_INTERVAL_MINUTES??`0`,10)||0),i=[`1`,`true`].includes((e.MCP_ARTIFACT_CLEANUP_ON_START??``).toLowerCase());return{enabled:t>0||n>0,retentionDays:t,maxTotalBytes:n*1024*1024,cleanupOnStart:i,cleanupIntervalMinutes:r}}async function _(e){let t=g(),n={...t,retentionDays:e?.retentionDays??t.retentionDays,maxTotalBytes:e?.maxTotalBytes??t.maxTotalBytes},r=e?.now??Date.now(),a=e?.dryRun??!1,o=e?.directories??y(),s=n.retentionDays>0?r-n.retentionDays*864e5:0,c=0,l=0,u=0,d=0,p=0,m=[],h=[],_=i(),v=[];function S(e){v.push(f(e,{force:!0}).then(()=>void 0).catch(()=>void 0))}for(let e of o)await b(e,_,s,a,e=>{c++,s>0&&e.mtimeMs<s?(l++,u+=e.size,d+=e.size,h.length<20&&h.push(e.relativePath),a||S(e.path)):m.push(e)});if(n.maxTotalBytes>0){let e=m.reduce((e,t)=>e+t.size,0);if(e>n.maxTotalBytes){m.sort((e,t)=>e.mtimeMs-t.mtimeMs);let t=0;for(;t<m.length&&e>n.maxTotalBytes;){let n=m[t];e-=n.size,l++,u+=n.size,p+=n.size,h.length<20&&h.push(n.relativePath),a||S(n.path),t++}m.splice(0,t)}}return a||(await Promise.all(v),await Promise.all(o.map(e=>x(e)))),{success:!0,scannedFiles:c,removedFiles:l,removedBytes:u,removedByAge:d,removedBySize:p,remainingFiles:m.length,remainingBytes:m.reduce((e,t)=>e+t.size,0),dryRun:a,directories:o,removedSample:h,config:n}}function v(){let t=g();if(!t.enabled||t.cleanupIntervalMinutes<=0)return null;let n=setInterval(()=>{_().then(t=>{t.removedFiles>0&&e.info(`[artifacts] retention cleanup removed ${t.removedFiles} files (${t.removedBytes} bytes)`)}).catch(t=>{e.warn(`[artifacts] retention cleanup failed`,t)})},t.cleanupIntervalMinutes*60*1e3);return n.unref(),()=>clearInterval(n)}function y(){let e=i(),t=u(process.cwd(),`debugger-sessions`),n=u(e,`debugger-sessions`),r=new Set([c(),a().paths.screenshotDir,o(),t,n]);for(let e of[`wasm`,`traces`,`profiles`,`dumps`,`reports`,`har`,`sessions`,`tmp`])r.add(s(e));return[...r]}async function b(e,t,n,r,i){let a;try{a=await d(e,{withFileTypes:!0})}catch{return}for(let o of a){let a=l(e,o.name);if(o.isDirectory())await b(a,t,n,r,i);else if(o.isFile()){let e;try{e=await p(a)}catch{continue}i({path:a,relativePath:S(t,a),size:e.size,mtimeMs:e.mtimeMs})}}}async function x(e){let t;try{t=await d(e,{withFileTypes:!0})}catch{return}await Promise.all(t.filter(e=>e.isDirectory()).map(t=>x(l(e,t.name))));try{(await d(e)).length===0&&await f(e,{recursive:!0,force:!0})}catch{}}function S(e,t){return t.startsWith(e)?t.slice(e.length).replace(/^[\\/]/,``).replace(/\\/g,`/`):t.replace(/\\/g,`/`)}export{m as a,h as i,g as n,v as r,_ as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./chunk-C_pMuVsO.mjs";import{i as t}from"./outputPaths-BonGThuc.mjs";import{isAbsolute as n,normalize as r,relative as i,resolve as a,sep as o}from"node:path";import{mkdir as s}from"node:fs/promises";var c=e({getArtifactDir:()=>f,getArtifactsRoot:()=>d,resolveArtifactPath:()=>u});const l=`artifacts`;async function u(e){let{category:c,toolName:u,target:d,ext:f,customDir:m}=e,h=t(),g=m?a(h,m):a(h,l,c),_=i(r(h),r(g));if(_===`..`||_.startsWith(`..${o}`)||n(_))throw Error(`Path traversal blocked: artifact directory "${m}" escapes project root`);await s(g,{recursive:!0});let v=new Date().toISOString().replace(/[:.]/g,`-`).replace(`T`,`_`).slice(0,19),y=Math.random().toString(36).substring(2,8),b=a(g,`${p(u)}${d?`-${p(d)}`:``}-${v}-${y}.${f.replace(/^\./,``)}`);return{absolutePath:b,displayPath:i(h,b).replace(/\\/g,`/`)}}function d(){return a(t(),l)}function f(e){return a(t(),l,e)}function p(e){return e.replace(/[^a-zA-Z0-9_-]/g,`_`).replace(/_+/g,`_`).replace(/^_|_$/g,``).substring(0,60)}export{u as i,f as n,d as r,c as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={allowedHosts:{type:`array`,items:{type:`string`},description:`Exact hostnames or IP literals allowed for this request.`},allowedCidrs:{type:`array`,items:{type:`string`},description:`Explicit CIDR ranges allowed for this request.`},allowPrivateNetwork:{type:`boolean`,description:`Allow access to private or reserved network targets, but only when the resolved host matches allowedHosts or allowedCidrs.`},allowInsecureHttp:{type:`boolean`,description:`Allow plain HTTP access to explicitly authorized targets in allowedHosts or allowedCidrs.`},expiresAt:{type:`string`,description:`Optional ISO-8601 expiry time for this authorization.`},reason:{type:`string`,description:`Short audit note describing why this authorization is needed.`}};export{e as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createRequire as e}from"node:module";const t=e(import.meta.url),n=`pnpm add -O better-sqlite3@12.6.2`,r=`npm rebuild better-sqlite3 --foreground-scripts`;function i(e){return e instanceof Error?e.message:String(e)}function a(e){return/better-sqlite3|better_sqlite3\.node|NODE_MODULE_VERSION|compiled against a different Node\.js version/i.test(i(e))}function o(e){let t=i(e);return/Cannot find module 'better-sqlite3'|Cannot find package 'better-sqlite3'|better-sqlite3 is not installed/i.test(t)?`missing`:/better_sqlite3\.node|NODE_MODULE_VERSION|compiled against a different Node\.js version|module was compiled against/i.test(t)?`abi-mismatch`:`load-failed`}function s(e){let t=o(e),a=i(e);return t===`missing`?`GRACEFUL: better-sqlite3 is not installed. Install the optional trace backend with \`${n}\`.`:t===`abi-mismatch`?`GRACEFUL: better-sqlite3 is installed but its native binary is incompatible with the current Node.js runtime (${process.version}, ABI ${process.versions.modules}). Rebuild it with \`${r}\` or reinstall dependencies under the active Node version. Original error: ${a}`:`GRACEFUL: better-sqlite3 failed to initialize. Try \`${r}\` or reinstall dependencies under the active Node version. Original error: ${a}`}function c(){try{return t(t.resolve(`better-sqlite3/package.json`)).version??null}catch{return null}}function l(){let e=c();if(!e)return{status:`missing`,detail:`GRACEFUL: Optional SQLite backend for trace tools is not installed. Install it with: ${n}`,version:null,issue:`missing`};try{let n=new(t(`better-sqlite3`))(`:memory:`);try{n.prepare(`SELECT 1 AS ok`).get()}finally{n.close()}return{status:`ok`,detail:`installed (${e}) — native trace backend healthy`,version:e}}catch(t){let r=o(t);return r===`missing`?{status:`missing`,detail:`GRACEFUL: Optional SQLite backend for trace tools is not installed. Install it with: ${n}`,version:e,issue:r}:{status:`warn`,detail:`installed (${e}) but ${s(t)}`,version:e,issue:r}}}export{a as n,l as r,s as t};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{t as e}from"./chunk-C_pMuVsO.mjs";import{t}from"./logger-sBC6IdRT.mjs";import{Q as n,et as r,jr as i}from"./constants-Cp6hBrrx.mjs";import{t as a}from"./ToolError-DWU_z7gp.mjs";import{t as o}from"./ToolProbe-xsfALmN3.mjs";import{t as s}from"./PrerequisiteError-Bl3dK8XA.mjs";import{tmpdir as c}from"node:os";import{randomUUID as l}from"node:crypto";import{basename as u,dirname as d,join as f}from"node:path";import{access as p,mkdtemp as m,readFile as h,rm as g,writeFile as _}from"node:fs/promises";import{execFile as v}from"node:child_process";var y=class{sessions=new Map;activeSessionId;fridaProbe;probePromise;async attach(e){let t=await this.getAvailability();if(!t.available)throw new s(t.reason??`Frida CLI is not available`);let n=await this.runFridaCommand(e,`console.log("__frida_attach_ok__");`);if(n.error)throw new a(`CONNECTION`,n.error);let r=l(),i={id:r,target:e,pid:this.resolvePid(e),status:`attached`,attachedAt:new Date().toISOString()};return this.sessions.set(r,i),this.activeSessionId=r,r}async detach(){let e=this.getActiveSessionRecord();e&&(e.status=`detached`,this.activeSessionId=void 0)}async executeScript(e){let t=this.requireActiveSession(),n=await this.runFridaCommand(t.target,e);return n.error&&(t.status=`error`,t.lastError=n.error),n}async enumerateModules(){let e=this.requireActiveSession(),t=await this.runFridaCommand(e.target,`console.log(JSON.stringify(Process.enumerateModules()));`),n=this.parseModuleList(t.output);return n.length>0?n:(t.error&&(e.status=`error`,e.lastError=t.error),[])}async enumerateFunctions(e){let t=this.requireActiveSession(),n=JSON.stringify(e),r=await this.runFridaCommand(t.target,[`const entries = Process.getModuleByName(${n}).enumerateExports()`,`.filter(function (entry) { return entry.type === "function"; })`,`.map(function (entry) {`,` return { name: entry.name, address: String(entry.address), size: 0 };`,`});`,`console.log(JSON.stringify(entries));`].join(``)),i=this.parseFunctionList(r.output);return i.length>0?i:(r.error&&(t.status=`error`,t.lastError=r.error),[])}async findSymbols(e){let t=this.requireActiveSession(),n=e.trim(),r=n.includes(`:`)?n:n.includes(`!`)?`exports:${n}`:`exports:*!${n}*`,i=JSON.stringify(r),a=await this.runFridaCommand(t.target,[`const resolver = new ApiResolver("module");`,`const matches = resolver.enumerateMatches(${i});`,`const mapped = matches.map(function (entry) {`,` const resolvedName = typeof entry.name === "string" ? entry.name : "unknown";`,` const resolvedAddress = entry.address ? String(entry.address) : "0x0";`,` return { name: resolvedName, address: resolvedAddress, demangled: resolvedName };`,`});`,`console.log(JSON.stringify(mapped));`].join(``)),o=this.parseSymbolList(a.output);return o.length>0?o:(a.error&&(t.status=`error`,t.lastError=a.error),[])}listSessions(){return Array.from(this.sessions.values()).map(e=>({id:e.id,target:e.target,pid:e.pid,status:e.status}))}async isAvailable(){return(await this.getAvailability()).available}async getAvailability(){if(this.fridaProbe)return this.fridaProbe;this.probePromise||=o(`frida`);let e=await this.probePromise;return this.fridaProbe=e,this.probePromise=void 0,e}useSession(e){return this.sessions.has(e)?(this.activeSessionId=e,!0):!1}hasSession(e){return this.sessions.has(e)}getSessionDiagnostics(e){let t=this.sessions.get(e);if(t)return{status:t.status,lastError:t.lastError}}getActiveSessionRecord(){if(this.activeSessionId)return this.sessions.get(this.activeSessionId)}requireActiveSession(){let e=this.getActiveSessionRecord();if(!e)throw new s(`No active Frida session. Call attach() first.`);return e}resolvePid(e){if(!/^\d+$/.test(e))return null;let t=Number.parseInt(e,10);return Number.isNaN(t)?null:t}async runFridaCommand(e,r){let i=await this.getAvailability();if(!i.available)return{output:``,error:i.reason??`Frida CLI is not available`};let a=i.path??`frida`,o=[...this.buildTargetArgs(e),`--runtime=v8`,`-q`,`-e`,r];try{let e=await this.execFileUtf8(a,o,n),t=e.stdout.trim(),r=e.stderr.trim();return r?{output:t,error:r}:{output:t}}catch(n){let r=n instanceof Error?n.message:String(n);return t.warn(`[binary-instrument] Frida command failed`,{target:e,message:r}),{output:``,error:r}}}buildTargetArgs(e){return/^\d+$/.test(e)?[`-p`,e]:e.includes(`/`)||e.includes(`\\`)?[`-f`,e]:[`-n`,e]}parseModuleList(e){let t=this.extractJsonPayload(e);if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!this.isRecord(e))continue;let t=this.readStringField(e,`name`),r=this.readStringField(e,`path`),i=this.normalizeHex(e.base),a=this.readNumberField(e,`size`);!t||!r||!i||a===void 0||n.push({name:t,base:i,size:a,path:r})}return n}parseFunctionList(e){let t=this.extractJsonPayload(e);if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!this.isRecord(e))continue;let t=this.readStringField(e,`name`),r=this.normalizeHex(e.address),i=this.readNumberField(e,`size`)??0;!t||!r||n.push({name:t,address:r,size:i})}return n}parseSymbolList(e){let t=this.extractJsonPayload(e);if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!this.isRecord(e))continue;let t=this.readStringField(e,`name`),r=this.normalizeHex(e.address),i=this.readStringField(e,`demangled`);!t||!r||(i?n.push({name:t,address:r,demangled:i}):n.push({name:t,address:r}))}return n}extractJsonPayload(e){let t=e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e.startsWith(`{`)||e.startsWith(`[`)).toReversed();for(let e of t)try{return JSON.parse(e)}catch{continue}}readStringField(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:void 0}readNumberField(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}normalizeHex(e){if(typeof e==`number`&&Number.isFinite(e))return`0x${e.toString(16)}`;if(typeof e==`string`&&e.length>0)return e.startsWith(`0x`)?e:`0x${e}`}isRecord(e){return typeof e==`object`&&!!e}execFileUtf8(e,t,n){return new Promise((r,i)=>{v(e,t,{timeout:n,windowsHide:!0,maxBuffer:5242880,encoding:`utf8`},(e,t,n)=>{if(e){i(e);return}r({stdout:typeof t==`string`?t:``,stderr:typeof n==`string`?n:``})})})}},b=class{ghidraProbe;probePromise;async analyze(e,n){await p(e);let i=await h(e),a=this.extractPrintableStrings(i),o=this.deriveImports(a),s=this.deriveExports(a);if(!(await this.getAvailability()).available)return{functions:[],imports:o,exports:s,strings:a};let l=typeof n?.timeout==`number`&&Number.isFinite(n.timeout)?n.timeout:r,u=await m(f(c(),`jshook-ghidra-script-`)),d=f(u,`BinaryInstrumentDump.py`);try{await _(d,this.buildDefaultScript(),`utf8`);let t=await this.headlessAnalyze(d,e,l);return{functions:this.parseDecompiledOutput(t),imports:o,exports:s,strings:a}}catch(n){let r=n instanceof Error?n.message:String(n);return t.warn(`[binary-instrument] Ghidra analyze fallback`,{binaryPath:e,message:r}),{functions:[],imports:o,exports:s,strings:a}}finally{await g(u,{recursive:!0,force:!0})}}async headlessAnalyze(e,t,n=r){let i=await this.getAvailability();if(!i.available)throw new s(i.reason??`Ghidra analyzeHeadless is not available`);await p(t),await p(e);let a=i.path??`analyzeHeadless`,o=await m(f(c(),`jshook-ghidra-project-`));try{let r=await this.execFileUtf8(a,[o,`binary-instrument`,`-import`,t,`-scriptPath`,d(e),`-postScript`,u(e)],n);return[r.stdout.trim(),r.stderr.trim()].filter(e=>e.length>0).join(`
|
|
2
|
+
`)}finally{await g(o,{recursive:!0,force:!0})}}parseDecompiledOutput(e){let t=[],n=/FUNCTION_START\s*[\r\n]+NAME:(.+?)\s*[\r\n]+ADDRESS:(.+?)\s*[\r\n]+SIGNATURE:(.+?)\s*[\r\n]+DECOMPILED_START\s*[\r\n]+([\s\S]*?)\s*[\r\n]+DECOMPILED_END\s*[\r\n]+FUNCTION_END/g,r=n.exec(e);for(;r;){let i=r[1]??``,a=r[2]??``,o=r[3]??``,s=r[4]??``,c=i.trim(),l=this.normalizeHex(a.trim()),u=o.trim(),d=s.trim();c.length>0&&l.length>0&&u.length>0&&t.push({name:c,address:l,signature:u,decompiled:d}),r=n.exec(e)}return t}async isAvailable(){return(await this.getAvailability()).available}async getAvailability(){if(this.ghidraProbe)return this.ghidraProbe;this.probePromise||=o(`analyzeHeadless`,[`-help`]);let e=await this.probePromise;return this.ghidraProbe=e,this.probePromise=void 0,e}buildDefaultScript(){return[`# @category BinaryInstrument`,`from ghidra.app.decompiler import DecompInterface`,``,`program = currentProgram`,`interface = DecompInterface()`,`interface.openProgram(program)`,`function_manager = program.getFunctionManager()`,`functions = function_manager.getFunctions(True)`,``,`for function in functions:`,` print("FUNCTION_START")`,` print("NAME:" + str(function.getName()))`,` print("ADDRESS:" + str(function.getEntryPoint()))`,` try:`,` signature = str(function.getSignature())`,` except:`,` signature = str(function.getName()) + "()"`,` print("SIGNATURE:" + signature)`,` print("DECOMPILED_START")`,` try:`,` decompiled = interface.decompileFunction(function, 30, monitor).getDecompiledFunction()`,` if decompiled:`,` print(str(decompiled.getC()))`,` else:`,` print("// no decompiled output")`,` except:`,` print("// decompile failed")`,` print("DECOMPILED_END")`,` print("FUNCTION_END")`].join(`
|
|
3
|
+
`)}extractPrintableStrings(e){let t=[],n=``;for(let r of e.values()){if(r>=32&&r<=126){n+=String.fromCharCode(r);continue}n.length>=4&&t.push(n),n=``}return n.length>=4&&t.push(n),Array.from(new Set(t)).slice(0,1e3)}deriveImports(e){return e.filter(e=>/(?:\.dll|\.so|\.dylib|kernel32|user32|libc|printf|malloc|LoadLibrary)/i.test(e)).slice(0,100)}deriveExports(e){return e.filter(e=>/^[A-Za-z_][A-Za-z0-9_@?$]{2,}$/.test(e)).slice(0,100)}normalizeHex(e){return e.startsWith(`0x`)?e:`0x${e}`}execFileUtf8(e,t,n){return new Promise((r,i)=>{v(e,t,{timeout:n,windowsHide:!0,maxBuffer:16777216,encoding:`utf8`},(e,t,n)=>{if(e){i(e);return}r({stdout:typeof t==`string`?t:``,stderr:typeof n==`string`?n:``})})})}},x=class{generateHooks(e){let t=[];for(let n of e.functions){let r=this.classifyFunction(n,e);r!==`unknown`&&t.push({functionName:n.name,description:this.describeCategory(r,e),hookCode:this.buildHookCode(n,r),parameters:this.buildParameters(n)})}return t}exportScript(e,t){if(t!==`frida`)throw new a(`VALIDATION`,`Unsupported export format: "${t}". Only "frida" is supported.`);let n=[`// Frida hook script`,`// auto-generated by HookCodeGenerator`,`// Hook count: ${e.length}`,``];for(let t of e)n.push(`// ${t.functionName}: ${t.description}`),n.push(t.hookCode),n.push(``);return n.join(`
|
|
4
|
+
`)}classifyFunction(e,t){let n=e.name.toLowerCase(),r=t.imports.map(e=>e.toLowerCase()),i=t.strings.map(e=>e.toLowerCase());return e.name.startsWith(`Java_`)?`jni`:n.includes(`aes`)?`aes`:n.includes(`md5`)?`md5`:n.includes(`sha`)?`sha`:n.includes(`rsa`)?`rsa`:n.includes(`base64`)?`base64`:n.includes(`send`)||n.includes(`recv`)||n.includes(`socket`)||n.includes(`http`)?`network`:n.includes(`open`)||n.includes(`read`)||n.includes(`write`)||n.includes(`fopen`)?`file-io`:(n.includes(`decrypt`)||n.includes(`encrypt`))&&i.some(e=>e.includes(`obfuscation`)||e.includes(`encryption`))?`obfuscation`:n.includes(`memcpy`)||n.includes(`strcpy`)||n.includes(`memmove`)||n.includes(`string`)?`string`:r.some(e=>e.includes(`aes`))?`aes`:`unknown`}describeCategory(e,t){switch(e){case`jni`:return`JNI bridge hook for Java/native boundary inspection`;case`aes`:return`AES crypto hook for key/plaintext capture`;case`md5`:return`MD5 crypto hook for digest inspection`;case`sha`:return`SHA crypto hook for digest inspection`;case`rsa`:return`RSA crypto hook for key operation tracing`;case`base64`:return`Base64 transform hook for encoded payload tracing`;case`network`:return`Network hook for request and payload tracing`;case`file-io`:return`File I/O hook for filesystem access tracing`;case`string`:return`String operation hook for buffer tracing`;case`obfuscation`:return t.strings.some(e=>e.toLowerCase().includes(`obfuscation`))?`Potential obfuscation hook for runtime string decryption tracing`:`Potential obfuscation hook`;case`unknown`:return`Unknown hook`}}buildHookCode(e,t){if(t===`jni`)return[`Java.perform(function () {`,` const target = ptr("${e.address}");`,` Interceptor.attach(target, {`,` onEnter(args) {`,` console.log("[jni] ${e.name}");`,` },`,` });`,`});`].join(`
|
|
5
|
+
`);let n=t===`aes`||t===`md5`||t===`sha`||t===`rsa`||t===`base64`?` console.log(hexdump(args[0]));`:` console.log("[trace] entering");`,r=e.name.replace(/[^A-Za-z0-9_]/g,`_`);return[`const target_${r} = ptr("${e.address}");`,`Interceptor.attach(target_${r}, {`,` onEnter(args) {`,` console.log("[hook] ${e.name}");`,n,` },`,`});`].join(`
|
|
6
|
+
`)}buildParameters(e){return e.parameters.length>0?e.parameters.map((e,t)=>({name:e.name||`arg${t}`,type:e.type||`pointer`,description:`Captured parameter ${t}`})):[{name:`arg0`,type:`pointer`,description:`Captured parameter 0`}]}};async function S(e,t){let n=C(e),r=w(t.pluginId),i=T(r,n);if(!i)return{success:!1,tool:`binary-instrument`,action:t.toolName,error:`Plugin ${r} is not installed`};let a=E(e,i);if(!a?.lifecycleContext)return{success:!1,tool:`binary-instrument`,action:t.toolName,error:`Plugin ${i} is installed but has no runtime`};try{let e=(await a.lifecycleContext.invokeTool(t.toolName,t.args)).content?.find(e=>e.type===`text`)?.text;if(!e)return{success:!1,tool:`binary-instrument`,action:t.toolName,error:`Plugin returned no text content`};try{let n=JSON.parse(e);if(O(n))return{tool:`binary-instrument`,action:t.toolName,success:k(n,`success`)??!0,data:n.data,error:A(n,`error`)}}catch{return{success:!0,tool:`binary-instrument`,action:t.toolName,data:e}}return{success:!0,tool:`binary-instrument`,action:t.toolName,data:e}}catch(e){return{success:!1,tool:`binary-instrument`,action:t.toolName,error:e instanceof Error?e.message:String(e)}}}function C(e){return Array.from(e.extensionPluginsById.keys()).map(w)}function w(e){return e.replaceAll(`_`,`-`)}function T(e,t){let n=e.replace(/^plugin-/,``);for(let r of t){let t=r.replace(/^plugin-/,``);if(r===e||t===n)return r}}function E(e,t){for(let[n,r]of e.extensionPluginRuntimeById.entries())if(w(n)===t)return D(r)?r:void 0}function D(e){return typeof e==`object`&&!!e}function O(e){return typeof e==`object`&&!!e}function k(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function A(e,t){let n=e[t];return typeof n==`string`?n:void 0}var j=class{generateFridaHookScript(e,t){let n=t?.includeArgs??!0,r=t?.includeRetAddr??!1,i=[`'use strict';`,``,`function resolveTarget(name) {`,` try {`,` const exported = Module.findExportByName(null, name);`,` if (exported) {`,` return exported;`,` }`,` } catch (error) {}`,` try {`,` const symbol = DebugSymbol.fromName(name);`,` if (symbol && symbol.address) {`,` return symbol.address;`,` }`,` } catch (error) {}`,` return null;`,`}`,``,`const installedHooks = [];`];for(let t=0;t<e.length;t+=1){let a=this.toDescriptor(e[t]),o=`target_${t}`,s=a.demangled??a.name,c=a.address?`const ${o} = ptr("${this.escapeForDoubleQuotes(a.address)}");`:`const ${o} = resolveTarget("${this.escapeForDoubleQuotes(a.name)}");`;i.push(c),i.push(`if (${o}) {`),i.push(` Interceptor.attach(${o}, {`),i.push(` onEnter(args) {`),r?i.push(` console.log("[binary-instrument] enter ${this.escapeForDoubleQuotes(s)} ret=" + this.returnAddress);`):i.push(` console.log("[binary-instrument] enter ${this.escapeForDoubleQuotes(s)}");`),n&&(i.push(` const renderedArgs = [];`),i.push(` for (let i = 0; i < 6; i += 1) {`),i.push(` try {`),i.push(` renderedArgs.push(String(args[i]));`),i.push(` } catch (error) {`),i.push(` renderedArgs.push("<unreadable>");`),i.push(` }`),i.push(` }`),i.push(` console.log("[binary-instrument] args " + JSON.stringify(renderedArgs));`)),i.push(` },`),i.push(` onLeave(retval) {`),i.push(` console.log("[binary-instrument] leave ${this.escapeForDoubleQuotes(s)} retval=" + retval);`),i.push(` },`),i.push(` });`),i.push(` installedHooks.push({ name: "${this.escapeForDoubleQuotes(s)}", address: String(${o}) });`),i.push(`} else {`),i.push(` console.log("[binary-instrument] unresolved ${this.escapeForDoubleQuotes(s)}");`),i.push(`}`),i.push(``)}return i.push(`console.log("[binary-instrument] hooks=" + JSON.stringify(installedHooks));`),i.join(`
|
|
7
|
+
`)}generateInterceptorScript(e){return this.generateFridaHookScript(e,{includeArgs:!0,includeRetAddr:!1})}toDescriptor(e){return typeof e==`string`?{name:e}:e}escapeForDoubleQuotes(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`)}},M=class{sessions=new Map;close(){for(let e of this.sessions.values())if(e.childProcess)try{process.kill(e.childProcess.pid,`SIGTERM`)}catch{}this.sessions.clear()}async launch(e,n=`arm`,r){let o=r??process.env.UNIDBG_JAR;if(!o)throw new s(`UNIDBG_JAR is not configured. Set the UNIDBG_JAR env var or pass jarPath.`);try{await p(o)}catch{throw new a(`NOT_FOUND`,`Unidbg JAR not found: ${o}`)}try{await p(e)}catch{throw new a(`NOT_FOUND`,`Shared library not found: ${e}`)}let c=l(),u=this.getJavaCommand(),d=[`-jar`,o,`--so`,e,`--arch`,n,`--server`];try{let t=await this.execFileUtf8(u,d,i),r=this.parseLaunchOutput(t.stdout,c),a={id:r.id,soPath:e,arch:n,startedAt:new Date().toISOString(),childProcess:r.pid?{pid:r.pid}:void 0};return this.sessions.set(c,a),{sessionId:c,soPath:e,arch:n}}catch(r){let i=r instanceof Error?r.message:String(r);t.warn(`[binary-instrument] Unidbg launch failed, registering stub session`,{soPath:e,message:i});let a={id:c,soPath:e,arch:n,startedAt:new Date().toISOString()};return this.sessions.set(c,a),{sessionId:c,soPath:e,arch:n}}}async callFunction(e,t,n={}){if(!this.sessions.get(e))throw new a(`NOT_FOUND`,`No unidbg session found for ${e}`);let r=process.env.UNIDBG_JAR;if(!r)return{sessionId:e,functionName:t,args:n,returnValue:`0x0`,stdout:``,stderr:``,trace:[`mock-unidbg-unavailable`],_note:`Unidbg emulation requires UNIDBG_JAR to be configured`};let o=this.getJavaCommand(),s=[`-jar`,r,`--session`,e,`--call`,t,`--args`,JSON.stringify(n)];try{let r=await this.execFileUtf8(o,s,i);return{sessionId:e,functionName:t,args:n,returnValue:this.extractReturnValue(r.stdout),stdout:r.stdout.trim(),stderr:r.stderr.trim(),trace:[]}}catch(r){return{sessionId:e,functionName:t,args:n,returnValue:`0x0`,stdout:``,stderr:r instanceof Error?r.message:String(r),trace:[`error`]}}}async trace(e){if(!this.sessions.get(e))throw new a(`NOT_FOUND`,`No unidbg session found for ${e}`);let t=process.env.UNIDBG_JAR;if(!t)return{sessionId:e,trace:[`mock-unidbg-unavailable`],_note:`Unidbg tracing requires UNIDBG_JAR to be configured`};let n=this.getJavaCommand(),r=[`-jar`,t,`--session`,e,`--trace`];try{let t=await this.execFileUtf8(n,r,i);return{sessionId:e,trace:this.parseTraceOutput(t.stdout),instructionCount:this.countInstructions(t.stdout)}}catch(t){return{sessionId:e,trace:[`error`],error:t instanceof Error?t.message:String(t)}}}getSessionInfo(e){return this.sessions.get(e)}listSessions(){return Array.from(this.sessions.values()).map(e=>({id:e.id,soPath:e.soPath,arch:e.arch,startedAt:e.startedAt}))}getJavaCommand(){return process.env.JAVA_HOME?`${process.env.JAVA_HOME}/bin/java`:`java`}parseLaunchOutput(e,t){let n=e.split(/\r?\n/).filter(e=>e.trim().length>0);for(let e of n.toReversed())try{let t=JSON.parse(e);if(typeof t.id==`string`)return{id:t.id,pid:typeof t.pid==`number`?t.pid:null}}catch{}return{id:t,pid:null}}extractReturnValue(e){let t=/return[=:\s]+(0x[0-9a-fA-F]+|-?\d+)/.exec(e);return t?.[1]?t[1]:`0x0`}parseTraceOutput(e){return e.split(/\r?\n/).filter(e=>e.trim().length>0&&!e.startsWith(`{`)).slice(0,1e4)}countInstructions(e){return e.split(/\r?\n/).filter(e=>e.trim().length>0&&!e.startsWith(`{`)&&/\b(ldr|str|mov|bl|b|add|sub)\b/i.test(e)).length}async execFileUtf8(e,t,n){return new Promise((r,i)=>{v(e,t,{timeout:n,windowsHide:!0,maxBuffer:8388608,encoding:`utf8`},(e,t,n)=>{if(e){i(e);return}r({stdout:typeof t==`string`?t:``,stderr:typeof n==`string`?n:``,exitCode:0})})})}},N=e({GhidraAnalyzer:()=>b,HookGenerator:()=>j});export{S as a,y as c,C as i,M as n,x as o,j as r,b as s,N as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(e,t){let n=e[t];if(!n)throw Error(`[registry] Missing dependency: "${t}". Is the domain enabled?`);return n}function t(t,n){return r=>i=>n(e(r,t),i)}function n(e,n,r){return t(e,async(e,t)=>{let i=e[n],a=r?.mapArgs?r.mapArgs(t):[t],o=await i.apply(e,a);return r?.wrapResult?r.wrapResult(o):o})}function r(e){let{domain:t,depKey:r,lookup:i,entries:a,wrapResult:o}=e;return a.map(e=>({tool:i(e.tool),domain:t,...e.profiles?{profiles:e.profiles}:{},bind:`mapArgs`in e?n(r,e.method,{wrapResult:o,mapArgs:e.mapArgs}):n(r,e.method,{wrapResult:o})}))}export{r as n,t};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{t as e}from"./chunk-C_pMuVsO.mjs";import{a as t}from"./outputPaths-BonGThuc.mjs";import{createDecipheriv as n,randomUUID as r}from"node:crypto";import{existsSync as i,readFileSync as a}from"node:fs";import{dirname as o,resolve as s}from"node:path";import{mkdir as c,writeFile as l}from"node:fs/promises";function u(e){return e.replace(/\s+/g,``).toUpperCase()}function d(e){return e.length>0&&e.length%2==0&&/^[0-9A-F]+$/i.test(e)}function f(e){if(!e)return;let t=new Date(e);if(!Number.isNaN(t.valueOf()))return t.toISOString()}function p(){return s(t(),`jshook-boringssl-${r()}.log`)}function m(e){let t=[];for(let n of e.split(/\r?\n/)){let e=n.trim();if(e.length===0||e.startsWith(`#`))continue;let r=e.split(/\s+/),i=r[0],a=r[1],o=r[2],s=f(r[3]);if(!i||!a||!o)continue;let c=u(a),l=u(o);if(!d(c)||!d(l))continue;let p={label:i,clientRandom:c,secret:l};s&&(p.timestamp=s),t.push(p)}return t}var h=class{keyLogPath;cachedEntries=[];secretByClientRandom=new Map;constructor(e){this.keyLogPath=s(e??p())}async enableKeyLog(){return await c(o(this.keyLogPath),{recursive:!0}),await l(this.keyLogPath,``,{flag:`a`}),process.env.SSLKEYLOGFILE=this.keyLogPath,this.keyLogPath}async disableKeyLog(){if(process.env.SSLKEYLOGFILE===this.keyLogPath){delete process.env.SSLKEYLOGFILE;return}delete process.env.SSLKEYLOGFILE}getKeyLogFilePath(){return this.keyLogPath}parseKeyLog(e){let t=s(e??this.keyLogPath);if(!i(t))return this.cachedEntries=[],this.secretByClientRandom.clear(),[];let n=m(a(t,`utf8`));this.cachedEntries=n,this.secretByClientRandom.clear();for(let e of n)this.secretByClientRandom.set(e.clientRandom,e.secret);return n}decryptPayload(e,t){let n=u(e);if(!d(n)||t.length===0||!t.some(e=>e.secret.length>0))return null;try{return Buffer.from(n,`hex`)}catch{return null}}summarizeKeyLog(e){let t=this.parseKeyLog(e),n={},r=[];for(let e of t)n[e.label]=(n[e.label]??0)+1,e.timestamp&&r.push(e.timestamp);r.sort((e,t)=>e.localeCompare(t));let i={totalEntries:t.length,entriesByLabel:n};if(r.length>0){let e=r[0],t=r[r.length-1];e&&(i.firstSeen=e),t&&(i.lastSeen=t)}return i}lookupSecret(e){let t=u(e),n=this.secretByClientRandom.get(t);if(n)return n;for(let e of this.cachedEntries.length>0?this.cachedEntries:this.parseKeyLog())if(e.clientRandom===t)return e.secret;return null}};function g(e=`/tmp/sslkeylog.log`){return process.env.SSLKEYLOGFILE=e,e}function _(){delete process.env.SSLKEYLOGFILE}function v(){let e=process.env.SSLKEYLOGFILE;return!e||e.trim().length===0?null:e}function y(e){return e.length===0?[]:e.includes(`
|
|
2
|
+
`)||e.includes(`\r`)||e.includes(`CLIENT_`)||e.trim().startsWith(`#`)?m(e):new h(e).parseKeyLog()}function b(e){let t=[...new Set(e.map(e=>e.label))],n=new Set(e.map(e=>e.clientRandom)).size,r=e.some(e=>e.label.includes(`TRAFFIC_SECRET`));return{totalEntries:e.length,uniqueClients:n,hasClientRandom:t.includes(`CLIENT_RANDOM`),hasTrafficSecrets:r,labels:t}}function x(e,t,n){let r=u(t),i=n?.trim();for(let t of e)if(t.clientRandom===r&&!(i&&t.label!==i))return t.secret;return null}function S(e,t,r,i=`aes-256-gcm`,a){try{let o=Buffer.from(u(e),`hex`),s=n(i,Buffer.from(u(t),`hex`),Buffer.from(u(r),`hex`));if(a){let e=Reflect.get(s,`setAuthTag`);typeof e==`function`&&e.call(s,Buffer.from(u(a),`hex`))}return Buffer.concat([s.update(o),s.final()]).toString(`utf8`)}catch{return`DECRYPTION_FAILED:${i}`}}var C=e({TLSKeyLogExtractor:()=>h});export{g as a,y as c,_ as i,b as l,h as n,v as o,S as r,x as s,C as t};
|