@jshookmcp/jshook 0.2.2 → 0.2.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.
Files changed (130) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +4 -4
  3. package/README.zh.md +3 -3
  4. package/dist/native/scripts/linux/enum-windows.sh +12 -12
  5. package/dist/native/scripts/macos/enum-windows.applescript +22 -22
  6. package/dist/native/scripts/windows/enum-windows-by-class.ps1 +51 -51
  7. package/dist/native/scripts/windows/enum-windows.ps1 +44 -44
  8. package/dist/native/scripts/windows/inject-dll.ps1 +21 -21
  9. package/dist/src/modules/analyzer/CodeAnalyzer.d.ts +1 -1
  10. package/dist/src/modules/analyzer/CodeAnalyzer.js +1 -1
  11. package/dist/src/modules/browser/BrowserDiscovery.d.ts +6 -5
  12. package/dist/src/modules/browser/BrowserDiscovery.js +1 -1
  13. package/dist/src/modules/browser/BrowserModeManager.d.ts +1 -1
  14. package/dist/src/modules/browser/BrowserModeManager.js +1 -1
  15. package/dist/src/modules/browser/UnifiedBrowserManager.js +1 -1
  16. package/dist/src/modules/captcha/AICaptchaDetector.d.ts +22 -22
  17. package/dist/src/modules/captcha/AICaptchaDetector.js +75 -75
  18. package/dist/src/modules/captcha/CaptchaDetector.d.ts +31 -17
  19. package/dist/src/modules/captcha/CaptchaDetector.js +1 -1
  20. package/dist/src/modules/collector/CodeCache.d.ts +2 -2
  21. package/dist/src/modules/collector/CodeCollector.d.ts +12 -9
  22. package/dist/src/modules/collector/CodeCollector.js +1 -1
  23. package/dist/src/modules/collector/DOMInspector.d.ts +3 -2
  24. package/dist/src/modules/collector/DOMInspector.js +1 -1
  25. package/dist/src/modules/crypto/CryptoDetector.d.ts +1 -1
  26. package/dist/src/modules/crypto/CryptoDetector.js +1 -1
  27. package/dist/src/modules/debugger/ScriptManager.impl.extract-function-tree.js +1 -1
  28. package/dist/src/modules/deobfuscator/Deobfuscator.d.ts +1 -1
  29. package/dist/src/modules/deobfuscator/Deobfuscator.js +1 -1
  30. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.d.ts +1 -1
  31. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.js +2 -2
  32. package/dist/src/modules/deobfuscator/PackerDeobfuscator.js +1 -1
  33. package/dist/src/modules/deobfuscator/VMDeobfuscator.d.ts +1 -1
  34. package/dist/src/modules/deobfuscator/VMDeobfuscator.js +82 -82
  35. package/dist/src/modules/emulator/AIEnvironmentAnalyzer.js +1 -1
  36. package/dist/src/modules/external/ExternalToolRunner.d.ts +1 -1
  37. package/dist/src/modules/external/ExternalToolRunner.js +1 -1
  38. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.compose.js +5 -5
  39. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.network.js +311 -311
  40. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.runtime.js +410 -410
  41. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.storage.js +122 -122
  42. package/dist/src/modules/monitor/ConsoleMonitor.impl.core.dynamic.js +194 -194
  43. package/dist/src/modules/monitor/PlaywrightNetworkMonitor.js +62 -62
  44. package/dist/src/modules/process/LinuxProcessManager.js +2 -2
  45. package/dist/src/modules/process/MacProcessManager.js +26 -26
  46. package/dist/src/modules/process/ProcessManager.impl.js +1 -1
  47. package/dist/src/modules/process/memory/availability.js +49 -49
  48. package/dist/src/modules/process/memory/injector.js +185 -185
  49. package/dist/src/modules/process/memory/reader.js +50 -50
  50. package/dist/src/modules/process/memory/regions.dump.js +51 -51
  51. package/dist/src/modules/process/memory/regions.enumerate.js +107 -107
  52. package/dist/src/modules/process/memory/regions.modules.js +80 -80
  53. package/dist/src/modules/process/memory/regions.protection.js +106 -106
  54. package/dist/src/modules/process/memory/scanner.darwin.js +41 -41
  55. package/dist/src/modules/process/memory/scanner.windows.js +124 -124
  56. package/dist/src/modules/process/memory/writer.js +54 -54
  57. package/dist/src/modules/security/ExecutionSandbox.js +44 -44
  58. package/dist/src/modules/stealth/StealthScripts.d.ts +3 -2
  59. package/dist/src/modules/stealth/StealthScripts.js +35 -1
  60. package/dist/src/modules/stealth/StealthVerifier.d.ts +1 -1
  61. package/dist/src/modules/stealth/StealthVerifier.js +1 -1
  62. package/dist/src/modules/trace/TraceDB.js +63 -63
  63. package/dist/src/native/CodeInjector.js +1 -1
  64. package/dist/src/native/HardwareBreakpoint.js +1 -1
  65. package/dist/src/server/MCPServer.js +1 -0
  66. package/dist/src/server/MCPServer.search.helpers.js +1 -1
  67. package/dist/src/server/MCPServer.tools.js +1 -1
  68. package/dist/src/server/ToolCallContextGuard.d.ts +5 -0
  69. package/dist/src/server/ToolCallContextGuard.js +77 -0
  70. package/dist/src/server/ToolRouter.d.ts +1 -1
  71. package/dist/src/server/ToolRouter.js +2 -2
  72. package/dist/src/server/domains/analysis/handlers.impl.d.ts +8 -8
  73. package/dist/src/server/domains/analysis/handlers.impl.js +8 -8
  74. package/dist/src/server/domains/analysis/handlers.web-tools.js +2 -2
  75. package/dist/src/server/domains/browser/definitions.tools.page-core.js +59 -59
  76. package/dist/src/server/domains/browser/definitions.tools.runtime.js +41 -41
  77. package/dist/src/server/domains/browser/definitions.tools.security.js +114 -114
  78. package/dist/src/server/domains/browser/handlers/facade-initializer.d.ts +3 -3
  79. package/dist/src/server/domains/browser/handlers/facade-initializer.js +3 -3
  80. package/dist/src/server/domains/browser/handlers/framework-state.js +210 -0
  81. package/dist/src/server/domains/browser/handlers/stealth-injection.js +8 -2
  82. package/dist/src/server/domains/browser/handlers.impl.d.ts +15 -11
  83. package/dist/src/server/domains/browser/handlers.impl.js +4 -4
  84. package/dist/src/server/domains/coordination/definitions.js +67 -0
  85. package/dist/src/server/domains/coordination/index.d.ts +18 -0
  86. package/dist/src/server/domains/coordination/index.js +132 -0
  87. package/dist/src/server/domains/coordination/manifest.js +15 -0
  88. package/dist/src/server/domains/graphql/handlers.impl.core.runtime.replay.js +2 -2
  89. package/dist/src/server/domains/graphql/handlers.impl.core.runtime.shared.js +77 -77
  90. package/dist/src/server/domains/hooks/ai-handlers.js +3 -3
  91. package/dist/src/server/domains/maintenance/handlers.d.ts +2 -2
  92. package/dist/src/server/domains/maintenance/handlers.js +2 -2
  93. package/dist/src/server/domains/platform/handlers/bridge-handlers.d.ts +1 -1
  94. package/dist/src/server/domains/platform/handlers/bridge-handlers.js +1 -1
  95. package/dist/src/server/domains/platform/handlers/miniapp-handlers.d.ts +1 -1
  96. package/dist/src/server/domains/platform/handlers/miniapp-handlers.js +1 -1
  97. package/dist/src/server/domains/process/handlers.impl.core.runtime.inject.js +1 -1
  98. package/dist/src/server/domains/trace/TraceSummarizer.d.ts +60 -0
  99. package/dist/src/server/domains/trace/TraceSummarizer.js +109 -0
  100. package/dist/src/server/domains/trace/definitions.tools.js +101 -71
  101. package/dist/src/server/domains/trace/handlers.d.ts +2 -1
  102. package/dist/src/server/domains/trace/handlers.js +59 -4
  103. package/dist/src/server/domains/trace/manifest.js +3 -1
  104. package/dist/src/server/domains/transform/handlers.impl.transform-base.js +103 -103
  105. package/dist/src/server/domains/wasm/handlers.js +2 -2
  106. package/dist/src/server/domains/workflow/handlers.impl.workflow-account-bundle.js +1 -1
  107. package/dist/src/server/domains/workflow/handlers.impl.workflow-api.js +51 -51
  108. package/dist/src/server/domains/workflow/handlers.impl.workflow-base.js +51 -51
  109. package/dist/src/server/extensions/ExtensionManager.roots.js +15 -5
  110. package/dist/src/server/http/HttpMiddleware.js +1 -1
  111. package/dist/src/server/registry/contracts.d.ts +6 -0
  112. package/dist/src/server/sandbox/MCPBridge.d.ts +9 -0
  113. package/dist/src/server/sandbox/MCPBridge.js +22 -0
  114. package/dist/src/server/sandbox/QuickJSSandbox.d.ts +4 -1
  115. package/dist/src/server/sandbox/QuickJSSandbox.js +149 -0
  116. package/dist/src/server/sandbox/SandboxHelpers.js +250 -250
  117. package/dist/src/server/sandbox/types.d.ts +13 -0
  118. package/dist/src/server/search/AffinityGraph.d.ts +7 -1
  119. package/dist/src/server/search/AffinityGraph.js +24 -3
  120. package/dist/src/services/LLMService.js +1 -1
  121. package/dist/src/utils/UnifiedCacheManager.d.ts +1 -1
  122. package/dist/src/utils/UnifiedCacheManager.js +2 -2
  123. package/dist/src/utils/cliFastPath.js +18 -4
  124. package/package.json +5 -3
  125. package/scripts/postinstall.cjs +37 -37
  126. package/src/native/scripts/linux/enum-windows.sh +12 -12
  127. package/src/native/scripts/macos/enum-windows.applescript +22 -22
  128. package/src/native/scripts/windows/enum-windows-by-class.ps1 +51 -51
  129. package/src/native/scripts/windows/enum-windows.ps1 +44 -44
  130. package/src/native/scripts/windows/inject-dll.ps1 +21 -21
