@jshookmcp/jshook 0.3.2 → 0.3.3
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 +3 -3
- package/README.zh.md +3 -3
- package/dist/{AntiCheatDetector-B6d4Qe9D.mjs → AntiCheatDetector-CUpZBh5O.mjs} +1 -1
- package/dist/{BrowserSessionCoordinator-BJ-HOxo0.mjs → BrowserSessionCoordinator-QIt3tetp.mjs} +1 -1
- package/dist/CodeInjector-Btj9upnf.mjs +1 -0
- package/dist/{ConsoleMonitor-CxDJV15E.mjs → ConsoleMonitor-DIjN5Afa.mjs} +5 -5
- package/dist/{DarwinAPI-ZfQdpLNI.mjs → DarwinAPI-BuMPGzHm.mjs} +1 -1
- package/dist/DetailedDataManager-Z77fDl9Z.mjs +5 -0
- package/dist/ExtensionManager.tools-CIGOWViz.mjs +1 -0
- package/dist/{FingerprintManager-DT0EAUEo.mjs → FingerprintManager-BkDSsjjP.mjs} +1 -1
- package/dist/{HardwareBreakpoint-BUfPdp0f.mjs → HardwareBreakpoint-DMAMcPyB.mjs} +1 -1
- package/dist/{HeapAnalyzer-B_aqY8oj.mjs → HeapAnalyzer-Yj348FYt.mjs} +1 -1
- package/dist/{ExtensionManager.tools-oVMJgPcN.mjs → MCPServer.activation.ttl-CEGNBycZ.mjs} +1 -1
- package/dist/MCPServer.search.helpers-Cs1JpKbu.mjs +1 -0
- package/dist/MCPServer.search.validation-DnifPCCv.mjs +1 -0
- package/dist/{MemoryController-X1XNSn1n.mjs → MemoryController-DjtgiING.mjs} +1 -1
- package/dist/{MemoryScanSession-DG_F-PjE.mjs → MemoryScanSession-zfoVZJB0.mjs} +1 -1
- package/dist/MemoryScanner-Dxd657li.mjs +1 -0
- package/dist/{NativeMemoryManager.utils-BHy1P_jM.mjs → NativeMemoryManager.utils-Bu8srMEF.mjs} +1 -1
- package/dist/{PEAnalyzer-yWQaGrcx.mjs → PEAnalyzer-CMu9Ua9T.mjs} +1 -1
- package/dist/PointerChainEngine-CaSC1Mry.mjs +1 -0
- package/dist/{ProcessRegistry-C-bN48oR.mjs → ProcessRegistry-D5y1yuP2.mjs} +1 -1
- package/dist/{ReverseEvidenceGraph-BhSYYdiI.mjs → ReverseEvidenceGraph-BksOpsPs.mjs} +1 -1
- package/dist/ServerRuntimeState-CgqBBwfd.mjs +1 -0
- package/dist/{Speedhack-yseDPSZ9.mjs → Speedhack-pwXTHxOY.mjs} +1 -1
- package/dist/{StructureAnalyzer-C5lpuZkg.mjs → StructureAnalyzer-BseGzsSl.mjs} +2 -2
- package/dist/ToolCatalog-DgmQXdsm.mjs +1 -0
- package/dist/ToolHandlerMap-7HWoIgQO.mjs +1 -0
- package/dist/{ToolProbe-C7ZU2x7M.mjs → ToolProbe-DQiREmNp.mjs} +1 -1
- package/dist/{ToolRegistry-C5oB8KP8.mjs → ToolRegistry-eMZEBiR1.mjs} +1 -1
- package/dist/ToolRouter.policy-UKBlFlbh.mjs +4 -0
- package/dist/{TraceRecorder-BiJWBXHX.mjs → TraceRecorder-B5ktv3nP.mjs} +2 -2
- package/dist/VersionDetector-CmPJmaJg.mjs +1 -0
- package/dist/{Win32API-eUCF57l_.mjs → Win32API-DoP3MMHS.mjs} +1 -1
- package/dist/{Win32Debug-CYrIQBvr.mjs → Win32Debug-DwF8mQGm.mjs} +1 -1
- package/dist/{WorkflowEngine-D876meOO.mjs → WorkflowEngine-CldHG5b4.mjs} +1 -1
- package/dist/{analysis-D4swdMvq.mjs → analysis-C-ln0Brh.mjs} +3 -3
- package/dist/antidebug-CsnpOR9z.mjs +1 -0
- package/dist/{artifactRetention-BCPQASm7.mjs → artifactRetention-DkYKLOvi.mjs} +1 -1
- package/dist/{artifacts-CkodUM4j.mjs → artifacts-D-4pSS_N.mjs} +1 -1
- package/dist/{betterSqlite3-Brtq-SIQ.mjs → betterSqlite3-Bdo_ifuJ.mjs} +1 -1
- package/dist/binary-instrument-BeZ224mZ.mjs +9 -0
- package/dist/{boringssl-inspector-BBaJwwkU.mjs → boringssl-inspector-ZOCkaipa.mjs} +2 -2
- package/dist/browser-BUaB25bk.mjs +11 -0
- package/dist/{handlers-yo_xYzT8.mjs → canvas-396ieNv5.mjs} +22 -22
- package/dist/collector-CB2syQEg.mjs +1 -0
- package/dist/constants-DMv3svps.mjs +2 -0
- package/dist/coordination-Dbohmj6D.mjs +1 -0
- package/dist/dart-inspector-LhEqRITQ.mjs +0 -0
- package/dist/debugger-CLzkObIO.mjs +1 -0
- package/dist/{definitions-OeLvmlQy.mjs → definitions-0hxnrDU72.mjs} +1 -1
- package/dist/definitions-B3a9QC2t.mjs +1 -0
- package/dist/{definitions-Ibci7e_L.mjs → definitions-BOvju5t2.mjs} +1 -1
- package/dist/{definitions-D4g-MS10.mjs → definitions-CXj_cEVt.mjs} +1 -1
- package/dist/{definitions-C3qNgSn1.mjs → definitions-Co6AvTjH.mjs} +1 -1
- package/dist/{definitions-DxFNRQNK2.mjs → definitions-Cv5r8xwq.mjs} +1 -1
- package/dist/definitions-DBYSxChX.mjs +1 -0
- package/dist/{definitions-CQd7yCQH.mjs → definitions-D_dTDX9B.mjs} +1 -1
- package/dist/{definitions-l7TjdE6V.mjs → definitions-Db9t2ddh.mjs} +1 -1
- package/dist/{definitions-BWxBke3r.mjs → definitions-DbN2CjI2.mjs} +1 -1
- package/dist/{definitions-DAQm1Xar.mjs → definitions-DlmmHmZc.mjs} +1 -1
- package/dist/{definitions-Bf3H1EwV.mjs → definitions-DnYpoGig.mjs} +1 -1
- package/dist/{definitions-BYwATKc-.mjs → definitions-DtZ6Ktx2.mjs} +1 -1
- package/dist/{definitions-D5wl_8HN.mjs → definitions-DuIPS8gq.mjs} +1 -1
- package/dist/{definitions-RZYGD_Ey.mjs → definitions-DywfwPMb.mjs} +1 -1
- package/dist/definitions-EGmqr85H.mjs +1 -0
- package/dist/{definitions-bybDvnG0.mjs → definitions-Fetw_Cge.mjs} +3 -3
- package/dist/{definitions-CB6vmOer.mjs → definitions-LdkeuOeA.mjs} +1 -1
- package/dist/{definitions-B_83XfNQ.mjs → definitions-Ym8niHDb.mjs} +1 -1
- package/dist/{definitions-Cenu6mxo.mjs → definitions-aeRd5DAR.mjs} +1 -1
- package/dist/{definitions-CT8ln6GQ.mjs → definitions-cnG6tj17.mjs} +1 -1
- package/dist/{encoding-ycOaz8Vr.mjs → encoding-B4xZWErf.mjs} +2 -2
- package/dist/ensure-browser-core-JHwDo5ql.mjs +285 -0
- package/dist/{factory-CKr4fAE1.mjs → factory-BxNdBiZa.mjs} +1 -1
- package/dist/{graphql-B2TiPEow.mjs → graphql-GBWsZ9xC.mjs} +4 -4
- package/dist/{handlers-D5E40ssn.mjs → handlers-5nzR8B0a.mjs} +2 -2
- package/dist/handlers-6iNsXOVT.mjs +7 -0
- package/dist/{handlers-BpDlVVVU.mjs → handlers-BZ8n6Hvf.mjs} +1 -1
- package/dist/{handlers-0yKLRIfo.mjs → handlers-BbLxNbbT.mjs} +1 -1
- package/dist/{handlers-DGbdQAgD.mjs → handlers-BbS4hssc.mjs} +2 -2
- package/dist/{handlers-l8QIKqBj.mjs → handlers-CIKOP4aI.mjs} +2 -2
- package/dist/handlers-CWKBBjai.mjs +1 -0
- package/dist/{handlers-B62K4FTc.mjs → handlers-Cmb6SoRC.mjs} +1 -1
- package/dist/handlers-CrJsKnEI.mjs +1 -0
- package/dist/{antidebug-7L3ygj_9.mjs → handlers-DB6xVVWq.mjs} +2 -2
- package/dist/{handlers-CMJK7m1c.mjs → handlers-DOOCWUNR.mjs} +3 -3
- package/dist/{handlers-D2ZOul9p.mjs → handlers-Z_B5aVaU.mjs} +2 -2
- package/dist/handlers-gVscChvl.mjs +1 -0
- package/dist/handlers-xFvI9P_y.mjs +1 -0
- package/dist/{handlers.impl-D9Hh8Bgl.mjs → handlers.impl-BsFTW6SD.mjs} +1 -1
- package/dist/{hooks-D4XLfgtV.mjs → hooks-DPouiS7I.mjs} +9 -9
- package/dist/index.mjs +11 -11
- package/dist/macro-p8kuJVcm.mjs +2 -0
- package/dist/maintenance-DAqADb6Z.mjs +302 -0
- package/dist/manifest-4lmM6MZR.mjs +1 -0
- package/dist/{manifest-DujQqEQR.mjs → manifest-AxaxRSt6.mjs} +2 -2
- package/dist/{manifest-DYpn8w_h.mjs → manifest-BIqRE1Qz.mjs} +1 -1
- package/dist/manifest-Box-jWfr.mjs +1 -0
- package/dist/manifest-Bp33di0Q.mjs +1 -0
- package/dist/{manifest-CQH9FhwI.mjs → manifest-BvRX4nRP.mjs} +1 -1
- package/dist/{manifest-0Jpt_AQa.mjs → manifest-C6KoB1XE.mjs} +1 -1
- package/dist/manifest-C7TdXCWY.mjs +1 -0
- package/dist/manifest-CM-n64K0.mjs +1 -0
- package/dist/{manifest-nXHmtMSp2.mjs → manifest-CUokxCUN.mjs} +1 -1
- package/dist/manifest-CWJS45iO.mjs +1 -0
- package/dist/{manifest-LLdI5m4T.mjs → manifest-Cdxdgo-D.mjs} +1 -1
- package/dist/{manifest-D_obs5F4.mjs → manifest-Cf6SmamD.mjs} +1 -1
- package/dist/manifest-Cgxu2qdv.mjs +1 -0
- package/dist/{manifest-ztWJoXy4.mjs → manifest-CowGSURa2.mjs} +1 -1
- package/dist/{manifest-DYzWI8Xs.mjs → manifest-CsGIrh34.mjs} +1 -1
- package/dist/manifest-CvDpVToN.mjs +1 -0
- package/dist/manifest-D8TL9RLE.mjs +1 -0
- package/dist/{manifest-DCx6w2XV.mjs → manifest-DIhtCBe6.mjs} +1 -1
- package/dist/{manifest-D9jUUJAu.mjs → manifest-DJbruNOg.mjs} +1 -1
- package/dist/manifest-DLGtZH-0.mjs +1 -0
- package/dist/manifest-DXHdPt2T.mjs +1 -0
- package/dist/{manifest-B3fZbSWR.mjs → manifest-Dg5ScOyW.mjs} +1 -1
- package/dist/{manifest-xWfu6iLo.mjs → manifest-DzGoTS0R.mjs} +1 -1
- package/dist/manifest-G2H52LKz.mjs +131 -0
- package/dist/{manifest-CctIumog.mjs → manifest-P0Futrgb.mjs} +1 -1
- package/dist/{manifest-YgVd8Sgz.mjs → manifest-Qw7xgvjv.mjs} +1 -1
- package/dist/{manifest-QYbQXJn0.mjs → manifest-W3qvVrP2.mjs} +1 -1
- package/dist/manifest-dG6MuR1U.mjs +1 -0
- package/dist/manifest-nWXtgq5Y2.mjs +1 -0
- package/dist/{manifest-LG42zPLY2.mjs → manifest-vp1upSSq.mjs} +1 -1
- package/dist/{modules-BPBcSaM-.mjs → modules-DO3jXCgj.mjs} +10 -10
- package/dist/{mojo-ipc-BhwsdVUW.mjs → mojo-ipc-Be-ccWrc.mjs} +1 -1
- package/dist/native-g095qhpK.mjs +961 -0
- package/dist/network-Dvxm7eEI.mjs +7 -0
- package/dist/outputPaths-D2ddHrOJ.mjs +2 -0
- package/dist/{parse-args-Bw413PlW.mjs → parse-args-ngRrvF9e.mjs} +1 -1
- package/dist/platform-DjWbuiF8.mjs +93 -0
- package/dist/process-Dq5I-KZW.mjs +2 -0
- package/dist/proxy-DPNgM7TE.mjs +2 -0
- package/dist/{registry-DH4sc1dt.mjs → registry-xB8Wgmyj.mjs} +1 -1
- package/dist/{renderer-pid-9tJnZ_9N.mjs → renderer-pid-7jbTR8f5.mjs} +1 -1
- package/dist/search-defaults-CJik67or.mjs +1 -0
- package/dist/server/plugin-api.mjs +1 -1
- package/dist/sourcemap-DqEW15Ao.mjs +1 -0
- package/dist/streaming-Dbk4eStJ.mjs +1 -0
- package/dist/{transform-DOxzeWPB.mjs → transform-D-peM3aO.mjs} +2 -2
- package/dist/{wasm-CZ_HTfKR.mjs → wasm-CZajRaad.mjs} +6 -6
- package/dist/{webcrack-C1iYG_EX.mjs → webcrack-phEfVt5y.mjs} +3 -3
- package/dist/{workflow-BdwQmARn.mjs → workflow-wkXb3x-U.mjs} +3 -3
- package/package.json +2 -2
- package/dist/CodeInjector-Cll_7bLJ.mjs +0 -1
- package/dist/DOMInspector-C19J4zeq.mjs +0 -95
- package/dist/DetailedDataManager-DmQ1LT-W.mjs +0 -1
- package/dist/ExtensionManager-BD724zkO.mjs +0 -1
- package/dist/MCPServer.search.handlers.domain-BbS-6LnX.mjs +0 -1
- package/dist/MemoryScanner-g1_L1ub5.mjs +0 -1
- package/dist/NativeMemoryManager.impl-DniBe2wf.mjs +0 -1
- package/dist/NetworkMonitor-B_-au6aV.mjs +0 -185
- package/dist/PageController-Dfsm1_o7.mjs +0 -1
- package/dist/PointerChainEngine-BhCUkmxY.mjs +0 -1
- package/dist/PrerequisiteError-BjCQA-gK.mjs +0 -1
- package/dist/ScriptManager-LWGPTdvD.mjs +0 -7
- package/dist/ServerRuntimeState-D2bWHqEE.mjs +0 -1
- package/dist/ToolCatalog-CYdD9F5f.mjs +0 -1
- package/dist/ToolRouter.policy-CfhJczkt.mjs +0 -4
- package/dist/VersionDetector-CHT36Az0.mjs +0 -9
- package/dist/apk-packer-BqXcInnX.mjs +0 -1
- package/dist/binary-instrument-DU7V6TUM.mjs +0 -7
- package/dist/binary-secrets-PdMVoyt0.mjs +0 -1
- package/dist/browser-Qqco2rOT.mjs +0 -11
- package/dist/collector-Bpl6qy2L.mjs +0 -1
- package/dist/constants-BYj8Xek8.mjs +0 -1
- package/dist/coordination-CWXW1o8K.mjs +0 -1
- package/dist/dart-inspector-7AkPeZ_Q.mjs +0 -0
- package/dist/debugger-DyALjYMk.mjs +0 -1
- package/dist/definitions-BftdXgXI.mjs +0 -1
- package/dist/definitions-Bio5XJYy.mjs +0 -1
- package/dist/definitions-CMZRSy3k.mjs +0 -1
- package/dist/definitions-DP1vgxEY.mjs +0 -1
- package/dist/definitions-Tls8c0A0.mjs +0 -1
- package/dist/ensure-browser-core-DxWC-NTp.mjs +0 -1
- package/dist/flat-target-session-DvcQX7J5.mjs +0 -1
- package/dist/handlers-8zN_vBIz.mjs +0 -1
- package/dist/handlers-DHO3rjsW.mjs +0 -1
- package/dist/handlers-FJ80VzUI.mjs +0 -2
- package/dist/handlers-VHWrxbM_.mjs +0 -1
- package/dist/handlers-mPFiNPe8.mjs +0 -302
- package/dist/jadx-search-B_Yse0Zh.mjs +0 -5
- package/dist/maintenance-BUpIukhg.mjs +0 -1
- package/dist/manifest-B7NB2rh2.mjs +0 -1
- package/dist/manifest-BDi4nbH1.mjs +0 -1
- package/dist/manifest-BLDfkE7n.mjs +0 -1
- package/dist/manifest-BcXbB4gf.mjs +0 -1
- package/dist/manifest-Bdnc_vrc.mjs +0 -1
- package/dist/manifest-BuYKgCnp.mjs +0 -1
- package/dist/manifest-CBfNnGPV.mjs +0 -1
- package/dist/manifest-CPS1Xv69.mjs +0 -1
- package/dist/manifest-CRryuZF4.mjs +0 -1
- package/dist/manifest-CvTe5ZGV2.mjs +0 -1
- package/dist/manifest-D-5GH0DV.mjs +0 -1
- package/dist/manifest-D3Ssf3IC.mjs +0 -1
- package/dist/manifest-D5ck3NvC.mjs +0 -1
- package/dist/manifest-DG19q-Ld.mjs +0 -1
- package/dist/manifest-DLMlD0Zc.mjs +0 -1
- package/dist/manifest-DwL2ik8P.mjs +0 -1
- package/dist/manifest-ItF5P8A12.mjs +0 -1
- package/dist/manifest-KZphqIyX.mjs +0 -1
- package/dist/manifest-RcpX_MyZ.mjs +0 -123
- package/dist/manifest-Zy7Odg5J.mjs +0 -1
- package/dist/manifest-ff1H7Pdp.mjs +0 -1
- package/dist/manifest-iuhF6pTL2.mjs +0 -1
- package/dist/manifest-yC16OhL2.mjs +0 -1
- package/dist/matchesWildcardPattern-BAG6LvX5.mjs +0 -1
- package/dist/native-j8l473zn.mjs +0 -961
- package/dist/network-T0VRwNPd.mjs +0 -7
- package/dist/outputPaths-B4Ic4RZh.mjs +0 -2
- package/dist/platform-CzaQtISh.mjs +0 -93
- package/dist/playwright-cdp-fallback-DqFdx9-s.mjs +0 -1
- package/dist/process-CWhsCWrf.mjs +0 -2
- package/dist/proxy-DZFlDsG3.mjs +0 -2
- package/dist/search-defaults-lYBVn_3L.mjs +0 -1
- package/dist/shared-state-board-BSjXLUV1.mjs +0 -1
- package/dist/sourcemap-Dh3Ai_ur.mjs +0 -1
- package/dist/streaming-BcJ0B6ao.mjs +0 -1
- package/dist/types-D9EiE5o9.mjs +0 -1
- /package/dist/{CacheAdapters-CsNtQIR8.mjs → CacheAdapters-BlDrQg8f.mjs} +0 -0
- /package/dist/{EventBus-DL8iLA09.mjs → EventBus-Cm-t-B65.mjs} +0 -0
- /package/dist/{EvidenceGraphBridge-BtbwXsLC.mjs → EvidenceGraphBridge-DBDc0wUA.mjs} +0 -0
- /package/dist/{HookGeneratorBuilders.core.generators.storage-DzD6dIJd.mjs → HookGeneratorBuilders.core.generators.storage-CWaWpOHa.mjs} +0 -0
- /package/dist/{InstrumentationSession-D_G1ZPyd.mjs → InstrumentationSession-c5qZyp7d.mjs} +0 -0
- /package/dist/{ResponseBuilder-BfWP-uaT.mjs → ResponseBuilder-nPXl_khE.mjs} +0 -0
- /package/dist/{RingBuffer-Dm54ELKT.mjs → RingBuffer-B6RTHmij.mjs} +0 -0
- /package/dist/{StealthVerifier-BmcxfwSF.mjs → StealthVerifier-DMBrtkhN.mjs} +0 -0
- /package/dist/{ToolError-DWU_z7gp.mjs → ToolError-g3rjWzhx.mjs} +0 -0
- /package/dist/{authorization-schema-BOFwSXUN.mjs → authorization-schema-Jtikc5Yt.mjs} +0 -0
- /package/dist/{bind-helpers-m2U8glkF.mjs → bind-helpers-D0mGAOof.mjs} +0 -0
- /package/dist/{capabilities-CyXuKUl1.mjs → capabilities-L1ax5EHS.mjs} +0 -0
- /package/dist/{chunk-C_pMuVsO.mjs → chunk-88NL7fhV.mjs} +0 -0
- /package/dist/{concurrency-DCr8WQ2M.mjs → concurrency-Dehnw4JC.mjs} +0 -0
- /package/dist/{evidence-graph-bridge-CV_UdYqj.mjs → evidence-graph-bridge-eT9icP6a.mjs} +0 -0
- /package/dist/{formatAddress-vLA_hOJt.mjs → formatAddress-DAcw4Ckg.mjs} +0 -0
- /package/dist/{logger-sBC6IdRT.mjs → logger-CCikqqvj.mjs} +0 -0
- /package/dist/{response-C7rKQst4.mjs → response-B1RuVVfD.mjs} +0 -0
- /package/dist/{ssrf-policy-CsIJGkpd.mjs → ssrf-policy-B72vdy23.mjs} +0 -0
- /package/dist/{tool-builder-qif8M9-K.mjs → tool-builder-CpLh-UQd.mjs} +0 -0
- /package/dist/{types-Fz69RzbZ.mjs → types-BzPBzmVB.mjs} +0 -0
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-sBC6IdRT.mjs";function t(e){return`
|
|
2
|
-
(function() {
|
|
3
|
-
if (window.__xhrInterceptorInstalled) {
|
|
4
|
-
console.log('[XHRInterceptor] Already installed');
|
|
5
|
-
return;
|
|
6
|
-
}
|
|
7
|
-
window.__xhrInterceptorInstalled = true;
|
|
8
|
-
|
|
9
|
-
const originalXHR = window.__originalXMLHttpRequestForHook || window.XMLHttpRequest;
|
|
10
|
-
window.__originalXMLHttpRequestForHook = originalXHR;
|
|
11
|
-
if (!window.__xhrRequests) {
|
|
12
|
-
window.__xhrRequests = [];
|
|
13
|
-
}
|
|
14
|
-
const xhrRequests = window.__xhrRequests;
|
|
15
|
-
|
|
16
|
-
window.XMLHttpRequest = function() {
|
|
17
|
-
const xhr = new originalXHR();
|
|
18
|
-
const requestInfo = {
|
|
19
|
-
method: '',
|
|
20
|
-
url: '',
|
|
21
|
-
requestHeaders: {},
|
|
22
|
-
responseHeaders: {},
|
|
23
|
-
status: 0,
|
|
24
|
-
response: null,
|
|
25
|
-
timestamp: Date.now(),
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const originalOpen = xhr.open;
|
|
29
|
-
xhr.open = function(method, url, ...args) {
|
|
30
|
-
requestInfo.method = method;
|
|
31
|
-
requestInfo.url = url;
|
|
32
|
-
console.log('[XHRInterceptor] XHR opened:', method, url);
|
|
33
|
-
return originalOpen.call(xhr, method, url, ...args);
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const originalSetRequestHeader = xhr.setRequestHeader;
|
|
37
|
-
xhr.setRequestHeader = function(header, value) {
|
|
38
|
-
requestInfo.requestHeaders[header] = value;
|
|
39
|
-
return originalSetRequestHeader.call(xhr, header, value);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const originalSend = xhr.send;
|
|
43
|
-
xhr.send = function(body) {
|
|
44
|
-
let bodySize = 0;
|
|
45
|
-
try {
|
|
46
|
-
if (typeof body === 'string') bodySize = body.length;
|
|
47
|
-
else if (body && typeof body.byteLength === 'number') bodySize = body.byteLength;
|
|
48
|
-
else if (body && typeof body.size === 'number') bodySize = body.size;
|
|
49
|
-
} catch {}
|
|
50
|
-
console.log('[XHRInterceptor] XHR sent:', requestInfo.url, 'BodySize:', bodySize);
|
|
51
|
-
|
|
52
|
-
xhr.addEventListener('load', function() {
|
|
53
|
-
requestInfo.status = xhr.status;
|
|
54
|
-
requestInfo.response = xhr.response;
|
|
55
|
-
requestInfo.responseHeaders = xhr.getAllResponseHeaders();
|
|
56
|
-
|
|
57
|
-
xhrRequests.push(requestInfo);
|
|
58
|
-
if (xhrRequests.length > ${e}) {
|
|
59
|
-
xhrRequests.splice(0, xhrRequests.length - ${e});
|
|
60
|
-
}
|
|
61
|
-
console.log('[XHRInterceptor] XHR completed:', requestInfo.url, 'Status:', xhr.status);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
return originalSend.call(xhr, body);
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
return xhr;
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
window.__getXHRRequests = function() {
|
|
71
|
-
return window.__xhrRequests || [];
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
console.log('[XHRInterceptor] XHR interceptor installed');
|
|
75
|
-
})();
|
|
76
|
-
`}function n(e){return`
|
|
77
|
-
(function() {
|
|
78
|
-
if (window.__fetchInterceptorInstalled) {
|
|
79
|
-
console.log('[FetchInterceptor] Already installed');
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
window.__fetchInterceptorInstalled = true;
|
|
83
|
-
|
|
84
|
-
const originalFetch = window.__originalFetchForHook || window.fetch;
|
|
85
|
-
window.__originalFetchForHook = originalFetch;
|
|
86
|
-
if (!window.__fetchRequests) {
|
|
87
|
-
window.__fetchRequests = [];
|
|
88
|
-
}
|
|
89
|
-
const fetchRequests = window.__fetchRequests;
|
|
90
|
-
|
|
91
|
-
window.fetch = function(url, options = {}) {
|
|
92
|
-
const requestInfo = {
|
|
93
|
-
url: typeof url === 'string' ? url : url.url,
|
|
94
|
-
method: options.method || 'GET',
|
|
95
|
-
headers: options.headers || {},
|
|
96
|
-
body: options.body,
|
|
97
|
-
timestamp: Date.now(),
|
|
98
|
-
response: null,
|
|
99
|
-
status: 0,
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
console.log('[FetchInterceptor] Fetch called:', requestInfo.method, requestInfo.url);
|
|
103
|
-
|
|
104
|
-
return originalFetch.call(window, url, options).then(async (response) => {
|
|
105
|
-
requestInfo.status = response.status;
|
|
106
|
-
|
|
107
|
-
const clonedResponse = response.clone();
|
|
108
|
-
try {
|
|
109
|
-
requestInfo.response = await clonedResponse.text();
|
|
110
|
-
} catch (e) {
|
|
111
|
-
requestInfo.response = '[Unable to read response]';
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
fetchRequests.push(requestInfo);
|
|
115
|
-
if (fetchRequests.length > ${e}) {
|
|
116
|
-
fetchRequests.splice(0, fetchRequests.length - ${e});
|
|
117
|
-
}
|
|
118
|
-
// Auto-persist compact summary to localStorage so data survives context compression
|
|
119
|
-
try {
|
|
120
|
-
const summary = { url: requestInfo.url, method: requestInfo.method, status: requestInfo.status, ts: requestInfo.timestamp };
|
|
121
|
-
const prev = JSON.parse(localStorage.getItem('__capturedAPIs') || '[]');
|
|
122
|
-
prev.push(summary);
|
|
123
|
-
if (prev.length > 500) prev.splice(0, prev.length - 500);
|
|
124
|
-
localStorage.setItem('__capturedAPIs', JSON.stringify(prev));
|
|
125
|
-
} catch(e) {
|
|
126
|
-
// best-effort persistence only; ignore quota or serialization failures
|
|
127
|
-
}
|
|
128
|
-
console.log('[FetchInterceptor] Fetch completed:', requestInfo.url, 'Status:', response.status);
|
|
129
|
-
|
|
130
|
-
return response;
|
|
131
|
-
}).catch((error) => {
|
|
132
|
-
console.error('[FetchInterceptor] Fetch failed:', requestInfo.url, error);
|
|
133
|
-
throw error;
|
|
134
|
-
});
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
window.__getFetchRequests = function() {
|
|
138
|
-
return window.__fetchRequests || [];
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
console.log('[FetchInterceptor] Fetch interceptor installed');
|
|
142
|
-
})();
|
|
143
|
-
`}const r=e=>typeof e==`object`&&!!e,i=e=>!r(e)||typeof e.requestId!=`string`||!r(e.request)||typeof e.request.url!=`string`||typeof e.request.method!=`string`||e.request.postData!==void 0&&typeof e.request.postData!=`string`?!1:typeof e.timestamp==`number`,a=e=>!r(e)||typeof e.requestId!=`string`||!r(e.response)||typeof e.response.url!=`string`||typeof e.response.status!=`number`||typeof e.response.statusText!=`string`||typeof e.response.mimeType!=`string`?!1:typeof e.timestamp==`number`,o=e=>r(e)&&typeof e.requestId==`string`,s=e=>r(e)&&typeof e.body==`string`&&typeof e.base64Encoded==`boolean`,c=e=>r(e)?e:{},l=e=>{if(!r(e))return;let t=e.result;if(r(t))return t.value},u=(e,t=0)=>typeof e==`number`&&Number.isFinite(e)?e:t,d=(e,t)=>typeof e==`boolean`?e:t;var f=class{cdpSession;identity;networkEnabled=!1;requests=new Map;responses=new Map;MAX_NETWORK_RECORDS=500;MAX_INJECTED_RECORDS=500;JS_RESPONSE_CONCURRENCY=6;responseBodyCache=new Map;MAX_BODY_CACHE_ENTRIES=200;networkListeners={};constructor(t,n={}){this.cdpSession=t,this.identity=n,this.cdpSession.on(`disconnected`,()=>{e.warn(`NetworkMonitor: CDP session disconnected`),this.networkEnabled=!1,this.networkListeners={}})}async enable(){if(!this.cdpSession)throw Error(`CDP session not initialized`);if(this.networkEnabled){e.warn(`Network monitoring already enabled`);return}try{await this.cdpSession.send(`Network.enable`,{maxTotalBufferSize:1e7,maxResourceBufferSize:5e6,maxPostDataSize:65536}),e.info(`Network domain enabled`),this.networkListeners.requestWillBeSent=t=>{if(!i(t)){e.debug(`Skipping malformed Network.requestWillBeSent payload`);return}let n=this.toScopedRequestId(t.requestId),r={requestId:n,rawRequestId:t.requestId,sessionId:this.identity.sessionId,targetId:this.identity.targetId,targetType:this.identity.targetType,frameId:t.frameId,url:t.request.url,method:t.request.method,headers:c(t.request.headers),postData:t.request.postData,timestamp:t.timestamp,type:t.type,httpVersion:t.request.httpVersion,initiator:t.initiator};if(this.requests.set(n,r),this.requests.size>this.MAX_NETWORK_RECORDS){let e=this.requests.keys().next().value;e&&this.requests.delete(e)}e.debug(`Network request captured: ${t.request.method} ${t.request.url} [${n}]`)},this.networkListeners.responseReceived=t=>{if(!a(t)){e.debug(`Skipping malformed Network.responseReceived payload`);return}let n=this.toScopedRequestId(t.requestId),r={requestId:n,rawRequestId:t.requestId,sessionId:this.identity.sessionId,targetId:this.identity.targetId,targetType:this.identity.targetType,frameId:t.frameId,url:t.response.url,status:t.response.status,statusText:t.response.statusText,headers:c(t.response.headers),mimeType:t.response.mimeType,timestamp:t.timestamp,fromCache:t.response.fromDiskCache||t.response.fromServiceWorker,timing:t.response.timing};if(this.responses.set(n,r),this.responses.size>this.MAX_NETWORK_RECORDS){let e=this.responses.keys().next().value;e&&this.responses.delete(e)}e.debug(`Network response captured: ${t.response.status} ${t.response.url} [${n}]`)},this.networkListeners.loadingFinished=t=>{if(!o(t)){e.debug(`Skipping malformed Network.loadingFinished payload`);return}let n=this.toScopedRequestId(t.requestId);e.debug(`Network loading finished: ${n}`),this.captureResponseBody(n).catch(t=>{e.debug(`[BodyCache] Auto-capture failed for ${n}: ${t instanceof Error?t.message:String(t)}`)})},this.cdpSession.on(`Network.requestWillBeSent`,this.networkListeners.requestWillBeSent),this.cdpSession.on(`Network.responseReceived`,this.networkListeners.responseReceived),this.cdpSession.on(`Network.loadingFinished`,this.networkListeners.loadingFinished),this.networkEnabled=!0,e.info(` Network monitoring enabled successfully`,{requestListeners:!!this.networkListeners.requestWillBeSent,responseListeners:!!this.networkListeners.responseReceived,loadingListeners:!!this.networkListeners.loadingFinished})}catch(t){throw e.error(` Failed to enable network monitoring:`,t),this.networkEnabled=!1,t}}async captureResponseBody(t){if(this.responseBodyCache.has(t))return;let n=this.responses.get(t);if(n&&!n.fromCache)try{let r=await this.cdpSession.send(`Network.getResponseBody`,{requestId:this.toRawRequestId(t)});if(!s(r))return;if(r.body.length>1048576){e.debug(`[BodyCache] Skipping oversized body for ${t} (${r.body.length} chars)`);return}if(this.responseBodyCache.size>=this.MAX_BODY_CACHE_ENTRIES){let e=this.responseBodyCache.keys().next().value;e&&this.responseBodyCache.delete(e)}this.responseBodyCache.set(t,{body:r.body,base64Encoded:r.base64Encoded}),e.debug(`[BodyCache] Cached body for ${t} (${r.body.length} chars, url=${n.url})`)}catch(n){e.debug(`[BodyCache] Could not capture body for ${t}: ${n instanceof Error?n.message:String(n)}`)}}async disable(){if(this.networkEnabled){this.networkListeners.requestWillBeSent&&this.cdpSession.off(`Network.requestWillBeSent`,this.networkListeners.requestWillBeSent),this.networkListeners.responseReceived&&this.cdpSession.off(`Network.responseReceived`,this.networkListeners.responseReceived),this.networkListeners.loadingFinished&&this.cdpSession.off(`Network.loadingFinished`,this.networkListeners.loadingFinished);try{await this.cdpSession.send(`Network.disable`)}catch(t){e.warn(`Failed to disable Network domain:`,t)}this.networkListeners={},this.networkEnabled=!1,e.info(`Network monitoring disabled`)}}isEnabled(){return this.networkEnabled}getStatus(){return{enabled:this.networkEnabled,requestCount:this.requests.size,responseCount:this.responses.size,listenerCount:Object.keys(this.networkListeners).filter(e=>this.networkListeners[e]!==void 0).length,cdpSessionActive:!0}}getRequests(e){let t=Array.from(this.requests.values());return e?.url&&(t=t.filter(t=>t.url.includes(e.url))),e?.method&&(t=t.filter(t=>t.method===e.method)),e?.limit&&(t=t.slice(-e.limit)),t}getResponses(e){let t=Array.from(this.responses.values());return e?.url&&(t=t.filter(t=>t.url.includes(e.url))),e?.status&&(t=t.filter(t=>t.status===e.status)),e?.limit&&(t=t.slice(-e.limit)),t}getActivity(e){return{request:this.requests.get(e),response:this.responses.get(e)}}async getResponseBody(t){if(!this.cdpSession)throw Error(`CDP session not initialized`);if(!this.networkEnabled)return e.error(`Network monitoring is not enabled. Call enable() with enableNetwork: true first.`),null;let n=this.responseBodyCache.get(t);if(n)return this.responseBodyCache.delete(t),this.responseBodyCache.set(t,n),e.debug(`[BodyCache] Cache hit for ${t}`),n;let r=this.requests.get(t),i=this.responses.get(t);if(!r)return e.error(`Request not found: ${t}. Make sure network monitoring was enabled before the request.`),null;if(!i)return e.warn(`Response not yet received for request: ${t}. The request may still be pending.`),null;try{let n=await this.cdpSession.send(`Network.getResponseBody`,{requestId:this.toRawRequestId(t)});return s(n)?(e.info(`Response body retrieved for request: ${t}`,{url:i.url,status:i.status,size:n.body.length,base64:n.base64Encoded}),{body:n.body,base64Encoded:n.base64Encoded}):(e.error(`Unexpected response body payload for ${t}`),null)}catch(n){let r=n instanceof Error?n.message:String(n);return e.error(`Failed to get response body for ${t}:`,{url:i.url,status:i.status,error:r,hint:`The response body may not be available for this request type (e.g., cached, redirected, or failed requests)`}),null}}async getAllJavaScriptResponses(){let t=Array.from(this.responses.entries()).filter(([,e])=>e.mimeType.includes(`javascript`)||e.url.endsWith(`.js`)||e.url.includes(`.js?`)),n=[];for(let e=0;e<t.length;e+=this.JS_RESPONSE_CONCURRENCY){let r=t.slice(e,e+this.JS_RESPONSE_CONCURRENCY),i=await Promise.all(r.map(async([e,t])=>{let n=await this.getResponseBody(e);if(!n)return null;let r=n.base64Encoded?Buffer.from(n.body,`base64`).toString(`utf-8`):n.body;return{url:t.url,content:r,size:r.length,requestId:e}}));n.push(...i.filter(e=>e!==null))}return e.info(`Collected ${n.length} JavaScript responses`),n}clearRecords(){this.requests.clear(),this.responses.clear(),this.responseBodyCache.clear(),e.info(`Network records cleared`)}getStats(){let e={},t={},n={};for(let t of this.requests.values())e[t.method]=(e[t.method]||0)+1,t.type&&(n[t.type]=(n[t.type]||0)+1);for(let e of this.responses.values())t[e.status]=(t[e.status]||0)+1;return{totalRequests:this.requests.size,totalResponses:this.responses.size,byMethod:e,byStatus:t,byType:n}}async injectXHRInterceptor(n){if(!this.cdpSession)throw Error(`CDP session not initialized`);let r=t(this.MAX_INJECTED_RECORDS);n?.persistent?(await this.cdpSession.send(`Page.addScriptToEvaluateOnNewDocument`,{source:r}),e.info(`XHR interceptor injected (persistent)`)):(await this.cdpSession.send(`Runtime.evaluate`,{expression:r}),e.info(`XHR interceptor injected`))}async injectFetchInterceptor(t){if(!this.cdpSession)throw Error(`CDP session not initialized`);let r=n(this.MAX_INJECTED_RECORDS);t?.persistent?(await this.cdpSession.send(`Page.addScriptToEvaluateOnNewDocument`,{source:r}),e.info(`Fetch interceptor injected (persistent)`)):(await this.cdpSession.send(`Runtime.evaluate`,{expression:r}),e.info(`Fetch interceptor injected`))}async getXHRRequests(){if(!this.cdpSession)throw Error(`CDP session not initialized`);try{let e=l(await this.cdpSession.send(`Runtime.evaluate`,{expression:`window.__getXHRRequests ? window.__getXHRRequests() : []`,returnByValue:!0}));return Array.isArray(e)?e.filter(e=>r(e)):[]}catch(t){return e.error(`Failed to get XHR requests:`,t),[]}}async getFetchRequests(){if(!this.cdpSession)throw Error(`CDP session not initialized`);try{let e=l(await this.cdpSession.send(`Runtime.evaluate`,{expression:`window.__getFetchRequests ? window.__getFetchRequests() : []`,returnByValue:!0}));return Array.isArray(e)?e.filter(e=>r(e)):[]}catch(t){return e.error(`Failed to get Fetch requests:`,t),[]}}async clearInjectedBuffers(){if(!this.cdpSession)throw Error(`CDP session not initialized`);try{let e=l(await this.cdpSession.send(`Runtime.evaluate`,{expression:`
|
|
144
|
-
(() => {
|
|
145
|
-
const xhrStore = Array.isArray(window.__xhrRequests)
|
|
146
|
-
? window.__xhrRequests
|
|
147
|
-
: (typeof window.__getXHRRequests === 'function' ? window.__getXHRRequests() : null);
|
|
148
|
-
const fetchStore = Array.isArray(window.__fetchRequests)
|
|
149
|
-
? window.__fetchRequests
|
|
150
|
-
: (typeof window.__getFetchRequests === 'function' ? window.__getFetchRequests() : null);
|
|
151
|
-
|
|
152
|
-
const xhrCleared = Array.isArray(xhrStore) ? xhrStore.length : 0;
|
|
153
|
-
const fetchCleared = Array.isArray(fetchStore) ? fetchStore.length : 0;
|
|
154
|
-
|
|
155
|
-
if (Array.isArray(xhrStore)) xhrStore.length = 0;
|
|
156
|
-
if (Array.isArray(fetchStore)) fetchStore.length = 0;
|
|
157
|
-
|
|
158
|
-
return { xhrCleared, fetchCleared };
|
|
159
|
-
})()
|
|
160
|
-
`,returnByValue:!0}));return r(e)?{xhrCleared:u(e.xhrCleared),fetchCleared:u(e.fetchCleared)}:{xhrCleared:0,fetchCleared:0}}catch(t){return e.error(`Failed to clear injected network buffers:`,t),{xhrCleared:0,fetchCleared:0}}}async resetInjectedInterceptors(){if(!this.cdpSession)throw Error(`CDP session not initialized`);try{let e=l(await this.cdpSession.send(`Runtime.evaluate`,{expression:`
|
|
161
|
-
(() => {
|
|
162
|
-
let xhrReset = false;
|
|
163
|
-
let fetchReset = false;
|
|
164
|
-
|
|
165
|
-
if (window.__originalXMLHttpRequestForHook) {
|
|
166
|
-
window.XMLHttpRequest = window.__originalXMLHttpRequestForHook;
|
|
167
|
-
xhrReset = true;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
if (window.__originalFetchForHook) {
|
|
171
|
-
window.fetch = window.__originalFetchForHook;
|
|
172
|
-
fetchReset = true;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
if (Array.isArray(window.__xhrRequests)) window.__xhrRequests.length = 0;
|
|
176
|
-
if (Array.isArray(window.__fetchRequests)) window.__fetchRequests.length = 0;
|
|
177
|
-
|
|
178
|
-
window.__xhrInterceptorInstalled = false;
|
|
179
|
-
window.__fetchInterceptorInstalled = false;
|
|
180
|
-
delete window.__getXHRRequests;
|
|
181
|
-
delete window.__getFetchRequests;
|
|
182
|
-
|
|
183
|
-
return { xhrReset, fetchReset };
|
|
184
|
-
})()
|
|
185
|
-
`,returnByValue:!0}));return r(e)?{xhrReset:d(e.xhrReset,!1),fetchReset:d(e.fetchReset,!1)}:{xhrReset:!1,fetchReset:!1}}catch(t){return e.error(`Failed to reset injected network interceptors:`,t),{xhrReset:!1,fetchReset:!1}}}persistsAcrossContextSwitches(){return!1}toScopedRequestId(e){return this.identity.requestIdPrefix&&this.identity.requestIdPrefix.length>0?`${this.identity.requestIdPrefix}:${e}`:this.identity.sessionId&&this.identity.sessionId.length>0?`${this.identity.sessionId}:${e}`:e}toRawRequestId(e){let t=this.identity.requestIdPrefix;if(t&&e.startsWith(`${t}:`))return e.slice(t.length+1);let n=this.identity.sessionId;if(n&&e.startsWith(`${n}:`))return e.slice(n.length+1);let r=this.requests.get(e);if(r?.rawRequestId)return r.rawRequestId;let i=this.responses.get(e);return i?.rawRequestId?i.rawRequestId:e}};export{n,t as r,f as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-sBC6IdRT.mjs";import{hn as t,mn as n}from"./constants-BYj8Xek8.mjs";import{setTimeout as r}from"node:timers/promises";const i=[`load`,`domcontentloaded`,`networkidle`,`commit`];function a(e=`networkidle`){return e===`networkidle`?`networkidle2`:e===`commit`?`load`:e}var o=class{collector;pagePersistentScripts=new WeakMap;constructor(e){this.collector=e}getChromeNavigationWaitUntil(e=`networkidle`){return a(e)}async getBrowser(){return this.collector.getBrowser()}hasAttachedTargetSession(){return this.collector.getAttachedTargetSession()!==null}getAttachedTargetInfo(){return this.collector.getAttachedTargetInfo()}async evaluateAttachedTarget(e,t){return await this.collector.getBrowserTargetSessionManager().evaluate(e,t)}async addScriptToAttachedTarget(e){return await this.collector.getBrowserTargetSessionManager().addScriptToEvaluateOnNewDocument(e)}async addPersistentScriptToManagedTargets(e,t){return await this.collector.getBrowserTargetSessionManager().registerPersistentScript(e,t)}async addScriptToPageEvaluateOnNewDocument(e,t){let n=await this.collector.getActivePage();if(!t?.id)return await u(n,e);let r=this.getPagePersistentScriptRegistry(n),i=r.get(t.id);if(i?.source===e)return{identifier:i.identifier,reused:!0};i?.identifier&&await n.removeScriptToEvaluateOnNewDocument(i.identifier).catch(()=>{});let a=await u(n,e);return r.set(t.id,{source:e,identifier:a.identifier}),a}getPagePersistentScriptRegistry(e){let t=this.pagePersistentScripts.get(e);return t||(t=new Map,this.pagePersistentScripts.set(e,t)),t}async navigate(t,n){let r=await this.collector.getActivePage(),i=Date.now();await r.goto(t,{waitUntil:this.getChromeNavigationWaitUntil(n?.waitUntil),timeout:n?.timeout||3e4});let a=Date.now()-i,o=await r.title(),s=r.url();return e.info(`Navigated to: ${t}`),{url:s,title:o,loadTime:a}}async reload(t){await(await this.collector.getActivePage()).reload({waitUntil:this.getChromeNavigationWaitUntil(t?.waitUntil),timeout:t?.timeout||3e4}),e.info(`Page reloaded`)}async goBack(t=1e4){await(await this.collector.getActivePage()).goBack({waitUntil:`domcontentloaded`,timeout:t}),e.info(`Navigated back`)}async goForward(t=1e4){await(await this.collector.getActivePage()).goForward({waitUntil:`domcontentloaded`,timeout:t}),e.info(`Navigated forward`)}async click(t,n,r){let i=await this.collector.getActivePage(),a=await this.resolveFrame(i,r),o=n?.timeout,s={button:n?.button||`left`,clickCount:n?.clickCount||1,delay:n?.delay};if(n?.offset&&(s.offset=n.offset),typeof o==`number`&&Number.isFinite(o)&&o>0){i.setDefaultTimeout(o);try{await a.click(t,s)}finally{i.setDefaultTimeout(this.collector.config?.timeout??3e4)}}else await a.click(t,s);e.info(`Clicked: ${t}${r?.frameUrl||r?.frameSelector?` (in frame)`:``}`)}async type(t,n,r,i){let a=await this.collector.getActivePage();await(await this.resolveFrame(a,i)).type(t,n,{delay:r?.delay}),e.info(`Typed into ${t}: ${n.substring(0,20)}...`)}async select(t,n,r){let i=await this.collector.getActivePage();await(await this.resolveFrame(i,r)).select(t,...n),e.info(`Selected in ${t}: ${n.join(`, `)}`)}async hover(t,n){let r=await this.collector.getActivePage();await(await this.resolveFrame(r,n)).hover(t),e.info(`Hovered: ${t}`)}async scroll(t){await(await this.collector.getActivePage()).evaluate(e=>{window.scrollTo(e.x||0,e.y||0)},t),e.info(`Scrolled to: x=${t.x||0}, y=${t.y||0}`)}async waitForSelector(t,n){try{let r=await this.collector.getActivePage();await r.waitForSelector(t,{timeout:n||3e4});let i=await r.evaluate(e=>{let t=document.querySelector(e);return t?{tagName:t.tagName.toLowerCase(),id:t.id||void 0,className:t.className||void 0,textContent:t.textContent?.trim().substring(0,100)||void 0,attributes:Array.from(t.attributes).reduce((e,t)=>(e[t.name]=t.value,e),{})}:null},t);return e.info(`Selector appeared: ${t}`),{success:!0,element:i,message:`Selector appeared: ${t}`}}catch(n){return e.error(`waitForSelector timeout for ${t}:`,n),{success:!1,message:`Timeout waiting for selector: ${t}`}}}async waitForNavigation(t){await(await this.collector.getActivePage()).waitForNavigation({waitUntil:this.getChromeNavigationWaitUntil(),timeout:t||3e4}),e.info(`Navigation completed`)}async evaluate(t,n){let r=await this.collector.getActivePage();if(n?.frameUrl||n?.frameSelector){let i=await c(r,await this.resolveFrame(r,n),t);return e.info(`JavaScript executed (in frame)`),i}let i=await l(r,t);return e.info(`JavaScript executed`),i}async resolveFrame(e,t){if(!t)return e.mainFrame();if(t.frameUrl){let n=e.frames(),r=n.find(e=>e.url().includes(t.frameUrl));if(!r){let e=n.map(e=>e.url()).filter(e=>e&&e!==`about:blank`);throw Error(`No frame matching URL substring "${t.frameUrl}". Available frames: ${e.join(`, `)||`(none)`}`)}return r}if(t.frameSelector){await e.waitForSelector(t.frameSelector,{timeout:n}).catch(()=>null);let r=await e.$(t.frameSelector);if(!r)throw Error(`No element found for iframe selector: ${t.frameSelector}`);let i=await r.contentFrame();if(!i)throw Error(`Element "${t.frameSelector}" exists but has no content frame (not an iframe or not yet loaded).`);return i}return e.mainFrame()}async listFrames(){let e=await this.collector.getActivePage(),t=e.mainFrame(),n=e.frames(),r=d(t.url());return n.map(e=>{let n=e._id||e.url(),i=e.parentFrame(),a=i?i._id||i.url():null,o=d(e.url());return{frameId:n,url:e.url(),name:e.name()||``,parentFrameId:a,parentUrl:i?.url()||null,isMainFrame:e===t,crossOrigin:!!(e!==t&&o&&r&&o!==r)}})}async getURL(){return(await this.collector.getActivePage()).url()}async getTitle(){return await(await this.collector.getActivePage()).title()}async getContent(){return await(await this.collector.getActivePage()).content()}async screenshot(t){if(this.hasAttachedTargetSession()){let n=this.collector.getBrowserTargetSessionManager();if(n){let r=await n.captureScreenshot({format:t?.type??`png`,quality:t?.quality,clip:t?.clip});return e.info(`Screenshot taken via CDP${t?.path?`: ${t.path}`:``}`),r}}let n=await this.collector.getActivePage(),r={path:t?.path,type:t?.type||`png`,quality:t?.quality,fullPage:t?.fullPage||!1};t?.clip&&(r.clip=t.clip,r.fullPage=!1);let i=await n.screenshot(r);return e.info(`Screenshot taken${t?.path?`: ${t.path}`:``}`),i}async getPerformanceMetrics(){let t=await l(await this.collector.getActivePage(),()=>{let e=performance.getEntriesByType(`navigation`)[0];return{domContentLoaded:e.domContentLoadedEventEnd-e.domContentLoadedEventStart,loadComplete:e.loadEventEnd-e.loadEventStart,dns:e.domainLookupEnd-e.domainLookupStart,tcp:e.connectEnd-e.connectStart,request:e.responseStart-e.requestStart,response:e.responseEnd-e.responseStart,total:e.loadEventEnd-e.fetchStart,resources:performance.getEntriesByType(`resource`).length}});return e.info(`Performance metrics retrieved`),t}async injectScript(t){await l(await this.collector.getActivePage(),e=>{let t=document.createElement(`script`);t.textContent=e,document.head.appendChild(t)},t),e.info(`Script injected into page`)}async setCookies(t){await(await this.collector.getActivePage()).setCookie(...t),e.info(`Set ${t.length} cookies`)}async getCookies(){let t=await(await this.collector.getActivePage()).cookies();return e.info(`Retrieved ${t.length} cookies`),t}async clearCookies(){if(this.collector.isExistingBrowserConnection())throw Error(`Cannot clear cookies on an attached browser. This operation is restricted to browsers launched by jshook to prevent accidental modification of user data.`);let t=await this.collector.getActivePage(),n=await t.cookies();await t.deleteCookie(...n),e.info(`All cookies cleared`)}async setViewport(t,n){await(await this.collector.getActivePage()).setViewport({width:t,height:n}),e.info(`Viewport set to ${t}x${n}`)}async emulateDevice(t){let n=await this.collector.getActivePage(),r={iPhone:{viewport:{width:375,height:812,isMobile:!0},userAgent:`Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15`},iPad:{viewport:{width:768,height:1024,isMobile:!0},userAgent:`Mozilla/5.0 (iPad; CPU OS 14_0 like Mac OS X) AppleWebKit/605.1.15`},Android:{viewport:{width:360,height:640,isMobile:!0},userAgent:`Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 Chrome/91.0.4472.120`}},i=String(t||``).trim().toLowerCase(),a=null;if(i.includes(`iphone`)?a=`iPhone`:i.includes(`ipad`)?a=`iPad`:(i.includes(`android`)||i.includes(`pixel`))&&(a=`Android`),!a)throw Error(`Unsupported device "${t}". Supported values include: iPhone, iPad, Android (aliases like "iPhone 13" are accepted).`);let o=r[a];return await n.setViewport(o.viewport),await n.setUserAgent(o.userAgent),e.info(`Emulating ${a} (input: ${t})`),a}async waitForNetworkIdle(n=t){await(await this.collector.getActivePage()).waitForNetworkIdle({timeout:n}),e.info(`Network is idle`)}async getLocalStorage(){let t=await(await this.collector.getActivePage()).evaluate(()=>{let e={};for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n&&(e[n]=localStorage.getItem(n)||``)}return e});return e.info(`Retrieved ${Object.keys(t).length} localStorage items`),t}async setLocalStorage(t,n){await(await this.collector.getActivePage()).evaluate((e,t)=>{localStorage.setItem(e,t)},t,n),e.info(`Set localStorage: ${t}`)}async clearLocalStorage(){if(this.collector.isExistingBrowserConnection())throw Error(`Cannot clear localStorage on an attached browser. This operation is restricted to browsers launched by jshook to prevent accidental modification of user data.`);await(await this.collector.getActivePage()).evaluate(()=>{localStorage.clear()}),e.info(`LocalStorage cleared`)}async pressKey(t){await(await this.collector.getActivePage()).keyboard.press(t),e.info(`Pressed key: ${t}`)}async uploadFile(t,n,r){let i=await this.collector.getActivePage(),a=await(r?await this.resolveFrame(i,r):i).$(t);if(!a)throw Error(`File input not found: ${t}`);let o=Array.isArray(n)?n:[n];await a.uploadFile(...o),e.info(`File uploaded: ${o.join(`, `)}`)}async getAllLinks(){let t=await(await this.collector.getActivePage()).evaluate(()=>{let e=document.querySelectorAll(`a[href]`),t=[];for(let n=0;n<e.length;n++){let r=e[n];t.push({text:r.textContent?.trim()||``,href:r.href})}return t});return e.info(`Found ${t.length} links`),t}async getPage(){return await this.collector.getActivePage()}};async function s(e,t=500){let n=new AbortController,i=r(t,void 0,{signal:n.signal}).then(()=>{throw Error(`cdp_unreachable`)}),a=null;try{a=await Promise.race([e.createCDPSession(),i]),await Promise.race([a.send(`Runtime.evaluate`,{expression:`1`,returnByValue:!0}),i])}catch(e){throw(e instanceof Error?e.message:String(e))===`cdp_unreachable`?Error(`CDP session unresponsive — the debugger may be blocking page evaluation. Call debugger_lifecycle({ action: 'disable' })() before this tool, or run it before debugger_lifecycle({ action: 'enable' })().`,{cause:e}):e}finally{if(n.abort(),a)try{await a.detach()}catch{}}}async function c(e,t,n,...r){let i=3e4;await s(e);let a;try{return await Promise.race([t.evaluate(n,...r),new Promise((e,t)=>{a=setTimeout(()=>t(Error(`page.evaluate timed out after ${i}ms`)),i)})])}finally{a!==void 0&&clearTimeout(a)}}async function l(e,t,...n){return c(e,e,t,...n)}async function u(e,t,...n){let r=3e4;return await s(e),Promise.race([e.evaluateOnNewDocument(t,...n),new Promise((e,t)=>setTimeout(()=>t(Error(`page.evaluateOnNewDocument timed out after ${r}ms`)),r))])}function d(e){try{return new URL(e).origin}catch{return null}}async function f(e,t){let n=3e4;return Promise.race([e.coverage.startJSCoverage(t),new Promise((e,t)=>setTimeout(()=>t(Error(`coverage.startJSCoverage timed out after ${n}ms`)),n))])}async function p(e,t){let n=3e4;return Promise.race([e.coverage.startCSSCoverage(t),new Promise((e,t)=>setTimeout(()=>t(Error(`coverage.startCSSCoverage timed out after ${n}ms`)),n))])}async function m(e){let t=3e4;return Promise.race([e.coverage.stopJSCoverage(),new Promise((e,n)=>setTimeout(()=>n(Error(`coverage.stopJSCoverage timed out after ${t}ms`)),t))])}async function h(e){let t=3e4;return Promise.race([e.coverage.stopCSSCoverage(),new Promise((e,n)=>setTimeout(()=>n(Error(`coverage.stopCSSCoverage timed out after ${t}ms`)),t))])}export{m as a,i as c,h as i,a as l,p as n,u as o,f as r,l as s,o as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_n as e,gn as t,vn as n,yn as r}from"./constants-BYj8Xek8.mjs";import{t as i}from"./factory-CKr4fAE1.mjs";import{t as a}from"./NativeMemoryManager.impl-DniBe2wf.mjs";import{n as o,t as s}from"./formatAddress-vLA_hOJt.mjs";import{randomUUID as c}from"node:crypto";var l=class{providerCache=null;get provider(){return this.providerCache||=i(),this.providerCache}set provider(e){this.providerCache=e}async scan(r,i,a){let c=performance.now(),l=Math.min(a?.maxDepth??4,t),u=a?.maxOffset??e,d=a?.maxResults??n,f=a?.alignment??8,p=a?.staticOnly??!1,m=o(i),h=this.provider.openProcess(r,!1);try{let e=await this.getModuleMap(r),t=[],n=new Set([m]);for(let e=0;e<l&&n.size!==0;e++){let e=this.scanLevel(h,n,u,f,a?.modules?{modules:a.modules}:void 0);if(e.length===0)break;t.push(e),n=new Set;for(let t of e)if(n.add(t.pointerAddress),n.size>5e4)break}let i=this.buildChains(t,m,e,d,p),o=`${(performance.now()-c).toFixed(1)}ms`;return{pid:r,targetAddress:s(m),chains:i,totalFound:i.length,maxDepth:l,elapsed:o}}finally{this.provider.closeProcess(h)}}async validateChain(e,t){let n=this.provider.openProcess(e,!1);try{let e=o(t.baseAddress);for(let r=0;r<t.links.length;r++){let i=t.links[r],a;try{a=this.provider.readMemory(n,e,8).data.readBigUInt64LE(0)}catch{return{chainId:t.id,isValid:!1,resolvedAddress:null,expectedAddress:t.targetAddress,brokenAt:r}}e=a+BigInt(i.offset)}let r=s(e),i=o(t.targetAddress),a=e===i;return{chainId:t.id,isValid:a,resolvedAddress:r,expectedAddress:t.targetAddress,brokenAt:a?void 0:t.links.length-1}}finally{this.provider.closeProcess(n)}}async validateChains(e,t){let n=[];for(let r of t)n.push(await this.validateChain(e,r));return n}async resolveChain(e,t){let n=this.provider.openProcess(e,!1);try{let e=o(t.baseAddress);for(let r of t.links){let t;try{t=this.provider.readMemory(n,e,8).data.readBigUInt64LE(0)}catch{return null}e=t+BigInt(r.offset)}return s(e)}finally{this.provider.closeProcess(n)}}exportChains(e){return JSON.stringify(e,null,2)}importChains(e){let t=JSON.parse(e);if(!Array.isArray(t))throw Error(`Invalid chain data: expected array`);return t}async getModuleMap(e){let t=new Map;try{let n=await a.enumerateModules(e);if(n.success&&n.modules)for(let e of n.modules){let n=o(e.baseAddress);t.set(e.name.toLowerCase(),{name:e.name,base:n,size:e.size})}}catch{}return t}resolveToModule(e,t){for(let n of t.values())if(e>=n.base&&e<n.base+BigInt(n.size))return{module:n.name,offset:Number(e-n.base)};return null}scanLevel(e,t,n,i,a){let o=[],s=r,c=Array.from(t).toSorted((e,t)=>e<t?-1:+(e>t));if(c.length===0)return o;let l=BigInt(n),u=c[0]-l,d=c[c.length-1]+l,f=0n,p=BigInt(`0x7FFFFFFF0000`);for(;f<p;){let t=this.provider.queryRegion(e,f);if(!t)break;let r=t.size;if(t.isReadable&&r>0&&r<=2**53-1){let a=t.baseAddress;for(let t=0;t<r&&o.length<1e5;t+=s){let f=Math.min(s,r-t),p=a+BigInt(t),m;try{m=this.provider.readMemory(e,p,f).data}catch{break}for(let e=0;e<=m.length-8;e+=i){let t=m.readBigUInt64LE(e);if(t<u||t>d)continue;let r=t-l,i=t+l,a=0,s=c.length;for(;a<s;){let e=a+s>>>1;c[e]<r?a=e+1:s=e}for(let r=a;r<c.length&&c[r]<=i;r++){let i=c[r];if(Number(t>i?t-i:i-t)<=n){let n=p+BigInt(e),r=Number(i-t);o.push({pointerAddress:n,pointsTo:t,offset:r});break}}}}}f=t.baseAddress+BigInt(t.size)}return o}buildChains(t,n,r,i,a){if(t.length===0)return[];let o=[],l=s(n);for(let n=0;n<t.length&&o.length<i;n++){let u=t[n];if(n===0)for(let e of u){if(o.length>=i)break;let t=s(e.pointerAddress),n=this.resolveToModule(e.pointerAddress,r),u=n!==null;if(a&&!u)continue;let d={address:t,module:n?.module,moduleOffset:n?.offset,offset:e.offset};o.push({id:c(),links:[d],targetAddress:l,baseAddress:t,isStatic:u,depth:1,lastValidated:Date.now(),isValid:!0})}else{let d=t[n-1],f=new Map;for(let e of d)f.set(e.pointerAddress,e);let p=BigInt(e);for(let e of u){if(o.length>=i)break;let t;if(t=f.get(e.pointsTo),!t){for(let n of d)if((e.pointsTo>n.pointerAddress?e.pointsTo-n.pointerAddress:n.pointerAddress-e.pointsTo)<=p){t=n;break}}if(!t)continue;let n=s(e.pointerAddress),u=this.resolveToModule(e.pointerAddress,r),m=u!==null;if(a&&!m)continue;let h=[{address:n,module:u?.module,moduleOffset:u?.offset,offset:Number(t.pointerAddress-e.pointsTo)},{address:s(t.pointerAddress),offset:t.offset}];o.push({id:c(),links:h,targetAddress:l,baseAddress:n,isStatic:m,depth:h.length,lastValidated:Date.now(),isValid:!0})}}}return o.sort((e,t)=>e.isStatic===t.isStatic?e.depth-t.depth:e.isStatic?-1:1),o.slice(0,i)}};const u=new l;export{l as PointerChainEngine,u as pointerChainEngine};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./ToolError-DWU_z7gp.mjs";var t=class extends e{constructor(e){super(`PREREQUISITE`,e),this.name=`PrerequisiteError`}};export{t};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-sBC6IdRT.mjs";import{t}from"./matchesWildcardPattern-BAG6LvX5.mjs";import{setImmediate as n}from"node:timers/promises";const r=e=>e instanceof Error?e.message:String(e),i=e=>typeof e==`object`&&e?e:null,a=e=>typeof e==`function`?e:null,o=(e,t)=>{let n=i(e),r=n?.default;return a(i(r)?.default)??a(r)??a(n?.[t])??a(e)};async function s(t,n,i,a={}){let{maxDepth:s=3,maxSize:c=500,includeComments:l=!0}=a,u=await t.getScriptSource(n);if(!u?.source)throw Error(`Script not found: ${n}`);let d,f,p,m;try{d=await import(`@babel/parser`);let e=o(await import(`@babel/traverse`),`traverse`);if(typeof e!=`function`)throw Error(`Invalid @babel/traverse export shape`);f=e;let t=o(await import(`@babel/generator`),`generate`);if(typeof t!=`function`)throw Error(`Invalid @babel/generator export shape`);p=t,m=await import(`@babel/types`)}catch(e){throw Error(`Failed to load Babel dependencies. Please install: npm install @babel/parser @babel/traverse @babel/generator @babel/types\nError: ${r(e)}`,{cause:e})}let h;try{h=d.parse(u.source,{sourceType:`unambiguous`,plugins:[`jsx`,`typescript`]})}catch(e){throw Error(`Failed to parse script ${n}: ${r(e)}`,{cause:e})}let g=new Map,_={},v=e=>{let t=new Set;return e.traverse({CallExpression(e){m.isIdentifier(e.node.callee)&&t.add(e.node.callee.name)}}),Array.from(t)};f(h,{FunctionDeclaration(e){let t=e.node.id?.name;if(!t)return;let n=p(e.node,{comments:l}).code,r=v(e);g.set(t,{name:t,code:n,startLine:e.node.loc?.start.line||0,endLine:e.node.loc?.end.line||0,dependencies:r,size:n.length}),_[t]=r},VariableDeclarator(e){if(m.isIdentifier(e.node.id)&&(m.isFunctionExpression(e.node.init)||m.isArrowFunctionExpression(e.node.init))){let t=e.node.id.name,n=p(e.node,{comments:l}).code,r=v(e);g.set(t,{name:t,code:n,startLine:e.node.loc?.start.line||0,endLine:e.node.loc?.end.line||0,dependencies:r,size:n.length}),_[t]=r}}});let y=new Set,b=[i],x=0;for(;b.length>0&&x<s;){let e=b.shift();if(y.has(e))continue;let t=g.get(e);if(t){y.add(e);for(let e of t.dependencies)!y.has(e)&&g.has(e)&&b.push(e);x++}}let S=Array.from(y).map(e=>g.get(e)).filter(Boolean),C=S.map(e=>e.code).join(`
|
|
2
|
-
|
|
3
|
-
`),w=C.length;return w>c*1024&&e.warn(`Extracted code size (${(w/1024).toFixed(2)}KB) exceeds limit (${c}KB)`),e.info(`extractFunctionTree: ${i} - extracted ${S.length} functions (${(w/1024).toFixed(2)}KB)`),{mainFunction:i,code:C,functions:S,callGraph:_,totalSize:w,extractedCount:S.length}}var c=class r{collector;static SOURCE_LOAD_BATCH_SIZE=8;static SEARCH_LINE_YIELD_INTERVAL=250;static SEARCH_SCRIPT_YIELD_INTERVAL=10;cdpSession=null;scripts=new Map;scriptsByUrl=new Map;initialized=!1;initPromise;keywordIndex=new Map;scriptChunks=new Map;CHUNK_SIZE=100*1024;MAX_KEYWORD_INDEX_ENTRIES=5e4;CDP_HEALTH_PROBE_INTERVAL_MS=3e4;lastHealthProbeAt=0;constructor(e){this.collector=e}async init(){if(!this.initialized){if(this.initPromise)return this.initPromise;this.initPromise=this.doInit();try{return await this.initPromise}finally{this.initPromise=void 0}}}async doInit(){let t=await this.collector.getActivePage();this.cdpSession=await t.createCDPSession(),this.cdpSession.on(`Debugger.scriptParsed`,t=>{let n={scriptId:t.scriptId,url:t.url,startLine:t.startLine,startColumn:t.startColumn,endLine:t.endLine,endColumn:t.endColumn,sourceLength:t.length};this.scripts.set(t.scriptId,n),t.url&&(this.scriptsByUrl.has(t.url)||this.scriptsByUrl.set(t.url,[]),this.scriptsByUrl.get(t.url).push(n)),e.debug(`Script parsed: ${t.url||`inline`} (${t.scriptId})`)}),await this.cdpSession.send(`Debugger.enable`),this.initialized=!0,this.lastHealthProbeAt=Date.now(),e.info(`ScriptManager initialized`)}async loadScriptSourceInternal(t){if(t.source)return!0;try{let{scriptSource:e}=await this.cdpSession.send(`Debugger.getScriptSource`,{scriptId:t.scriptId});return t.source=e,t.sourceLength=e.length,this.buildKeywordIndex(t.scriptId,t.url,e),this.chunkScript(t.scriptId,e),!0}catch(n){return e.warn(`Failed to get source for script ${t.scriptId}:`,n),!1}}async enable(){return this.init()}async ensureCdpSession(){if(!this.cdpSession){await this.init();return}if(!this.initialized){await this.init();return}let t=Date.now();if(!(t-this.lastHealthProbeAt<this.CDP_HEALTH_PROBE_INTERVAL_MS))try{await Promise.race([this.cdpSession.send(`Runtime.evaluate`,{expression:`1`,returnByValue:!0}),new Promise((e,t)=>setTimeout(()=>t(Error(`session_unreachable`)),3e3))]),this.lastHealthProbeAt=t}catch{e.warn(`ScriptManager CDP session unresponsive (zombie), reinitializing...`),this.cdpSession=null,this.initialized=!1,this.lastHealthProbeAt=0,this.scripts.clear(),this.scriptsByUrl.clear(),this.keywordIndex.clear(),this.scriptChunks.clear(),await this.init()}}async getAllScripts(t=!1,i=1e3){await this.ensureCdpSession();let a=Array.from(this.scripts.values());a.length>i&&e.warn(`Found ${a.length} scripts, limiting to ${i}. Increase maxScripts parameter if needed.`);let o=a.slice(0,i);if(t){e.warn(`Loading source code for ${o.length} scripts. This may use significant memory.`);let t=0,i=0,a=o.filter(e=>!e.source);for(let s=0;s<a.length;s+=r.SOURCE_LOAD_BATCH_SIZE){let c=a.slice(s,s+r.SOURCE_LOAD_BATCH_SIZE),l=await Promise.allSettled(c.map(async n=>{await this.loadScriptSourceInternal(n)?(t++,t%10==0&&e.debug(`Loaded ${t}/${o.length} scripts...`)):i++}));for(let e of l)e.status===`rejected`&&i++;await n()}e.info(`getAllScripts: ${o.length} scripts (loaded: ${t}, failed: ${i})`)}else e.info(`getAllScripts: ${o.length} scripts (source not included)`);return o}async getScriptSource(n,r){if(!n&&!r)throw Error(`Either scriptId or url parameter must be provided`);await this.ensureCdpSession();let i;if(n)i=this.scripts.get(n);else if(r){for(let[e,n]of this.scriptsByUrl.entries())if(t(e,r)){i=n[0];break}}return i?!i.source&&!await this.loadScriptSourceInternal(i)?(e.error(`Failed to get script source for ${i.scriptId}`),null):(e.info(`getScriptSource: ${i.url||`inline`} (${i.sourceLength} bytes)`),i):(e.warn(`Script not found: ${n||r}`),null)}async findScriptsByUrl(n){await this.ensureCdpSession();let r=[];for(let[e,i]of this.scriptsByUrl.entries())t(e,n)&&r.push(...i);return e.info(`findScriptsByUrl: ${n} - found ${r.length} scripts`),r}clearCache(){this.clear()}async searchInScripts(t,i={}){await this.ensureCdpSession();let{isRegex:a=!1,caseSensitive:o=!1,contextLines:s=3,maxMatches:c=100}=i,l=a?new RegExp(t,o?`g`:`gi`):new RegExp(t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),o?`g`:`gi`),u=[],d=await this.getAllScripts(!0,500);for(let[e,t]of d.entries()){if(!t.source)continue;if(u.length>=c)break;let i=t.source.split(`
|
|
4
|
-
`);for(let e=0;e<i.length;e++){let a=i[e];if(!a)continue;let o=Array.from(a.matchAll(l));for(let n of o){if(u.length>=c)break;let r=Math.max(0,e-s),o=Math.min(i.length-1,e+s),l=i.slice(r,o+1).join(`
|
|
5
|
-
`);if(l.length>2e3){let e=n.index||0,t=Math.max(0,e-100),r=Math.min(a.length,e+100);l=(t>0?`...`:``)+a.substring(t,r)+(r<a.length?`...`:``)}u.push({scriptId:t.scriptId,url:t.url||`inline`,line:e+1,column:n.index||0,matchText:n[0],context:l})}(e+1)%r.SEARCH_LINE_YIELD_INTERVAL===0&&await n()}(e+1)%r.SEARCH_SCRIPT_YIELD_INTERVAL===0&&await n()}return e.info(`searchInScripts: "${t}" - found ${u.length} matches`),{keyword:t,totalMatches:u.length,matches:u}}async extractFunctionTree(e,t,n={}){return s(this,e,t,n)}clear(){this.scripts.clear(),this.scriptsByUrl.clear(),this.keywordIndex.clear(),this.scriptChunks.clear(),e.info(` ScriptManager cleared - ready for new website`)}async close(){if(this.initPromise=void 0,this.clear(),this.cdpSession){try{await this.cdpSession.send(`Debugger.disable`),await this.cdpSession.detach(),e.info(`CDP session closed`)}catch(t){e.warn(`Failed to close CDP session:`,t)}this.cdpSession=null}this.initialized=!1,e.info(` ScriptManager closed`)}getStats(){let e=0;for(let t of this.scriptChunks.values())e+=t.length;return{totalScripts:this.scripts.size,totalUrls:this.scriptsByUrl.size,indexedKeywords:this.keywordIndex.size,totalChunks:e}}buildKeywordIndex(t,n,r){let i=r.split(`
|
|
6
|
-
`),a=/\b[a-zA-Z_$][a-zA-Z0-9_$]{2,}\b/g;for(let e=0;e<i.length;e++){let r=i[e];if(!r)continue;let o=Array.from(r.matchAll(a));for(let a of o){let o=a[0].toLowerCase(),s=Math.max(0,e-3),c=Math.min(i.length-1,e+3),l=i.slice(s,c+1).join(`
|
|
7
|
-
`);if(l.length>1e3){let e=a.index||0,t=Math.max(0,e-50),n=Math.min(r.length,e+50);l=(t>0?`...`:``)+r.substring(t,n)+(n<r.length?`...`:``)}let u={scriptId:t,url:n,line:e+1,column:a.index||0,context:l};this.keywordIndex.has(o)||this.keywordIndex.set(o,[]),this.keywordIndex.get(o).push(u)}}if(e.debug(` Indexed ${this.keywordIndex.size} keywords for ${n}`),this.keywordIndex.size>this.MAX_KEYWORD_INDEX_ENTRIES){let t=this.keywordIndex.size-this.MAX_KEYWORD_INDEX_ENTRIES,n=0;for(let[e]of this.keywordIndex){if(n>=t)break;this.keywordIndex.delete(e),n++}e.debug(` Keyword index pruned ${n} entries (cap: ${this.MAX_KEYWORD_INDEX_ENTRIES})`)}}chunkScript(t,n){let r=[],i=0,a=0;for(;i<n.length;){let e=n.substring(i,i+this.CHUNK_SIZE);r.push({scriptId:t,chunkIndex:a,content:e,size:e.length}),i+=this.CHUNK_SIZE,a++}this.scriptChunks.set(t,r),e.debug(` Chunked script ${t} into ${r.length} chunks`)}getScriptChunk(e,t){let n=this.scriptChunks.get(e);if(!n||t>=n.length)return null;let r=n[t];return r?r.content:null}async searchInScriptsEnhanced(t,n={}){let{isRegex:r=!1,caseSensitive:i=!1,maxMatches:a=100}=n,o=i?t:t.toLowerCase(),s=[];if(r)return{...await this.searchInScripts(t,n),searchMethod:`regex`};for(let[e,t]of this.keywordIndex.entries()){if(e.includes(o)){for(let n of t)if(s.push({scriptId:n.scriptId,url:n.url,line:n.line,column:n.column,matchText:e,context:n.context}),s.length>=a)break}if(s.length>=a)break}return e.info(` Enhanced search (indexed) found ${s.length} matches for "${t}"`),{keyword:t,totalMatches:s.length,matches:s,searchMethod:`indexed`}}};export{c as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-sBC6IdRT.mjs";import{t}from"./ToolCatalog-CYdD9F5f.mjs";const n={endpoint:null,selectedIndex:null,selectedUrl:null,selectedTitle:null,selectedTargetId:null,browserPid:null,rendererPid:null,attachedAt:null};var r=class{dirty=!1;persistedRevision=0;revision=0;pendingActivatedDomains=new Set;pendingDomainTtls=new Map;browserAttach={...n};toolCoverage=new Map;markPersisted(){this.persistedRevision=this.revision,this.dirty=!1}isPersistDirty(){return this.dirty||this.revision!==this.persistedRevision}exportSnapshot(){return{schemaVersion:1,savedAt:new Date().toISOString(),activatedDomains:[...this.pendingActivatedDomains].toSorted(),domainTtls:Object.fromEntries([...this.pendingDomainTtls.entries()].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,{ttlMinutes:t.ttlMinutes,toolNames:[...t.toolNames]}])),browserAttach:{...this.browserAttach},toolCoverage:Object.fromEntries([...this.toolCoverage.entries()].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,{...t,lastArgsKeys:[...t.lastArgsKeys]}]))}}restoreSnapshot(e){if(!e||typeof e!=`object`)return;let t=e;if(t.schemaVersion!==1)return;if(this.pendingActivatedDomains=new Set(Array.isArray(t.activatedDomains)?t.activatedDomains.filter(e=>typeof e==`string`):[]),this.pendingDomainTtls=new Map,t.domainTtls&&typeof t.domainTtls==`object`)for(let[e,n]of Object.entries(t.domainTtls)){if(!n||typeof n!=`object`)continue;let t=n,r=Number(t.ttlMinutes),i=Array.isArray(t.toolNames)?t.toolNames.filter(e=>typeof e==`string`):[];Number.isFinite(r)&&this.pendingDomainTtls.set(e,{ttlMinutes:r,toolNames:i})}let r=t.browserAttach;if(this.browserAttach=r&&typeof r==`object`?{endpoint:typeof r.endpoint==`string`?r.endpoint:null,selectedIndex:typeof r.selectedIndex==`number`&&Number.isInteger(r.selectedIndex)?r.selectedIndex:null,selectedUrl:typeof r.selectedUrl==`string`?r.selectedUrl:null,selectedTitle:typeof r.selectedTitle==`string`?r.selectedTitle:null,selectedTargetId:typeof r.selectedTargetId==`string`?r.selectedTargetId:null,browserPid:typeof r.browserPid==`number`&&Number.isInteger(r.browserPid)?r.browserPid:null,rendererPid:typeof r.rendererPid==`number`&&Number.isInteger(r.rendererPid)?r.rendererPid:null,attachedAt:typeof r.attachedAt==`string`?r.attachedAt:null}:{...n},this.toolCoverage.clear(),t.toolCoverage&&typeof t.toolCoverage==`object`)for(let[e,n]of Object.entries(t.toolCoverage)){if(!n||typeof n!=`object`)continue;let t=n;this.toolCoverage.set(e,{count:typeof t.count==`number`&&Number.isFinite(t.count)&&t.count>=0?Math.trunc(t.count):0,lastCalledAt:typeof t.lastCalledAt==`string`?t.lastCalledAt:null,lastArgsKeys:Array.isArray(t.lastArgsKeys)?t.lastArgsKeys.filter(e=>typeof e==`string`):[]})}this.revision+=1,this.persistedRevision=this.revision,this.dirty=!1}noteDirty(){this.revision+=1,this.dirty=!0}setPendingDomainActivation(e,t,n){this.pendingActivatedDomains.add(e),this.pendingDomainTtls.set(e,{ttlMinutes:t,toolNames:[...n]}),this.noteDirty()}clearPendingDomainActivation(e){let t=this.pendingActivatedDomains.delete(e),n=this.pendingDomainTtls.delete(e);(t||n)&&this.noteDirty()}getPendingActivatedDomains(){return[...this.pendingActivatedDomains]}getPendingDomainTtl(e){return this.pendingDomainTtls.get(e)??null}setBrowserAttach(e){this.browserAttach={...this.browserAttach,...e},this.noteDirty()}clearBrowserAttach(){this.browserAttach={...n},this.noteDirty()}getBrowserAttach(){return{...this.browserAttach}}recordToolCall(e,t){let n={count:(this.toolCoverage.get(e)?.count??0)+1,lastCalledAt:new Date().toISOString(),lastArgsKeys:Object.keys(t).filter(e=>e!==`_meta`).toSorted()};this.toolCoverage.set(e,n),this.noteDirty()}getCoverageSummary(e){let n=Object.fromEntries([...this.toolCoverage.entries()].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,{...t,lastArgsKeys:[...t.lastArgsKeys]}])),r=new Set([...t.map(e=>e.name),...e.selectedTools.map(e=>e.name),...e.activatedToolNames,...e.extensionToolsByName.keys(),...e.metaToolsByName.keys()]),i=[...this.toolCoverage.keys()].filter(e=>!r.has(e)).toSorted((e,t)=>e.localeCompare(t)),a=[...r].filter(e=>!this.toolCoverage.has(e)).toSorted((e,t)=>e.localeCompare(t));return{called:n,calledCount:this.toolCoverage.size,uncataloguedCalls:i,uncataloguedCallCount:i.length,totalKnownTools:r.size,uncalled:a,uncalledCount:a.length}}};function i(e){return!e||typeof e.getDomainInstance!=`function`?null:e.getDomainInstance(`serverRuntimeState`)??null}async function a(t){let n=i(t);if(!n)return;let r=n.getPendingActivatedDomains();if(r.length!==0){for(let i of r)if(!(t.enabledDomains.has(i)&&t.domainTtlEntries.has(i)))try{let{handleActivateDomain:e}=await import(`./MCPServer.search.handlers.domain-BbS-6LnX.mjs`).then(e=>e.t),r=n.getPendingDomainTtl(i);await e(t,{domain:i,...r?{ttlMinutes:r.ttlMinutes}:{}})}catch(t){e.warn(`Failed to restore activated domain "${i}":`,t)}}}export{i as n,a as r,r as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-sBC6IdRT.mjs";const t=[{domain:`adb-bridge`,depKey:`adbBridgeHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-DwL2ik8P.mjs`)},{domain:`core`,depKey:`coreAnalysisHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-DujQqEQR.mjs`)},{domain:`antidebug`,depKey:`antidebugHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-Zy7Odg5J.mjs`)},{domain:`apk-packer`,depKey:`apkPackerHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-ff1H7Pdp.mjs`)},{domain:`binary-instrument`,depKey:`binaryInstrumentHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-BDi4nbH1.mjs`)},{domain:`binary-secrets`,depKey:`binarySecretsHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-BuYKgCnp.mjs`)},{domain:`boringssl-inspector`,depKey:`boringsslInspectorHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-B3fZbSWR.mjs`)},{domain:`browser`,depKey:`browserHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-BcXbB4gf.mjs`)},{domain:`canvas`,depKey:`canvasHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-D3Ssf3IC.mjs`)},{domain:`coordination`,depKey:`coordinationHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-BLDfkE7n.mjs`)},{domain:`cross-domain`,depKey:`crossDomainHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-0Jpt_AQa.mjs`)},{domain:`dart-inspector`,depKey:`dartInspectorHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-CctIumog.mjs`)},{domain:`debugger`,depKey:`debuggerHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-CBfNnGPV.mjs`)},{domain:`encoding`,depKey:`encodingHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-CPS1Xv69.mjs`)},{domain:`evidence`,depKey:`evidenceHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-B7NB2rh2.mjs`)},{domain:`extension-registry`,depKey:`extensionRegistryHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-xWfu6iLo.mjs`)},{domain:`graphql`,depKey:`graphqlHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-nXHmtMSp2.mjs`)},{domain:`hooks`,depKey:`aiHookHandlers`,profiles:[`full`],secondaryDepKeys:[`hookPresetHandlers`],load:()=>import(`./manifest-D5ck3NvC.mjs`)},{domain:`instrumentation`,depKey:`instrumentationHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-Bdnc_vrc.mjs`)},{domain:`jadx-search`,depKey:`jadxSearchHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-ItF5P8A12.mjs`)},{domain:`macro`,depKey:`macroHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-DLMlD0Zc.mjs`)},{domain:`maintenance`,depKey:`coreMaintenanceHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[`extensionManagementHandlers`],load:()=>import(`./manifest-DG19q-Ld.mjs`)},{domain:`memory`,depKey:`memoryScanHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-ztWJoXy4.mjs`)},{domain:`mojo-ipc`,depKey:`mojoIpcHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-CQH9FhwI.mjs`)},{domain:`network`,depKey:`advancedHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-DCx6w2XV.mjs`)},{domain:`platform`,depKey:`platformHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-LLdI5m4T.mjs`)},{domain:`process`,depKey:`processHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-DYzWI8Xs.mjs`)},{domain:`protocol-analysis`,depKey:`protocolAnalysisHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-D9jUUJAu.mjs`)},{domain:`proxy`,depKey:`proxyHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-DYpn8w_h.mjs`)},{domain:`sandbox`,depKey:`sandboxHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-CRryuZF4.mjs`)},{domain:`shared-state-board`,depKey:`sharedStateBoardHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-yC16OhL2.mjs`)},{domain:`skia-capture`,depKey:`skiaCaptureHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-D-5GH0DV.mjs`)},{domain:`sourcemap`,depKey:`sourcemapHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-D_obs5F4.mjs`)},{domain:`streaming`,depKey:`streamingHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-KZphqIyX.mjs`)},{domain:`syscall-hook`,depKey:`syscallHookHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-QYbQXJn0.mjs`)},{domain:`trace`,depKey:`traceHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-LG42zPLY2.mjs`)},{domain:`transform`,depKey:`transformHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-CvTe5ZGV2.mjs`)},{domain:`v8-inspector`,depKey:`v8InspectorHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-RcpX_MyZ.mjs`)},{domain:`wasm`,depKey:`wasmHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-YgVd8Sgz.mjs`)},{domain:`workflow`,depKey:`workflowHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-iuhF6pTL2.mjs`)}],n={"adb-bridge":[`full`],core:[`workflow`,`full`],antidebug:[`full`],"apk-packer":[`full`],"binary-instrument":[`full`],"binary-secrets":[`full`],"boringssl-inspector":[`full`],browser:[`workflow`,`full`],canvas:[`full`],coordination:[`full`],"cross-domain":[`full`],"dart-inspector":[`full`],debugger:[`workflow`,`full`],encoding:[`workflow`,`full`],evidence:[`full`],"extension-registry":[`full`],graphql:[`workflow`,`full`],hooks:[`full`],instrumentation:[`full`],"jadx-search":[`full`],macro:[`full`],maintenance:[`workflow`,`full`],memory:[`full`],"mojo-ipc":[`full`],network:[`workflow`,`full`],platform:[`full`],process:[`full`],"protocol-analysis":[`full`],proxy:[`full`],sandbox:[`full`],"shared-state-board":[`workflow`,`full`],"skia-capture":[`full`],sourcemap:[`full`],streaming:[`workflow`,`full`],"syscall-hook":[`full`],trace:[`full`],transform:[`full`],"v8-inspector":[`workflow`,`full`],wasm:[`full`],workflow:[`workflow`,`full`]};function r(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.kind===`domain-manifest`&&t.version===1&&typeof t.domain==`string`&&typeof t.depKey==`string`&&Array.isArray(t.profiles)&&Array.isArray(t.registrations)&&typeof t.ensure==`function`}function i(e){if(!e||typeof e!=`object`)return null;let t=e;for(let e of[`default`,`manifest`,`domainManifest`]){let n=t[e];if(r(n))return n}return null}function a(e){let t=new Set;for(let[r,i]of Object.entries(n))i.includes(e)&&t.add(r);return t}function o(){return new Set(Object.keys(n))}function s(){return t}async function c(n){let r=[],a=new Set,o=new Set;for(let{domain:s,load:c}of t)if(!(n&&!n.has(s)))try{let t=i(await c());if(!t){e.warn(`[discovery] Skipping domain "${s}": no valid DomainManifest export`);continue}if(a.has(t.domain)){e.warn(`[discovery] Duplicate domain "`+t.domain+`" in generated manifests - skipping`);continue}if(o.has(t.depKey)){e.warn(`[discovery] Duplicate depKey "`+t.depKey+`" in generated manifests - skipping`);continue}a.add(t.domain),o.add(t.depKey),r.push(t),e.info(`[discovery] Loaded domain "`+t.domain+`" (`+String(t.registrations.length)+` tools)`)}catch(t){if(e.error(`[discovery] Failed to load domain "${s}"`,t),process.env.DISCOVERY_STRICT===`true`)throw t}let s=r.reduce((e,t)=>e+t.registrations.length,0);return n&&r.length===0?e.info(`[discovery] No manifests loaded for the requested startup profile. Domains remain available for lazy activation.`):e.info(`[discovery] Discovered `+String(r.length)+` domains, `+String(s)+` tools total`),r}async function l(n){let r=t.find(e=>e.domain===n);if(!r)return null;try{let t=i(await r.load());return t?(e.info(`[discovery] On-demand loaded domain "`+t.domain+`" (`+String(t.registrations.length)+` tools)`),t):(e.warn(`[discovery] Domain "${n}": no valid DomainManifest export`),null)}catch(t){return e.error(`[discovery] Failed to load domain "${n}"`,t),null}}function u(e,t){let n=new Set(t);return e.every(e=>n.has(e))}let d=null,f=null,p=null,m=null,h=null,g=null;async function _(t){if(d===null){if(p){await p;return}p=(async()=>{let n=await c(t?a(t):void 0);d=n,g=new Map;for(let t of n)for(let n of t.registrations){let r=n.domain?n:{...n,domain:t.domain},i=g.get(r.tool.name);i?e.warn(`[registry] Duplicate tool name "${r.tool.name}": domain "${r.domain}" conflicts with "${i.domain}" — keeping first`):g.set(r.tool.name,r)}f=[...g.values()],m=new Set(d.map(e=>e.domain)),h=new Set(f.map(e=>e.tool.name))})(),await p}}async function v(e){await _(e)}async function y(e){if(!d)throw Error(`[registry] Not initialised - call initRegistry() first.`);if(d.some(t=>t.domain===e))return d.find(t=>t.domain===e);let t=await l(e);if(!t)return null;d.push(t),m.add(t.domain);for(let e of t.registrations){let n=e.domain?e:{...e,domain:t.domain};g.has(n.tool.name)||g.set(n.tool.name,n)}f=[...g.values()],L();for(let e of t.registrations)h.add(e.tool.name);return t}async function b(){if(!d)throw Error(`[registry] Not initialised - call initRegistry() first.`);let t=o(),n=new Set(d.map(e=>e.domain)),r=[...t].filter(e=>!n.has(e));r.length!==0&&(e.info(`[registry] Loading ${r.length} remaining domains for full discovery`),await Promise.all(r.map(e=>y(e))))}function x(){if(!d)throw Error(`[registry] Not initialised - call initRegistry() first.`);return d}function S(){if(!f)throw Error(`[registry] Not initialised - call initRegistry() first.`);return f}function C(){return x()}function w(){return S()}function T(){if(!m)throw Error(`[registry] Not initialised - call initRegistry() first.`);return m}function E(){return o()}function D(){let e={};for(let t of S())(e[t.domain]??=[]).push(t.tool);return e}function O(){let e=new Map;for(let t of S())e.has(t.tool.name)||e.set(t.tool.name,t.domain);return e}function k(){return S().map(e=>e.tool)}function A(e,t){let n=t?S().filter(e=>t.has(e.tool.name)):[...S()],r=[];for(let t of n)try{r.push([t.tool.name,t.bind(e)])}catch{}return Object.fromEntries(r)}function j(){let t={search:new Set,workflow:new Set,full:new Set};for(let[e,r]of Object.entries(n))for(let n of r)t[n]?.add(e);let r={};for(let[e,n]of Object.entries(t))r[e]=[...n];return u(r.search,r.workflow)||e.warn(`[registry] Profile hierarchy: search not subset of workflow`),u(r.workflow,r.full)||e.warn(`[registry] Profile hierarchy: workflow not subset of full`),r}let M=null,N=null,P=null,F=null;function I(){return M||=D(),M}function L(){M=null}function R(){return N||=O(),N}function z(){return P||=j(),P}const B=new Proxy([],{get(e,t){F||=k();let n=F,r=n[t];return typeof r==`function`?r.bind(n):r}});function V(e){let t=new Map;for(let n of e)t.set(n.name,n);return Array.from(t.values())}function H(e){if(!e?.trim())return null;let t=T(),n=e.split(`,`).map(e=>e.trim().toLowerCase()).filter(Boolean).filter(e=>t.has(e));return n.length>0?Array.from(new Set(n)):null}function U(e){return V(e.flatMap(e=>I()[e]??[]))}function W(e){let t=z()[e];if(!t)return[];let n=new Set(t);return V([...w()].filter(t=>!(!n.has(t.domain)||t.profiles&&!t.profiles.includes(e))).map(e=>e.tool))}function G(e){return R().get(e)??null}function K(e){return z()[e]??[]}export{W as a,b as c,E as d,C as f,s as h,U as i,y as l,v as m,K as n,H as o,w as p,G as r,A as s,B as t,T as u};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{Fn as e,In as t,Ln as n,Mn as r,Nn as i,Pn as a,Rn as o,jn as s,zn as c}from"./constants-BYj8Xek8.mjs";import{f as l,r as u,t as d}from"./ToolCatalog-CYdD9F5f.mjs";const f=/(browser|page|navigate|click|type|screenshot|scrape|network|request|response|api|traffic|hook|capture|intercept|monitor|浏览器|页面|导航|点击|输入|截图|爬取|网络|请求|响应|接口|流量|抓包|拦截|监控)/i,p=/(token budget|cache|artifact|extension|plugin|reload|doctor|cleanup|memory|profile|tool list|令牌预算|缓存|工件|扩展|插件|重载|环境诊断|清理|内存|配置)/i,m=/(stateless|deterministic|pure compute|offline|decode|encode|hex|base64|protobuf|msgpack|checksum|hash|payload|frame|packet|bytes?|bytecode|pcap|protocol|state machine|field inference|ast transform|crypto harness|无状态|确定性|纯算|离线|解码|编码|十六进制|校验和|载荷|字节|协议|报文|帧|字段推断|状态机|构包)/i;let h=null;const g=new Map;function _(){if(h)return h;let e=[];for(let t of l())t.workflowRule&&e.push({patterns:[...t.workflowRule.patterns],domain:t.domain,priority:t.workflowRule.priority,tools:[...t.workflowRule.tools],hint:t.workflowRule.hint});return h=[...e].toSorted((e,t)=>t.priority-e.priority),g.clear(),h}function v(e){let t=g.get(e);if(t!==void 0)return t;let n=[];for(let t of _())for(let r of t.patterns)if(r.test(e)){n.push(t);break}let r=n.length===0?null:n.toSorted((e,t)=>t.priority-e.priority)[0];if(g.size>=64){let e=g.keys().next().value;e!==void 0&&g.delete(e)}return g.set(e,r),r}function y(e,t){let n=null;for(let[r,i]of t.extensionWorkflowRuntimeById.entries()){let a=i.route??i.workflow.route;if(!a)continue;let o=t.extensionWorkflowsById.get(r),s=o?.displayName??i.workflow.displayName,c=o?.description??i.workflow.description??`Workflow route`;for(let t of a.triggerPatterns){if(!t.test(e))continue;let i=a.priority/100;(!n||i>n.confidence)&&(n={workflow:{id:r,name:s,description:c,route:a},confidence:i,matchedPattern:t.source});break}}return n}function b(e,t){return t?.domain!==`browser`&&t?.domain!==`network`&&S(e)?!1:t?.domain===`browser`||t?.domain===`network`||f.test(e)}function x(e){return p.test(e)}function S(e){return m.test(e)}function C(e,t){if(e.length<2)return null;let n=l();if(n.length===0)return null;let r=new Map,i=new Map;for(let e of n)if(e.toolDependencies)for(let a of e.toolDependencies){let e=new Set(T(a,n)),o=w(a.from,n),s=w(a.to,n);if(o&&s&&o!==s){let e=r.get(o)??new Set;e.add(s),r.set(o,e);let n=i.get(o)??new Set;n.add(a.from),t.has(a.to)&&n.add(a.to),i.set(o,n)}for(let t of e)if(t!==o&&o){let e=r.get(o)??new Set;e.add(t),r.set(o,e)}}let a=new Set;for(let t of e)t.domain&&a.add(t.domain);if(a.size<2)return null;let o=[...a];for(let e=0;e<o.length;e++)for(let i=e+1;i<o.length;i++){let a=o[e],s=o[i];if(!(r.get(a)?.has(s)||r.get(s)?.has(a)))continue;let c=new Set;for(let e of n)if(e.toolDependencies)for(let r of e.toolDependencies){let e=w(r.from,n),i=w(r.to,n);(e===a&&i===s||e===s&&i===a)&&(t.has(r.from)&&c.add(r.from),t.has(r.to)&&c.add(r.to))}let l=[...c];if(!(l.length<2))return{id:`dynamic-${a}-${s}`,hint:`${a} ↔ ${s} (declared dependency)`,domains:[a,s],tools:l.slice(0,5),priority:75}}return null}function w(e,t){for(let n of t)for(let t of n.registrations)if(t.tool.name===e)return t.domain??n.domain;return null}function T(e,t){return[w(e.from,t),w(e.to,t)].filter(e=>e!==null)}function E(e){let t=e.trim();if(!t.startsWith(`mcp__`))return t;let n=t.split(`__`);return n.length<3?t:n.slice(2).join(`__`)}function D(e){let t=e.names;if(typeof t==`string`&&t.trim().startsWith(`[`))try{let e=JSON.parse(t);Array.isArray(e)&&(t=e)}catch{}if(!Array.isArray(t))return{names:[],error:`names must be an array`};let n=[];for(let e of t){if(typeof e!=`string`||e.trim().length===0)return{names:[],error:`invalid tool name: expected non-empty string`};n.push(E(e))}return{names:n}}let O=null;function k(){return O||=new Map(d.map(e=>[e.name,e])),O}function A(e,t){let n=E(e),r=k().get(n);if(r)return r.inputSchema;let i=t.extensionToolsByName.get(n);if(i)return i.tool.inputSchema;let a=t.metaToolsByName.get(n);if(a)return a.inputSchema}function j(e,t){let n=E(e),r=k().get(n);if(r?.description)return r.description.split(`
|
|
2
|
-
`)[0]||`No description available`;let i=t.extensionToolsByName.get(n);if(i?.tool?.description)return i.tool.description.split(`
|
|
3
|
-
`)[0]||`No description available`;let a=t.metaToolsByName.get(n);return a?.description&&a.description.split(`
|
|
4
|
-
`)[0]||`No description available`}function M(e,t){let n=E(e);return new Set([...t.selectedTools.map(e=>e.name),...t.activatedToolNames]).has(n)}function N(e){return new Set([...d.map(e=>e.name),...e.extensionToolsByName.keys()])}function P(e,t){return u(e)??t.extensionToolsByName.get(e)?.domain??null}async function F(e){if(!e.pageController||typeof e.pageController.getPage!=`function`)return!1;try{return!!await e.pageController.getPage()}catch{return!1}}function I(e){if(!e.consoleMonitor)return!1;try{if(typeof e.consoleMonitor.getNetworkStatus==`function`)return!!e.consoleMonitor.getNetworkStatus().enabled;if(typeof e.consoleMonitor.isNetworkEnabled==`function`)return!!e.consoleMonitor.isNetworkEnabled()}catch{}return!1}function L(e){if(!e.consoleMonitor||typeof e.consoleMonitor.getNetworkRequests!=`function`)return 0;try{let t=e.consoleMonitor.getNetworkRequests({limit:1});return Array.isArray(t)?t.length:0}catch{try{let t=e.consoleMonitor.getNetworkRequests();return Array.isArray(t)?t.length:0}catch{return 0}}}async function R(e){return{hasActivePage:await F(e),networkEnabled:I(e),capturedRequestCount:L(e)}}function z(e,t){if(!S(e))return[];let n=[],r=(e,r)=>{t.has(e)&&!n.some(t=>t.name===e)&&n.push({name:e,description:r})};return r(`binary_detect_format`,`Detect the payload encoding or container before decoding`),r(`binary_decode`,`Decode the payload into deterministic offline bytes or structured output`),r(`proto_auto_detect`,`Infer a likely protocol layout from repeated payload samples`),r(`proto_infer_fields`,`Derive stable field boundaries and candidate semantics`),r(`proto_infer_state_machine`,`Infer request/response state transitions from repeated samples`),r(`crypto_test_harness`,`Validate extracted signing or crypto logic with deterministic test vectors`),r(`crypto_compare`,`Compare competing crypto implementations against the same vectors`),r(`network_get_requests`,`Collect request or response samples only if payload bytes still need to be extracted`),n}function B(e){return e.includes(`Browser must be launched`)?e=>e.hasActivePage:e.includes(`Network monitoring must be enabled`)?e=>e.networkEnabled:e.includes(`Debugger must be enabled`)||e.includes(`Debugger must be attached`)||e.includes(`Page must be navigated`)||e.includes(`WebSocket monitoring`)?e=>e.hasActivePage:()=>!1}let V=null;function H(){if(V)return V;let e={};for(let t of l())if(t.prerequisites)for(let[n,r]of Object.entries(t.prerequisites))e[n]=r.map(e=>({condition:e.condition,check:B(e.condition),fix:e.fix}));return V=e,V}function U(e,t,n){let r=[],i=e=>{n.has(e)&&!r.includes(e)&&r.push(e)};(e.domain===`browser`||e.domain===`network`)&&!t.hasActivePage&&(i(`browser_launch`),i(`browser_attach`)),e.domain===`network`&&(t.hasActivePage&&!t.networkEnabled&&i(`network_monitor`),t.hasActivePage&&t.networkEnabled&&t.capturedRequestCount>0&&i(`network_get_requests`));for(let t of e.tools)i(t);return e.domain===`network`&&t.hasActivePage&&t.networkEnabled&&i(`network_get_requests`),r}function W(e,t,n){let r=[],i=new Set,a=e.workflow.route.requiredDomains.includes(`browser`)||e.workflow.route.requiredDomains.includes(`network`),o=(e,t)=>{!n.has(e)||i.has(e)||(i.add(e),r.push({name:e,description:t}))};!t.hasActivePage&&a&&(o(`browser_launch`,`Launch a browser session before executing the preset`),o(`browser_attach`,`Attach preset tooling to the active browser session before capture begins`));for(let t of e.workflow.route.steps)o(t.toolName,t.description);return r}function G(e,t,n,r){return W(e,t,r).map((t,r)=>({name:t.name,domain:P(t.name,n),shortDescription:t.description,score:e.workflow.route.priority+e.confidence-r*.01,isActive:M(t.name,n)}))}function K(e,t,n){return z(e,n).map((e,n)=>({name:e.name,domain:P(e.name,t),shortDescription:e.description,score:90-n*.01,isActive:M(e.name,t)}))}function q(e,t){return{name:`run_extension_workflow`,domain:P(`run_extension_workflow`,t),shortDescription:`Execute routed workflow ${e.workflow.name} (${e.workflow.id}) via run_extension_workflow`,score:e.workflow.route.priority+e.confidence,isActive:M(`run_extension_workflow`,t)}}function J(e,t){return{kind:e.workflow.route.kind,id:e.workflow.id,name:e.workflow.name,description:e.workflow.description,confidence:e.confidence,matchedPattern:e.matchedPattern,requiredDomains:[...e.workflow.route.requiredDomains],steps:e.workflow.route.steps.map(e=>({id:e.id,toolName:e.toolName,domain:u(e.toolName)??t.extensionToolsByName.get(e.toolName)?.domain??null,description:e.description,prerequisites:[...e.prerequisites],parallel:e.parallel,isActive:M(e.toolName,t)}))}}function Y(l,u,d,f){let p=b(u,d),m=x(u),h=S(u),g=l.map(l=>{let u=l.score;return p&&!m&&l.domain===`maintenance`&&(u*=i),h&&((l.domain===`browser`||l.domain===`network`||l.domain===`debugger`||l.domain===`hooks`||l.domain===`maintenance`)&&(u*=o),(l.domain===`core`||l.domain===`streaming`||l.domain===`workflow`)&&(u*=n),(l.domain===`encoding`||l.domain===`transform`||l.domain===`protocol-analysis`||l.domain===`sourcemap`||l.domain===`core`)&&(u*=t),(l.name===`binary_detect_format`||l.name===`binary_decode`||l.name===`crypto_test_harness`||l.name===`ast_transform_apply`||l.name===`proto_auto_detect`||l.name===`proto_infer_fields`||l.name===`proto_infer_state_machine`||l.name===`proto_fingerprint`)&&(u*=c)),p&&(!f.hasActivePage&&l.name===`browser_launch`&&(u*=r),!f.hasActivePage&&l.name===`browser_attach`&&(u*=s),f.hasActivePage&&!f.networkEnabled&&l.name===`network_monitor`&&(u*=e),f.hasActivePage&&f.networkEnabled&&f.capturedRequestCount>0&&l.name===`network_get_requests`&&(u*=a)),{...l,score:u}});return g.sort((e,t)=>t.score-e.score),g}export{v as _,U as a,S as b,N as c,P as d,A as f,C as g,D as h,q as i,R as l,E as m,J as n,H as o,M as p,K as r,Y as s,G as t,j as u,b as v,y as x,x as y};
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./chunk-C_pMuVsO.mjs";var t=e({VersionDetector:()=>o});function n(e){return typeof e==`object`&&!!e}function r(e){return n(e)&&typeof e.createCDPSession==`function`}function i(e,t){let n=e[t];return typeof n==`string`?n:null}function a(e){if(typeof e==`boolean`)return e;if(n(e)){let t=e.value;return typeof t==`boolean`?t:!1}return!1}var o=class{getPage;constructor(e){this.getPage=e}async detectV8Version(){return await this.detectBrowserVersion()||(typeof process.versions.v8==`string`&&process.versions.v8.length>0?this.parseV8Version(process.versions.v8):null)}parseV8Version(e){let t=/(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)(?:\.(?<commit>[A-Za-z0-9._-]+))?/u.exec(e.trim());if(!t?.groups)return{major:0,minor:0,patch:0,commit:``};let n=Number(t.groups.major??0),r=Number(t.groups.minor??0),i=Number(t.groups.patch??0);return{major:Number.isFinite(n)?n:0,minor:Number.isFinite(r)?r:0,patch:Number.isFinite(i)?i:0,commit:t.groups.commit??``}}async supportsNativesSyntax(){if(process.execArgv.includes(`--allow-natives-syntax`))return!0;let e=await this.createSession();if(!e)return!1;try{let t=await e.send(`Runtime.evaluate`,{expression:`
|
|
2
|
-
(() => {
|
|
3
|
-
try {
|
|
4
|
-
return Boolean(new Function("return %HaveSameMap({}, {})")());
|
|
5
|
-
} catch (error) {
|
|
6
|
-
return false;
|
|
7
|
-
}
|
|
8
|
-
})()
|
|
9
|
-
`,returnByValue:!0,awaitPromise:!1});return n(t)?a(t.result):!1}catch{return!1}finally{await e.detach().catch(()=>void 0)}}async detectBrowserVersion(){let e=await this.createSession();if(!e)return null;try{let t=await e.send(`Browser.getVersion`);if(!n(t))return null;let r=i(t,`jsVersion`);if(r)return this.parseV8Version(r);let a=i(t,`product`);return a?this.parseV8Version(a):null}catch{return null}finally{await e.detach().catch(()=>void 0)}}async createSession(){if(!this.getPage)return null;try{let e=await this.getPage();return r(e)?await e.createCDPSession():null}catch{return null}}};export{t as n,o as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./ToolError-DWU_z7gp.mjs";import{a as t,n}from"./parse-args-Bw413PlW.mjs";import{n as r}from"./ResponseBuilder-BfWP-uaT.mjs";import"./definitions-Tls8c0A0.mjs";import{createHash as i}from"node:crypto";import{basename as a,join as o}from"node:path";import{open as s,readdir as c,stat as l}from"node:fs/promises";import{open as u}from"yauzl";const d=Object.freeze([]),f=(e,t)=>{let n=process.env[e];if(n===void 0||n===``)return t;let r=parseInt(n,10);return Number.isFinite(r)?r:t},p=f(`APK_PACKER_MAX_APK_BYTES`,512*1024*1024),m=f(`APK_PACKER_MAX_ZIP_ENTRIES`,2e5),h=f(`APK_PACKER_MAX_REGEX_PATTERN_LENGTH`,256),g=f(`APK_PACKER_REGEX_TIMEOUT_MS`,50),_=f(`APK_SIGBLOCK_EOCD_SCAN_BYTES`,65536),v=f(`APK_SIGBLOCK_MAX_BYTES`,1024*1024),y=f(`APK_SIGBLOCK_DEX_PREFIX_HEAD_BYTES`,4),b=Object.freeze([/\([^()]*[+*][^()]*\)[+*]/,/\([^()]*\|[^()]*\)[+*][^()]*[+*]/]);function x(t,n){return new e(`VALIDATION`,t,{details:n})}function S(e){return/[\^$*+?()[\]{}|]/.test(e)}function C(e){if(!e.name||e.name.length===0)throw x(`customSignature.name must be a non-empty string`);if(e.category!==void 0&&typeof e.category!=`string`)throw x(`customSignature.category, when present, must be a string`,{name:e.name});if(!Array.isArray(e.libPatterns)||e.libPatterns.length===0)throw x(`customSignature.libPatterns must be a non-empty array`,{name:e.name});let t=[];for(let n=0;n<e.libPatterns.length;n++){let r=e.libPatterns[n];if(typeof r!=`string`||r.length===0)throw x(`customSignature.libPatterns[${n}] must be a non-empty string`,{name:e.name});if(r.length>h)throw x(`customSignature.libPatterns[${n}] exceeds APK_PACKER_MAX_REGEX_PATTERN_LENGTH (${h})`,{name:e.name,length:r.length});S(r)?(w(r,e.name),t.push(T(r,`i`,e.name))):t.push(r.toLowerCase())}return{name:e.name,libPatterns:t,...e.category?{category:e.category}:{},...e.confidence?{confidence:e.confidence}:{},...e.notes?{notes:e.notes}:{}}}function w(e,t){for(let n of b)if(n.test(e))throw x(`customSignature pattern rejected as potentially catastrophic (ReDoS heuristic match)`,{name:t,pattern:e})}function T(t,n,r){try{return new RegExp(t,n)}catch(i){throw new e(`VALIDATION`,`customSignature regex failed to compile: ${i.message}`,{details:{name:r,pattern:t,flags:n},cause:i})}}function E(e,t,n){return n===`replace`?Object.freeze([...t??[]]):!t||t.length===0?Object.freeze([...e]):Object.freeze(n===`prepend`?[...t,...e]:[...e,...t])}function D(t,n,r=g,i){let a=performance.now(),o=t.test(n),s=performance.now()-a;if(s>r)throw new e(`TIMEOUT`,`Regex match exceeded APK_PACKER_REGEX_TIMEOUT_MS (${r} ms): ${s.toFixed(2)} ms`,{details:{signatureName:i,pattern:t.source,flags:t.flags,elapsedMs:s,timeoutMs:r}});return o}const O=/^lib\/[^/]+\/(lib[^/]+\.so)$/i;var k=class{defaults;constructor(e=d){this.defaults=e}async detectFromApk(t,n={}){if(!t||t.length===0)throw new e(`VALIDATION`,`apkPath must be a non-empty string`);let r;try{r=await l(t)}catch(n){throw new e(`NOT_FOUND`,`APK not found: ${t}`,{details:{apkPath:t},cause:n})}if(!r.isFile())throw new e(`VALIDATION`,`APK path is not a regular file: ${t}`,{details:{apkPath:t}});if(r.size>p)throw new e(`VALIDATION`,`APK exceeds APK_PACKER_MAX_APK_BYTES (${p} bytes): ${r.size}`,{details:{apkPath:t,size:r.size,max:p}});let i=await M(t);return this.matchBasenames(i,n)}async detectFromDir(t,n={}){if(!t||t.length===0)throw new e(`VALIDATION`,`dirPath must be a non-empty string`);let r;try{r=await l(t)}catch(n){throw new e(`NOT_FOUND`,`Directory not found: ${t}`,{details:{dirPath:t},cause:n})}if(!r.isDirectory())throw new e(`VALIDATION`,`Path is not a directory: ${t}`,{details:{dirPath:t}});let i=await N(t);return this.matchBasenames(i,n)}matchBasenames(e,t={}){let n=E(this.defaults,t.customSignatures,t.ruleMode??`append`),r=[];for(let t of n){let n=new Set;for(let r of e)A(r,t)&&n.add(r.path);if(n.size===0)continue;let i=t.confidence??`medium`,a=n.size>=2?`high`:i;r.push({name:t.name,...t.category?{category:t.category}:{},matchedLibs:[...n].toSorted(),confidence:a})}let i=r.length;return{packers:r,confidence:j(r),layerCount:i}}};function A(e,t){for(let n of t.libPatterns)if(typeof n==`string`){if(e.basename===n)return!0}else if(D(n,e.basename,g,t.name))return!0;return!1}function j(e){if(e.length===0)return 0;let t=.5;return e.some(e=>e.confidence===`high`)&&(t+=.25),e.length>=2&&(t+=.25),Math.min(t,1)}async function M(t){return new Promise((n,r)=>{u(t,{lazyEntries:!0,autoClose:!0},(i,a)=>{if(i||!a){r(new e(`VALIDATION`,`Failed to open APK as ZIP: ${i?.message??`unknown`}`,{details:{apkPath:t},cause:i??void 0}));return}let o=[],s=0,c=a,l=n=>{if(s+=1,s>m){c.close(),r(new e(`VALIDATION`,`APK has too many ZIP entries (> ${m})`,{details:{apkPath:t}}));return}let i=n.fileName,a=O.exec(i);if(a){let e=a[1].toLowerCase();o.push({path:i.toLowerCase(),basename:e})}c.readEntry()},u=()=>{f(),n(o)},d=n=>{f(),c.close(),r(new e(`RUNTIME`,`ZIP read failed: ${n.message}`,{details:{apkPath:t},cause:n}))};function f(){c.removeListener(`entry`,l),c.removeListener(`end`,u),c.removeListener(`error`,d)}c.on(`entry`,l),c.on(`end`,u),c.on(`error`,d),c.readEntry()})})}async function N(e){let t=o(e,`lib`),n;try{n=await c(t)}catch{return[]}let r=[];for(let e of n){let n=o(t,e),i;try{if(!(await l(n)).isDirectory())continue;i=await c(n)}catch{continue}for(let t of i){if(!t.toLowerCase().endsWith(`.so`))continue;let n=`lib/${e}/${t}`.toLowerCase();r.push({path:n,basename:a(t).toLowerCase()})}}return r}const P=`APK Sig Block 42`,F=Buffer.from(P,`utf8`);var I=class{async parse(t){if(!t||typeof t!=`string`)throw new e(`VALIDATION`,`apkPath must be a non-empty string`);let n;try{n=await l(t)}catch(n){throw new e(`NOT_FOUND`,`APK not found: ${t}`,{details:{apkPath:t},cause:n})}if(!n.isFile())throw new e(`VALIDATION`,`Path is not a regular file: ${t}`,{details:{apkPath:t}});if(n.size>p)throw new e(`VALIDATION`,`APK exceeds APK_PACKER_MAX_APK_BYTES (${p} bytes): ${n.size}`,{details:{apkPath:t,size:n.size,max:p}});let r;try{return r=await s(t,`r`),await this.parseHandle(r,t,n.size)}finally{r&&await r.close()}}async parseHandle(e,t,n){let r={schemes:{},unknownBlocks:[],warnings:[],anomalies:[]},i=Math.min(_,n),a=Buffer.alloc(i);await e.read(a,0,i,n-i);let o=R(a);if(o<0)return r.anomalies.push({kind:`eocd-not-found`,evidence:`Scanned trailing ${i} bytes — no EOCD signature 0x06054b50`}),L(t,n,r,!1);let s=a.readUInt32LE(o+16);if(s>=n-i+o||s<24)return r.warnings.push(`Implausible centralDirOffset ${s} given file size ${n}`),L(t,n,r,!1);let c=Buffer.alloc(24);if(await e.read(c,0,24,s-24),!c.subarray(8).equals(F)){let i=Math.min(s,_),a=Buffer.alloc(i);await e.read(a,0,i,s-i);let o=a.indexOf(F);if(o<0)return L(t,n,r,!1);let c=i-(o+F.length);return r.anomalies.push({kind:`magic-offset`,evidence:`APK Sig Block 42 magic located ${c} bytes before expected position`}),L(t,n,r,!1)}let l;try{l=J(c,0)}catch(e){return r.warnings.push(`Signing block size field unreadable: ${e.message}`),L(t,n,r,!1)}if(l<=0||l>v)return r.warnings.push(`Signing block size ${l} outside [1, ${v}] — refusing to read`),L(t,n,r,!1);let u=s-l-8;if(u<0)return r.warnings.push(`Computed signing block start offset is negative — refusing to read`),L(t,n,r,!1);let d=l+8;if(d>v)return r.warnings.push(`Signing block total length ${d} exceeds APK_SIGBLOCK_MAX_BYTES — refusing to read`),L(t,n,r,!1);let f=Buffer.alloc(Number(d));if(await e.read(f,0,Number(d),u),z(f,r),n>=4){let t=Math.min(y,n),i=Buffer.alloc(t);await e.read(i,0,t,0),i.length>=4&&i.readUInt32BE(0)===1684371466&&r.anomalies.push({kind:`dex-prefix-anomaly`,evidence:`DEX magic (0x6465780a) at file head with a valid Signing Block — possible dex-prefix injection pattern`})}return L(t,n,r,!0,{magic:P,size:Number(d),offset:u})}};function L(e,t,n,r,i){return{apkPath:e,fileSize:t,signingBlock:r&&i?{found:!0,magic:i.magic,size:i.size,offset:i.offset}:{found:!1},schemes:n.schemes,unknownBlocks:n.unknownBlocks,warnings:n.warnings,anomalies:n.anomalies}}function R(e){if(e.length<22)return-1;for(let t=e.length-22;t>=0;t--)if(e.readUInt32LE(t)===101010256){let n=e.readUInt16LE(t+20);if(t+22+n===e.length)return t}return-1}function z(e,t){let n=e.length-24,r=8;for(;r+12<=n;){let i=J(e,r);if(i<4||r+8+i>n){t.warnings.push(`Truncated ID-value pair at offset ${r} (pairSize ${i})`);return}let a=e.readUInt32LE(r+8),o=r+12,s=r+8+i;B(a,e.subarray(o,s),t),r=s}}function B(e,t,n){switch(e){case 1896449818:{let e=V(t,!1,n);n.schemes.v2?(n.anomalies.push({kind:`duplicate-scheme`,evidence:`v2 signers block (0x7109871a) appears more than once`}),n.schemes.v2.signers.push(...e)):n.schemes.v2={signers:e};return}case 4031998144:{let e=V(t,!0,n),r=U(e);n.schemes.v3=r?{signers:e,keyRotation:r}:{signers:e};return}case 462663009:{let e=V(t,!0,n);n.schemes.v3_1={signers:e};return}case 1114793335:{let e=W(t);e&&(n.schemes.v4=e);return}case 1347109971:return;case 1111638594:n.unknownBlocks.push({id:q(e),size:t.length}),n.anomalies.push({kind:`extra-block-anomaly`,evidence:`Block ID 0x42424242 present (size=${t.length}) — non-standard residue marker`}),n.warnings.push(`Unknown block 0x42424242 detected — non-standard block ID observed in some legacy tooling. Manual review recommended.`);return;default:n.unknownBlocks.push({id:q(e),size:t.length}),n.anomalies.push({kind:`extra-block`,evidence:`Unknown block id ${q(e)} size=${t.length}`});return}}function V(e,t,n){let r=new Y(e,`signers`),i=r.readU32();if(i===0)return[];let a=r.readSlice(i,`signersBuf`),o=[],s=new Y(a,`signers-inner`);for(;s.remaining()>0;){let e=s.readU32(),r=s.readSlice(e,`signer`);try{o.push(H(r,t))}catch(e){n.warnings.push(`Skipped malformed signer: ${e.message}`)}}return o}function H(e,t){let n=new Y(e,`signer`),r=n.readU32(),i=n.readSlice(r,`signedData`),a=0,o=0;t&&(a=n.readU32(),o=n.readU32());let s=n.readU32(),c=n.readSlice(s,`signatures`),l=[],u=new Y(c,`signatures-inner`);for(;u.remaining()>0;){let e=u.readU32(),t=u.readSlice(e,`signature`);if(t.length<4)continue;let n=t.readUInt32LE(0);l.push({algorithm:K(n),algorithmId:n})}let d=new Y(i,`signedData`),f=d.readU32(),p=d.readSlice(f,`digests`),m=[],h=new Y(p,`digests-inner`);for(;h.remaining()>0;){let e=h.readU32(),t=h.readSlice(e,`digest`);if(t.length<4)continue;let n=t.readUInt32LE(0);m.push({algorithm:K(n),algorithmId:n})}let g=d.readU32(),_=d.readSlice(g,`certificates`),v=[],y=new Y(_,`certs-inner`);for(;y.remaining()>0;){let e=y.readU32(),t=y.readSlice(e,`certificate`);v.push(G(t))}let b=d.readU32(),x=d.readSlice(b,`attributes`),S=[],C=new Y(x,`attrs-inner`);for(;C.remaining()>0;){let e=C.readU32(),t=C.readSlice(e,`attribute`);if(t.length<4)continue;let n=t.readUInt32LE(0);S.push({id:q(n),size:t.length})}let w={digests:m,signatures:l,certificates:v,additionalAttributes:S};return t?{...w,minSdkVersion:a,maxSdkVersion:o}:w}function U(e){for(let t of e)for(let e of t.additionalAttributes)if(e.id===q(1000370060))return{levels:[]}}function W(e){try{let t=new Y(e,`v4`),n=t.readU32(),r=t.readU32(),i=t.readSlice(r,`v4-hash`),a=0;return t.remaining()>=8?a=J(e,t.position()):t.remaining()>=4&&(a=t.readU32()),{algorithm:K(n),rootHash:i.toString(`hex`),treeSize:a}}catch{return}}function G(e){let t=i(`sha256`).update(e).digest(`hex`),n=e.subarray(0,Math.min(32,e.length)).toString(`hex`);return{sha256Fingerprint:t,derLength:e.length,derPreview:n}}function K(e){switch(e){case 257:return`RSA_PSS_SHA256`;case 258:return`RSA_PSS_SHA512`;case 259:return`RSA_PKCS1_V1_5_SHA256`;case 260:return`RSA_PKCS1_V1_5_SHA512`;case 513:return`ECDSA_SHA256`;case 514:return`ECDSA_SHA512`;case 769:return`DSA_SHA256`;case 1057:return`VERITY_RSA_PKCS1_V1_5_SHA256`;case 1059:return`VERITY_ECDSA_SHA256`;case 1061:return`VERITY_DSA_SHA256`;default:return`UNKNOWN`}}function q(e){return`0x${(e>>>0).toString(16).padStart(8,`0`)}`}function J(t,n){let r=t.readUInt32LE(n),i=t.readUInt32LE(n+4);if(i>2097151)throw new e(`VALIDATION`,`u64 length exceeds Number.MAX_SAFE_INTEGER at offset ${n}`);return i*4294967296+r}var Y=class{buf;label;cursor=0;constructor(e,t){this.buf=e,this.label=t}position(){return this.cursor}remaining(){return this.buf.length-this.cursor}readU32(){if(this.remaining()<4)throw new e(`VALIDATION`,`Underflow reading u32 in ${this.label}`);let t=this.buf.readUInt32LE(this.cursor);return this.cursor+=4,t}readSlice(t,n){if(t<0||t>this.remaining())throw new e(`VALIDATION`,`Underflow reading slice "${n}" (need ${t}, have ${this.remaining()}) in ${this.label}`);let r=this.buf.subarray(this.cursor,this.cursor+t);return this.cursor+=t,r}};const X=new Set([`append`,`prepend`,`replace`]),Z=new Set([`high`,`medium`,`low`]);function Q(t){if(t!=null){if(!Array.isArray(t))throw new e(`VALIDATION`,`customSignatures must be an array of signature objects`);return t.map((t,n)=>{if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`VALIDATION`,`customSignatures[${n}] must be an object`);let{name:r,category:i,libPatterns:a,confidence:o,notes:s}=t;if(typeof r!=`string`)throw new e(`VALIDATION`,`customSignatures[${n}].name must be a string`);if(i!==void 0&&typeof i!=`string`)throw new e(`VALIDATION`,`customSignatures[${n}].category, when present, must be a string`);if(!Array.isArray(a))throw new e(`VALIDATION`,`customSignatures[${n}].libPatterns must be a string array`);for(let t=0;t<a.length;t++)if(typeof a[t]!=`string`)throw new e(`VALIDATION`,`customSignatures[${n}].libPatterns[${t}] must be a string`);let c={name:r,libPatterns:a};if(typeof i==`string`&&(c.category=i),typeof o==`string`){if(!Z.has(o))throw new e(`VALIDATION`,`customSignatures[${n}].confidence must be one of: high, medium, low`);c.confidence=o}return typeof s==`string`&&(c.notes=s),C(c)})}}function $(e){return{name:e.name,...e.category?{category:e.category}:{},libPatterns:e.libPatterns.map(e=>typeof e==`string`?{type:`literal`,value:e}:{type:`regex`,value:e.source}),...e.category?{category:e.category}:{},...e.confidence?{confidence:e.confidence}:{},...e.notes?{notes:e.notes}:{}}}var ee=class{detector;signingBlockParser;constructor(e=new k,t=new I){this.detector=e,this.signingBlockParser=t}handleApkPackerDetect(i){return r(async()=>{let r=t(i,`apkPath`),a=t(i,`dirPath`);if(!r&&!a)throw new e(`VALIDATION`,`Either apkPath or dirPath must be provided`);if(r&&a)throw new e(`VALIDATION`,`Provide only one of apkPath or dirPath, not both`);let o=Q(i.customSignatures),s=n(i,`ruleMode`,X),c={...o===void 0?{}:{customSignatures:o},...s===void 0?{}:{ruleMode:s}},l=r?await this.detector.detectFromApk(r,c):await this.detector.detectFromDir(a,c);return{packers:l.packers,confidence:l.confidence,layerCount:l.layerCount}})}handleApkPackerListSignatures(e){return r(async()=>{let n=t(e,`category`);return{signatures:(n?d.filter(e=>(e.category??``).toLowerCase().includes(n.toLowerCase())):d).map($)}})}handleApkSigningBlockParse(n){return r(async()=>{let r=t(n,`apkPath`);if(!r)throw new e(`VALIDATION`,`apkPath must be a non-empty string`);return{report:await this.signingBlockParser.parse(r)}})}};export{ee as ApkPackerHandlers};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./chunk-C_pMuVsO.mjs";import{t}from"./logger-sBC6IdRT.mjs";import{gt as n,mt as r,ni as i}from"./constants-BYj8Xek8.mjs";import{t as a}from"./ToolError-DWU_z7gp.mjs";import{t as o}from"./ToolProbe-C7ZU2x7M.mjs";import{t as s}from"./PrerequisiteError-BjCQA-gK.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,n){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`,n];try{let e=await this.execFileUtf8(a,o,r),t=e.stdout.trim(),n=e.stderr.trim();return n?{output:t,error:n}:{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,r){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 r?.timeout==`number`&&Number.isFinite(r.timeout)?r.timeout:n,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,r=n){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 n=await this.execFileUtf8(a,[o,`binary-instrument`,`-import`,t,`-scriptPath`,d(e),`-postScript`,u(e)],r);return[n.stdout.trim(),n.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};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./ToolError-DWU_z7gp.mjs";import{i as t,r as n,s as r,t as i}from"./parse-args-Bw413PlW.mjs";import{n as a}from"./ResponseBuilder-BfWP-uaT.mjs";import"./definitions-Bio5XJYy.mjs";import{createReadStream as o}from"node:fs";import{stat as s}from"node:fs/promises";import{Buffer as c}from"node:buffer";const l=(e,t)=>{let n=process.env[e];if(n===void 0||n===``)return t;let r=parseInt(n,10);return Number.isFinite(r)?r:t},u=((e,t)=>{let n=process.env[e];if(n===void 0||n===``)return t;let r=n.split(`,`).map(e=>parseInt(e.trim(),10)).filter(e=>Number.isFinite(e)&&e>0);return r.length>0?r:t})(`BINARY_SECRETS_DEFAULT_KEY_LENGTHS`,[16,24,32,64]),d=l(`BINARY_SECRETS_MAX_RESULTS`,500),f=l(`BINARY_SECRETS_MIN_ENTROPY_X10`,70);l(`BINARY_SECRETS_REGEX_TIMEOUT_MS`,50);const p=l(`BINARY_SECRETS_MAX_CHUNK_BYTES`,16*1024*1024),m=l(`BINARY_SECRETS_CHUNK_OVERLAP_BYTES`,1024),h=l(`BINARY_SECRETS_CONTEXT_BYTES`,16),g=l(`BINARY_SECRETS_VALUE_PREVIEW_BYTES`,256),_=l(`BINARY_SECRETS_MIN_BASE64_LENGTH`,24),v=l(`BINARY_SECRETS_MAX_BASE64_LENGTH`,1024),y=l(`BINARY_SECRETS_MIN_HEX_LENGTH`,32),b=l(`BINARY_SECRETS_MAX_HEX_LENGTH`,1024),x=l(`BINARY_SECRETS_MAX_EXTRACT_DURATION_MS`,6e4);function S(e,t,n){if(n<=0)return 0;let r=t+n;if(r>e.length)return 0;let i=new Uint32Array(256);for(let n=t;n<r;n++)i[e[n]]=i[e[n]]+1>>>0;let a=1/n,o=0;for(let e=0;e<256;e++){let t=i[e];if(t===0)continue;let n=t*a;o-=n*Math.log2(n)}return o>8?8:o<0?0:o}function*C(e,t){if(t<=0||t>e.length)return;let n=new Uint32Array(256);for(let r=0;r<t;r++)n[e[r]]=n[e[r]]+1>>>0;yield[0,w(n,t)];for(let r=t;r<e.length;r++){let i=e[r-t],a=e[r];n[i]=n[i]-1>>>0,n[a]=n[a]+1>>>0,yield[r-t+1,w(n,t)]}}function w(e,t){let n=1/t,r=0;for(let t=0;t<256;t++){let i=e[t];if(i===0)continue;let a=i*n;r-=a*Math.log2(a)}return r>8?8:r<0?0:r}const T=p;var E=class{async extractFromFile(t,n={}){if(typeof t!=`string`||t.length===0)throw new e(`VALIDATION`,`filePath must be a non-empty string`);let r=0;try{r=(await s(t)).size}catch(n){throw new e(`NOT_FOUND`,`File not found: ${t}`,{details:{filePath:t},cause:n})}let i=D(n),a=performance.now(),l=Math.max(0,Math.min(i.scanWindowStart,r)),u=Math.max(l,Math.min(i.scanWindowEnd,r)),d=u-l,f=[],p=new Set;if(d===0)return{candidates:[],scannedBytes:0,durationMs:performance.now()-a};let m=c.alloc(0),h=l,g=l,_=o(t,{highWaterMark:i.maxChunkBytes,start:l,end:u-1});for await(let t of _){if(performance.now()-a>x)throw new e(`TIMEOUT`,`binary_key_extract exceeded BINARY_SECRETS_MAX_EXTRACT_DURATION_MS (${x} ms)`);let n=t,r=m.length===0?n:c.concat([m,n]);O(r,h,i,e=>{let t=`${e.format}@${e.absOffset}:${e.length}`;p.has(t)||(p.add(t),f.push(e))}),g+=n.length;let o=Math.min(r.length,i.overlapBytes);m=c.from(r.subarray(r.length-o)),h=g-o}let v=f.map(e=>({hit:e,entropy:S(e.bytes,0,e.length)}));v.sort((e,t)=>e.entropy===t.entropy?e.hit.absOffset-t.hit.absOffset:t.entropy-e.entropy);let y=v.length>i.maxResults;return{candidates:await P(t,y?v.slice(0,i.maxResults):v,i,r),scannedBytes:d,durationMs:performance.now()-a,...y?{truncated:!0}:{}}}};function D(t){let n=(()=>{if(!t.keyLengths)return u;if(!Array.isArray(t.keyLengths))throw new e(`VALIDATION`,`keyLengths must be an array of positive integers`);let n=t.keyLengths.map(t=>{if(!Number.isFinite(t)||!Number.isInteger(t)||t<=0)throw new e(`VALIDATION`,`keyLengths entries must be positive integers (got ${String(t)})`);return t}).filter((e,t,n)=>n.indexOf(e)===t);if(n.length===0)throw new e(`VALIDATION`,`keyLengths must contain at least one positive integer`);return n})(),r=(()=>{if(t.minEntropy===void 0)return f/10;if(typeof t.minEntropy!=`number`||!Number.isFinite(t.minEntropy))throw new e(`VALIDATION`,`minEntropy must be a finite number in [0, 8]`);if(t.minEntropy<0||t.minEntropy>8)throw new e(`VALIDATION`,`minEntropy must be in [0, 8] (got ${t.minEntropy})`);return t.minEntropy})(),i=new Set(t.formats??[`raw`,`base64`,`hex`]);for(let t of i)if(t!==`raw`&&t!==`base64`&&t!==`hex`)throw new e(`VALIDATION`,`Invalid formats entry: "${t}". Expected one of: raw, base64, hex`);let a=t.includeContext??!0,o=(()=>{if(t.contextBytes===void 0)return h;if(typeof t.contextBytes!=`number`||!Number.isInteger(t.contextBytes)||t.contextBytes<0||t.contextBytes>1024)throw new e(`VALIDATION`,`contextBytes must be an integer in [0, 1024] (got ${String(t.contextBytes)})`);return t.contextBytes})(),s=(()=>{if(t.maxResults===void 0)return d;if(typeof t.maxResults!=`number`||!Number.isInteger(t.maxResults)||t.maxResults<=0)throw new e(`VALIDATION`,`maxResults must be a positive integer (got ${String(t.maxResults)})`);return t.maxResults})(),c=Math.max(t.maxChunkBytes??T,8192),l=Math.min(m,c-1),p=t.scanWindow?.start??0,g=t.scanWindow?.end??2**53-1;if(!Number.isFinite(p)||!Number.isFinite(g)||p<0||g<=p)throw new e(`VALIDATION`,`scanWindow must satisfy 0 <= start < end (got start=${p}, end=${g})`);return{keyLengths:n,maxRawWindow:Math.max(...n),minRawWindow:Math.min(...n),minEntropy:r,formats:i,includeContext:a,contextBytes:o,maxResults:s,maxChunkBytes:c,overlapBytes:l,scanWindowStart:p,scanWindowEnd:g}}function O(e,t,n,r){if(n.formats.has(`raw`)){for(let i of n.keyLengths)if(!(i>e.length))for(let[a,o]of C(e,i)){if(o<n.minEntropy)continue;let s=e.subarray(a,a+i);r({absOffset:t+a,length:i,format:`raw`,bytes:Uint8Array.from(s)})}}if(n.formats.has(`base64`))for(let i of j(e,t,n))r(i);if(n.formats.has(`hex`))for(let i of M(e,t,n))r(i)}function k(e){return e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||e===43||e===47}function A(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function*j(e,t,n){let r=_,i=v,a=new Set(n.keyLengths),o=-1;for(let n=0;n<=e.length;n++){let s=n<e.length?e[n]:-1;if(s!==-1&&k(s)){o===-1&&(o=n);continue}if(o===-1)continue;let l=o;o=-1;let u=n,d=0;for(;d<2&&u<e.length&&e[u]===61;)u++,d++;let f=u-l;if(f<r||f>i||N(e,l,f)<5)continue;let p=e.subarray(l,u),m;try{m=c.from(p.toString(`ascii`),`base64`)}catch{continue}m.length!==0&&a.has(m.length)&&(yield{absOffset:t+l,length:m.length,format:`base64`,bytes:Uint8Array.from(m)})}}function*M(e,t,n){let r=y,i=b,a=new Set(n.keyLengths),o=-1;for(let n=0;n<=e.length;n++){let s=n<e.length?e[n]:-1;if(s!==-1&&A(s)){o===-1&&(o=n);continue}if(o===-1)continue;let l=n-o;l%2==1&&--l;let u=o;if(o=-1,l<r||l>i)continue;let d=l/2;if(!a.has(d))continue;let f=e.subarray(u,u+l),p=c.from(f.toString(`ascii`),`hex`);p.length===d&&(yield{absOffset:t+u,length:d,format:`hex`,bytes:Uint8Array.from(p)})}}function N(e,t,n){let r=new Uint8Array(256),i=0;for(let a=t;a<t+n;a++){let t=e[a];r[t]===0&&(r[t]=1,i++)}return i}async function P(e,t,n,r){let i=[];for(let{hit:a,entropy:o}of t){let t=Math.min(a.length,g),s=c.from(a.bytes.subarray(0,t)).toString(`hex`),l={offset:a.absOffset,length:a.length,format:a.format,entropy:o,value:s,...a.length>t?{valueTruncated:!0}:{},...n.includeContext?{context:await F(e,a,n.contextBytes,r)}:{}};i.push(l)}return i}async function F(e,t,n,r){if(n===0)return{before:``,after:``,beforeAscii:``,afterAscii:``};let i=t.format===`hex`?t.length*2:t.format===`base64`?Math.ceil(t.length/3)*4:t.length,a=Math.max(0,t.absOffset-n),o=t.absOffset,s=Math.min(r,t.absOffset+i),c=Math.min(r,s+n),l=await I(e,a,o),u=await I(e,s,c);return{before:l.toString(`hex`),after:u.toString(`hex`),beforeAscii:L(l),afterAscii:L(u)}}async function I(e,t,n){if(n<=t)return c.alloc(0);let r=[],i=o(e,{start:t,end:n-1});for await(let e of i)r.push(e);return c.concat(r)}function L(e){let t=``;for(let n=0;n<e.length;n++){let r=e[n];t+=r>=32&&r<=126?String.fromCharCode(r):`.`}return t}const R=new Set([`raw`,`base64`,`hex`]);function z(t){if(t==null)return;if(!Array.isArray(t))throw new e(`VALIDATION`,`keyLengths must be an array of positive integers`);let n=[];for(let r=0;r<t.length;r++){let i=t[r];if(typeof i!=`number`||!Number.isFinite(i)||!Number.isInteger(i)||i<=0)throw new e(`VALIDATION`,`keyLengths[${r}] must be a positive integer (got ${String(i)})`);n.push(i)}return n}function B(t){if(t==null)return;if(!Array.isArray(t))throw new e(`VALIDATION`,`formats must be an array of strings`);let n=[];for(let r=0;r<t.length;r++){let i=t[r];if(typeof i!=`string`||!R.has(i))throw new e(`VALIDATION`,`formats[${r}] must be one of: raw, base64, hex (got ${String(i)})`);n.push(i)}return n}var V=class{extractor;constructor(e=new E){this.extractor=e}handleBinaryKeyExtract(e){return a(async()=>{let a=r(e,`filePath`),o={},s=z(e.keyLengths);s!==void 0&&(o.keyLengths=s);let c=n(e,`minEntropy`);c!==void 0&&(o.minEntropy=c);let l=B(e.formats);l!==void 0&&(o.formats=l);let u=i(e,`includeContext`);u!==void 0&&(o.includeContext=u);let d=n(e,`contextBytes`);d!==void 0&&(o.contextBytes=d);let f=n(e,`maxResults`);f!==void 0&&(o.maxResults=f);let p=n(e,`maxChunkBytes`);p!==void 0&&(o.maxChunkBytes=p);let m=t(e,`scanWindow`);return m!==void 0&&(o.scanWindow={start:typeof m.start==`number`?m.start:void 0,end:typeof m.end==`number`?m.end:void 0}),{result:await this.extractor.extractFromFile(a,o)}})}};export{V as BinarySecretsHandlers};
|