@@ -1,129 +1,129 @@
1
1
  export function generateLocalStorageHook(action, customCode, _condition, _performance = false) {
2
- return `
3
- (function() {
4
- 'use strict';
5
-
6
- const originalSetItem = Storage.prototype.setItem;
7
- const originalGetItem = Storage.prototype.getItem;
8
- const originalRemoveItem = Storage.prototype.removeItem;
9
- const originalClear = Storage.prototype.clear;
10
-
11
- Storage.prototype.setItem = function(key, value) {
12
- const storageType = this === window.localStorage ? 'localStorage' : 'sessionStorage';
13
- const stackTrace = new Error().stack.split('\\n').slice(2, 4).join('\\n');
14
-
15
- console.log(\`[Storage Hook] \${storageType}.setItem:\`, {
16
- key: key,
17
- value: value,
18
- valueType: typeof value,
19
- valueLength: value?.length || 0,
20
- stackTrace: stackTrace
21
- });
22
-
23
- ${action === 'block' ? 'return;' : ''}
24
- ${customCode || ''}
25
-
26
- return originalSetItem.apply(this, arguments);
27
- };
28
-
29
- Storage.prototype.getItem = function(key) {
30
- const value = originalGetItem.apply(this, arguments);
31
- const storageType = this === window.localStorage ? 'localStorage' : 'sessionStorage';
32
-
33
- console.log(\`[Storage Hook] \${storageType}.getItem:\`, {
34
- key: key,
35
- value: value,
36
- found: value !== null
37
- });
38
-
39
- return value;
40
- };
41
-
42
- Storage.prototype.removeItem = function(key) {
43
- const storageType = this === window.localStorage ? 'localStorage' : 'sessionStorage';
44
- const oldValue = this.getItem(key);
45
-
46
- console.log(\`[Storage Hook] \${storageType}.removeItem:\`, {
47
- key: key,
48
- oldValue: oldValue
49
- });
50
-
51
- return originalRemoveItem.apply(this, arguments);
52
- };
53
-
54
- Storage.prototype.clear = function() {
55
- const storageType = this === window.localStorage ? 'localStorage' : 'sessionStorage';
56
- const itemCount = this.length;
57
-
58
- console.log(\`[Storage Hook] \${storageType}.clear:\`, {
59
- itemCount: itemCount,
60
- items: Object.keys(this)
61
- });
62
-
63
- return originalClear.apply(this, arguments);
64
- };
65
-
66
- console.log('[Storage Hook] Successfully hooked localStorage and sessionStorage');
67
- })();
2
+ return `
3
+ (function() {
4
+ 'use strict';
5
+
6
+ const originalSetItem = Storage.prototype.setItem;
7
+ const originalGetItem = Storage.prototype.getItem;
8
+ const originalRemoveItem = Storage.prototype.removeItem;
9
+ const originalClear = Storage.prototype.clear;
10
+
11
+ Storage.prototype.setItem = function(key, value) {
12
+ const storageType = this === window.localStorage ? 'localStorage' : 'sessionStorage';
13
+ const stackTrace = new Error().stack.split('\\n').slice(2, 4).join('\\n');
14
+
15
+ console.log(\`[Storage Hook] \${storageType}.setItem:\`, {
16
+ key: key,
17
+ value: value,
18
+ valueType: typeof value,
19
+ valueLength: value?.length || 0,
20
+ stackTrace: stackTrace
21
+ });
22
+
23
+ ${action === 'block' ? 'return;' : ''}
24
+ ${customCode || ''}
25
+
26
+ return originalSetItem.apply(this, arguments);
27
+ };
28
+
29
+ Storage.prototype.getItem = function(key) {
30
+ const value = originalGetItem.apply(this, arguments);
31
+ const storageType = this === window.localStorage ? 'localStorage' : 'sessionStorage';
32
+
33
+ console.log(\`[Storage Hook] \${storageType}.getItem:\`, {
34
+ key: key,
35
+ value: value,
36
+ found: value !== null
37
+ });
38
+
39
+ return value;
40
+ };
41
+
42
+ Storage.prototype.removeItem = function(key) {
43
+ const storageType = this === window.localStorage ? 'localStorage' : 'sessionStorage';
44
+ const oldValue = this.getItem(key);
45
+
46
+ console.log(\`[Storage Hook] \${storageType}.removeItem:\`, {
47
+ key: key,
48
+ oldValue: oldValue
49
+ });
50
+
51
+ return originalRemoveItem.apply(this, arguments);
52
+ };
53
+
54
+ Storage.prototype.clear = function() {
55
+ const storageType = this === window.localStorage ? 'localStorage' : 'sessionStorage';
56
+ const itemCount = this.length;
57
+
58
+ console.log(\`[Storage Hook] \${storageType}.clear:\`, {
59
+ itemCount: itemCount,
60
+ items: Object.keys(this)
61
+ });
62
+
63
+ return originalClear.apply(this, arguments);
64
+ };
65
+
66
+ console.log('[Storage Hook] Successfully hooked localStorage and sessionStorage');
67
+ })();
68
68
  `.trim();
69
69
  }
70
70
  export function generateCookieHook(action, customCode, _condition, _performance = false) {
71
- return `
72
- (function() {
73
- 'use strict';
74
-
75
- const cookieDescriptor = Object.getOwnPropertyDescriptor(Document.prototype, 'cookie') ||
76
- Object.getOwnPropertyDescriptor(HTMLDocument.prototype, 'cookie');
77
-
78
- if (!cookieDescriptor) {
79
- console.error('[Cookie Hook] Failed to get cookie descriptor');
80
- return;
81
- }
82
-
83
- const originalGet = cookieDescriptor.get;
84
- const originalSet = cookieDescriptor.set;
85
-
86
- function parseCookie(cookieString) {
87
- const parts = cookieString.split(';')[0].split('=');
88
- return {
89
- name: parts[0]?.trim(),
90
- value: parts[1]?.trim(),
91
- raw: cookieString
92
- };
93
- }
94
-
95
- Object.defineProperty(document, 'cookie', {
96
- get: function() {
97
- const value = originalGet.call(this);
98
-
99
- console.log('[Cookie Hook] get:', {
100
- value: value,
101
- cookieCount: value ? value.split(';').length : 0
102
- });
103
-
104
- return value;
105
- },
106
- set: function(value) {
107
- const cookieInfo = parseCookie(value);
108
- const stackTrace = new Error().stack.split('\\n').slice(2, 4).join('\\n');
109
-
110
- console.log('[Cookie Hook] set:', {
111
- name: cookieInfo.name,
112
- value: cookieInfo.value,
113
- raw: cookieInfo.raw,
114
- stackTrace: stackTrace
115
- });
116
-
117
- ${action === 'block' ? 'return;' : ''}
118
- ${customCode || ''}
119
-
120
- return originalSet.call(this, value);
121
- },
122
- configurable: true
123
- });
124
-
125
- console.log('[Cookie Hook] Successfully hooked document.cookie');
126
- })();
71
+ return `
72
+ (function() {
73
+ 'use strict';
74
+
75
+ const cookieDescriptor = Object.getOwnPropertyDescriptor(Document.prototype, 'cookie') ||
76
+ Object.getOwnPropertyDescriptor(HTMLDocument.prototype, 'cookie');
77
+
78
+ if (!cookieDescriptor) {
79
+ console.error('[Cookie Hook] Failed to get cookie descriptor');
80
+ return;
81
+ }
82
+
83
+ const originalGet = cookieDescriptor.get;
84
+ const originalSet = cookieDescriptor.set;
85
+
86
+ function parseCookie(cookieString) {
87
+ const parts = cookieString.split(';')[0].split('=');
88
+ return {
89
+ name: parts[0]?.trim(),
90
+ value: parts[1]?.trim(),
91
+ raw: cookieString
92
+ };
93
+ }
94
+
95
+ Object.defineProperty(document, 'cookie', {
96
+ get: function() {
97
+ const value = originalGet.call(this);
98
+
99
+ console.log('[Cookie Hook] get:', {
100
+ value: value,
101
+ cookieCount: value ? value.split(';').length : 0
102
+ });
103
+
104
+ return value;
105
+ },
106
+ set: function(value) {
107
+ const cookieInfo = parseCookie(value);
108
+ const stackTrace = new Error().stack.split('\\n').slice(2, 4).join('\\n');
109
+
110
+ console.log('[Cookie Hook] set:', {
111
+ name: cookieInfo.name,
112
+ value: cookieInfo.value,
113
+ raw: cookieInfo.raw,
114
+ stackTrace: stackTrace
115
+ });
116
+
117
+ ${action === 'block' ? 'return;' : ''}
118
+ ${customCode || ''}
119
+
120
+ return originalSet.call(this, value);
121
+ },
122
+ configurable: true
123
+ });
124
+
125
+ console.log('[Cookie Hook] Successfully hooked document.cookie');
126
+ })();
127
127
  `.trim();
128
128
  }
129
129
  export function getInjectionInstructions(type) {
@@ -9,93 +9,93 @@ export async function enableDynamicScriptMonitoringCore(ctx, options) {
9
9
  if (!coreCtx.cdpSession) {
10
10
  throw new PrerequisiteError('CDP session not available after reconnect attempt');
11
11
  }
12
- const monitorCode = `
13
- (function() {
14
- if (window.__dynamicScriptMonitorInstalled) {
15
- console.log('[ScriptMonitor] Already installed');
16
- return;
17
- }
18
- window.__dynamicScriptMonitorInstalled = true;
19
-
20
- const maxRecords = ${coreCtx.MAX_INJECTED_DYNAMIC_SCRIPTS};
21
- if (!window.__dynamicScripts) {
22
- window.__dynamicScripts = [];
23
- }
24
- const dynamicScripts = window.__dynamicScripts;
25
- const state = window.__dynamicScriptMonitorState || {};
26
- if (!state.originalCreateElement) state.originalCreateElement = document.createElement;
27
- if (!state.originalEval) state.originalEval = window.eval;
28
- if (!state.originalFunction) state.originalFunction = window.Function;
29
- window.__dynamicScriptMonitorState = state;
30
-
31
- const observer = new MutationObserver((mutations) => {
32
- mutations.forEach((mutation) => {
33
- mutation.addedNodes.forEach((node) => {
34
- if (node.nodeName === 'SCRIPT') {
35
- const script = node;
36
- const info = {
37
- type: 'dynamic',
38
- src: script.src || '(inline)',
39
- content: script.src ? null : script.textContent,
40
- timestamp: Date.now(),
41
- async: script.async,
42
- defer: script.defer,
43
- };
44
-
45
- dynamicScripts.push(info);
46
- if (dynamicScripts.length > maxRecords) {
47
- dynamicScripts.splice(0, dynamicScripts.length - maxRecords);
48
- }
49
- console.log('[ScriptMonitor] Dynamic script added:', info);
50
- }
51
- });
52
- });
53
- });
54
-
55
- observer.observe(document.documentElement, {
56
- childList: true,
57
- subtree: true,
58
- });
59
- state.observer = observer;
60
-
61
- const originalCreateElement = state.originalCreateElement;
62
- document.createElement = function(tagName) {
63
- const element = originalCreateElement.call(document, tagName);
64
-
65
- if (tagName.toLowerCase() === 'script') {
66
- console.log('[ScriptMonitor] Script element created via createElement');
67
-
68
- const originalSetAttribute = element.setAttribute;
69
- element.setAttribute = function(name, value) {
70
- if (name === 'src') {
71
- console.log('[ScriptMonitor] Script src set to:', value);
72
- }
73
- return originalSetAttribute.call(element, name, value);
74
- };
75
- }
76
-
77
- return element;
78
- };
79
-
80
- const originalEval = state.originalEval;
81
- window.eval = function(code) {
82
- console.log('[ScriptMonitor] eval() called with code:',
83
- typeof code === 'string' ? code.substring(0, 100) + '...' : code);
84
- return originalEval.call(window, code);
85
- };
86
-
87
- const originalFunction = state.originalFunction;
88
- window.Function = function(...args) {
89
- console.log('[ScriptMonitor] Function() constructor called with args:', args);
90
- return originalFunction.apply(this, args);
91
- };
92
-
93
- window.__getDynamicScripts = function() {
94
- return dynamicScripts;
95
- };
96
-
97
- console.log('[ScriptMonitor] Dynamic script monitoring enabled');
98
- })();
12
+ const monitorCode = `
13
+ (function() {
14
+ if (window.__dynamicScriptMonitorInstalled) {
15
+ console.log('[ScriptMonitor] Already installed');
16
+ return;
17
+ }
18
+ window.__dynamicScriptMonitorInstalled = true;
19
+
20
+ const maxRecords = ${coreCtx.MAX_INJECTED_DYNAMIC_SCRIPTS};
21
+ if (!window.__dynamicScripts) {
22
+ window.__dynamicScripts = [];
23
+ }
24
+ const dynamicScripts = window.__dynamicScripts;
25
+ const state = window.__dynamicScriptMonitorState || {};
26
+ if (!state.originalCreateElement) state.originalCreateElement = document.createElement;
27
+ if (!state.originalEval) state.originalEval = window.eval;
28
+ if (!state.originalFunction) state.originalFunction = window.Function;
29
+ window.__dynamicScriptMonitorState = state;
30
+
31
+ const observer = new MutationObserver((mutations) => {
32
+ mutations.forEach((mutation) => {
33
+ mutation.addedNodes.forEach((node) => {
34
+ if (node.nodeName === 'SCRIPT') {
35
+ const script = node;
36
+ const info = {
37
+ type: 'dynamic',
38
+ src: script.src || '(inline)',
39
+ content: script.src ? null : script.textContent,
40
+ timestamp: Date.now(),
41
+ async: script.async,
42
+ defer: script.defer,
43
+ };
44
+
45
+ dynamicScripts.push(info);
46
+ if (dynamicScripts.length > maxRecords) {
47
+ dynamicScripts.splice(0, dynamicScripts.length - maxRecords);
48
+ }
49
+ console.log('[ScriptMonitor] Dynamic script added:', info);
50
+ }
51
+ });
52
+ });
53
+ });
54
+
55
+ observer.observe(document.documentElement, {
56
+ childList: true,
57
+ subtree: true,
58
+ });
59
+ state.observer = observer;
60
+
61
+ const originalCreateElement = state.originalCreateElement;
62
+ document.createElement = function(tagName) {
63
+ const element = originalCreateElement.call(document, tagName);
64
+
65
+ if (tagName.toLowerCase() === 'script') {
66
+ console.log('[ScriptMonitor] Script element created via createElement');
67
+
68
+ const originalSetAttribute = element.setAttribute;
69
+ element.setAttribute = function(name, value) {
70
+ if (name === 'src') {
71
+ console.log('[ScriptMonitor] Script src set to:', value);
72
+ }
73
+ return originalSetAttribute.call(element, name, value);
74
+ };
75
+ }
76
+
77
+ return element;
78
+ };
79
+
80
+ const originalEval = state.originalEval;
81
+ window.eval = function(code) {
82
+ console.log('[ScriptMonitor] eval() called with code:',
83
+ typeof code === 'string' ? code.substring(0, 100) + '...' : code);
84
+ return originalEval.call(window, code);
85
+ };
86
+
87
+ const originalFunction = state.originalFunction;
88
+ window.Function = function(...args) {
89
+ console.log('[ScriptMonitor] Function() constructor called with args:', args);
90
+ return originalFunction.apply(this, args);
91
+ };
92
+
93
+ window.__getDynamicScripts = function() {
94
+ return dynamicScripts;
95
+ };
96
+
97
+ console.log('[ScriptMonitor] Dynamic script monitoring enabled');
98
+ })();
99
99
  `;
100
100
  if (options?.persistent) {
101
101
  await coreCtx.cdpSession.send('Page.addScriptToEvaluateOnNewDocument', {
@@ -117,19 +117,19 @@ export async function clearDynamicScriptBufferCore(ctx) {
117
117
  }
118
118
  try {
119
119
  const result = await coreCtx.cdpSession.send('Runtime.evaluate', {
120
- expression: `
121
- (() => {
122
- const store = Array.isArray(window.__dynamicScripts)
123
- ? window.__dynamicScripts
124
- : (typeof window.__getDynamicScripts === 'function'
125
- ? window.__getDynamicScripts()
126
- : null);
127
- const dynamicScriptsCleared = Array.isArray(store) ? store.length : 0;
128
- if (Array.isArray(store)) {
129
- store.length = 0;
130
- }
131
- return { dynamicScriptsCleared };
132
- })()
120
+ expression: `
121
+ (() => {
122
+ const store = Array.isArray(window.__dynamicScripts)
123
+ ? window.__dynamicScripts
124
+ : (typeof window.__getDynamicScripts === 'function'
125
+ ? window.__getDynamicScripts()
126
+ : null);
127
+ const dynamicScriptsCleared = Array.isArray(store) ? store.length : 0;
128
+ if (Array.isArray(store)) {
129
+ store.length = 0;
130
+ }
131
+ return { dynamicScriptsCleared };
132
+ })()
133
133
  `,
134
134
  returnByValue: true,
135
135
  });
@@ -154,48 +154,48 @@ export async function resetDynamicScriptMonitoringCore(ctx) {
154
154
  }
155
155
  try {
156
156
  const result = await coreCtx.cdpSession.send('Runtime.evaluate', {
157
- expression: `
158
- (() => {
159
- const state = window.__dynamicScriptMonitorState;
160
- let scriptMonitorReset = false;
161
-
162
- try {
163
- if (state && state.observer && typeof state.observer.disconnect === 'function') {
164
- state.observer.disconnect();
165
- state.observer = null;
166
- scriptMonitorReset = true;
167
- }
168
- } catch (_) {}
169
-
170
- try {
171
- if (state && state.originalCreateElement) {
172
- document.createElement = state.originalCreateElement;
173
- scriptMonitorReset = true;
174
- }
175
- } catch (_) {}
176
-
177
- try {
178
- if (state && state.originalEval) {
179
- window.eval = state.originalEval;
180
- scriptMonitorReset = true;
181
- }
182
- } catch (_) {}
183
-
184
- try {
185
- if (state && state.originalFunction) {
186
- window.Function = state.originalFunction;
187
- scriptMonitorReset = true;
188
- }
189
- } catch (_) {}
190
-
191
- if (Array.isArray(window.__dynamicScripts)) {
192
- window.__dynamicScripts.length = 0;
193
- }
194
- delete window.__getDynamicScripts;
195
- window.__dynamicScriptMonitorInstalled = false;
196
-
197
- return { scriptMonitorReset };
198
- })()
157
+ expression: `
158
+ (() => {
159
+ const state = window.__dynamicScriptMonitorState;
160
+ let scriptMonitorReset = false;
161
+
162
+ try {
163
+ if (state && state.observer && typeof state.observer.disconnect === 'function') {
164
+ state.observer.disconnect();
165
+ state.observer = null;
166
+ scriptMonitorReset = true;
167
+ }
168
+ } catch (_) {}
169
+
170
+ try {
171
+ if (state && state.originalCreateElement) {
172
+ document.createElement = state.originalCreateElement;
173
+ scriptMonitorReset = true;
174
+ }
175
+ } catch (_) {}
176
+
177
+ try {
178
+ if (state && state.originalEval) {
179
+ window.eval = state.originalEval;
180
+ scriptMonitorReset = true;
181
+ }
182
+ } catch (_) {}
183
+
184
+ try {
185
+ if (state && state.originalFunction) {
186
+ window.Function = state.originalFunction;
187
+ scriptMonitorReset = true;
188
+ }
189
+ } catch (_) {}
190
+
191
+ if (Array.isArray(window.__dynamicScripts)) {
192
+ window.__dynamicScripts.length = 0;
193
+ }
194
+ delete window.__getDynamicScripts;
195
+ window.__dynamicScriptMonitorInstalled = false;
196
+
197
+ return { scriptMonitorReset };
198
+ })()
199
199
  `,
200
200
  returnByValue: true,
201
201
  });
@@ -236,33 +236,33 @@ export async function injectFunctionTracerCore(ctx, functionName, options) {
236
236
  if (!coreCtx.cdpSession) {
237
237
  throw new PrerequisiteError('CDP session not initialized');
238
238
  }
239
- const tracerCode = `
240
- (function() {
241
- const originalFunc = window.${functionName};
242
- if (typeof originalFunc !== 'function') {
243
- console.error('[Tracer] ${functionName} is not a function');
244
- return;
245
- }
246
-
247
- window.${functionName} = new Proxy(originalFunc, {
248
- apply: function(target, thisArg, args) {
249
- console.log('[Tracer] ${functionName} called with args:', args);
250
- const startTime = performance.now();
251
-
252
- try {
253
- const result = target.apply(thisArg, args);
254
- const endTime = performance.now();
255
- console.log('[Tracer] ${functionName} returned:', result, 'Time:', (endTime - startTime).toFixed(2), 'ms');
256
- return result;
257
- } catch (error) {
258
- console.error('[Tracer] ${functionName} threw error:', error);
259
- throw error;
260
- }
261
- }
262
- });
263
-
264
- console.log('[Tracer] ${functionName} is now being traced');
265
- })();
239
+ const tracerCode = `
240
+ (function() {
241
+ const originalFunc = window.${functionName};
242
+ if (typeof originalFunc !== 'function') {
243
+ console.error('[Tracer] ${functionName} is not a function');
244
+ return;
245
+ }
246
+
247
+ window.${functionName} = new Proxy(originalFunc, {
248
+ apply: function(target, thisArg, args) {
249
+ console.log('[Tracer] ${functionName} called with args:', args);
250
+ const startTime = performance.now();
251
+
252
+ try {
253
+ const result = target.apply(thisArg, args);
254
+ const endTime = performance.now();
255
+ console.log('[Tracer] ${functionName} returned:', result, 'Time:', (endTime - startTime).toFixed(2), 'ms');
256
+ return result;
257
+ } catch (error) {
258
+ console.error('[Tracer] ${functionName} threw error:', error);
259
+ throw error;
260
+ }
261
+ }
262
+ });
263
+
264
+ console.log('[Tracer] ${functionName} is now being traced');
265
+ })();
266
266
  `;
267
267
  if (options?.persistent) {
268
268
  await coreCtx.cdpSession.send('Page.addScriptToEvaluateOnNewDocument', {
@@ -282,31 +282,31 @@ export async function injectPropertyWatcherCore(ctx, objectPath, propertyName, o
282
282
  if (!coreCtx.cdpSession) {
283
283
  throw new PrerequisiteError('CDP session not initialized');
284
284
  }
285
- const watcherCode = `
286
- (function() {
287
- const obj = ${objectPath};
288
- if (!obj) {
289
- console.error('[Watcher] Object not found: ${objectPath}');
290
- return;
291
- }
292
-
293
- let value = obj.${propertyName};
294
-
295
- Object.defineProperty(obj, '${propertyName}', {
296
- get: function() {
297
- console.log('[Watcher] ${objectPath}.${propertyName} accessed, value:', value);
298
- return value;
299
- },
300
- set: function(newValue) {
301
- console.log('[Watcher] ${objectPath}.${propertyName} changed from', value, 'to', newValue);
302
- value = newValue;
303
- },
304
- enumerable: true,
305
- configurable: true
306
- });
307
-
308
- console.log('[Watcher] Property watcher installed for ${objectPath}.${propertyName}');
309
- })();
285
+ const watcherCode = `
286
+ (function() {
287
+ const obj = ${objectPath};
288
+ if (!obj) {
289
+ console.error('[Watcher] Object not found: ${objectPath}');
290
+ return;
291
+ }
292
+
293
+ let value = obj.${propertyName};
294
+
295
+ Object.defineProperty(obj, '${propertyName}', {
296
+ get: function() {
297
+ console.log('[Watcher] ${objectPath}.${propertyName} accessed, value:', value);
298
+ return value;
299
+ },
300
+ set: function(newValue) {
301
+ console.log('[Watcher] ${objectPath}.${propertyName} changed from', value, 'to', newValue);
302
+ value = newValue;
303
+ },
304
+ enumerable: true,
305
+ configurable: true
306
+ });
307
+
308
+ console.log('[Watcher] Property watcher installed for ${objectPath}.${propertyName}');
309
+ })();
310
310
  `;
311
311
  if (options?.persistent) {
312
312
  await coreCtx.cdpSession.send('Page.addScriptToEvaluateOnNewDocument', {