@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.
- package/LICENSE +661 -661
- package/README.md +4 -4
- package/README.zh.md +3 -3
- package/dist/native/scripts/linux/enum-windows.sh +12 -12
- package/dist/native/scripts/macos/enum-windows.applescript +22 -22
- package/dist/native/scripts/windows/enum-windows-by-class.ps1 +51 -51
- package/dist/native/scripts/windows/enum-windows.ps1 +44 -44
- package/dist/native/scripts/windows/inject-dll.ps1 +21 -21
- package/dist/src/modules/analyzer/CodeAnalyzer.d.ts +1 -1
- package/dist/src/modules/analyzer/CodeAnalyzer.js +1 -1
- package/dist/src/modules/browser/BrowserDiscovery.d.ts +6 -5
- package/dist/src/modules/browser/BrowserDiscovery.js +1 -1
- package/dist/src/modules/browser/BrowserModeManager.d.ts +1 -1
- package/dist/src/modules/browser/BrowserModeManager.js +1 -1
- package/dist/src/modules/browser/UnifiedBrowserManager.js +1 -1
- package/dist/src/modules/captcha/AICaptchaDetector.d.ts +22 -22
- package/dist/src/modules/captcha/AICaptchaDetector.js +75 -75
- package/dist/src/modules/captcha/CaptchaDetector.d.ts +31 -17
- package/dist/src/modules/captcha/CaptchaDetector.js +1 -1
- package/dist/src/modules/collector/CodeCache.d.ts +2 -2
- package/dist/src/modules/collector/CodeCollector.d.ts +12 -9
- package/dist/src/modules/collector/CodeCollector.js +1 -1
- package/dist/src/modules/collector/DOMInspector.d.ts +3 -2
- package/dist/src/modules/collector/DOMInspector.js +1 -1
- package/dist/src/modules/crypto/CryptoDetector.d.ts +1 -1
- package/dist/src/modules/crypto/CryptoDetector.js +1 -1
- package/dist/src/modules/debugger/ScriptManager.impl.extract-function-tree.js +1 -1
- package/dist/src/modules/deobfuscator/Deobfuscator.d.ts +1 -1
- package/dist/src/modules/deobfuscator/Deobfuscator.js +1 -1
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.d.ts +1 -1
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.js +2 -2
- package/dist/src/modules/deobfuscator/PackerDeobfuscator.js +1 -1
- package/dist/src/modules/deobfuscator/VMDeobfuscator.d.ts +1 -1
- package/dist/src/modules/deobfuscator/VMDeobfuscator.js +82 -82
- package/dist/src/modules/emulator/AIEnvironmentAnalyzer.js +1 -1
- package/dist/src/modules/external/ExternalToolRunner.d.ts +1 -1
- package/dist/src/modules/external/ExternalToolRunner.js +1 -1
- package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.compose.js +5 -5
- package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.network.js +311 -311
- package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.runtime.js +410 -410
- package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.storage.js +122 -122
- package/dist/src/modules/monitor/ConsoleMonitor.impl.core.dynamic.js +194 -194
- package/dist/src/modules/monitor/PlaywrightNetworkMonitor.js +62 -62
- package/dist/src/modules/process/LinuxProcessManager.js +2 -2
- package/dist/src/modules/process/MacProcessManager.js +26 -26
- package/dist/src/modules/process/ProcessManager.impl.js +1 -1
- package/dist/src/modules/process/memory/availability.js +49 -49
- package/dist/src/modules/process/memory/injector.js +185 -185
- package/dist/src/modules/process/memory/reader.js +50 -50
- package/dist/src/modules/process/memory/regions.dump.js +51 -51
- package/dist/src/modules/process/memory/regions.enumerate.js +107 -107
- package/dist/src/modules/process/memory/regions.modules.js +80 -80
- package/dist/src/modules/process/memory/regions.protection.js +106 -106
- package/dist/src/modules/process/memory/scanner.darwin.js +41 -41
- package/dist/src/modules/process/memory/scanner.windows.js +124 -124
- package/dist/src/modules/process/memory/writer.js +54 -54
- package/dist/src/modules/security/ExecutionSandbox.js +44 -44
- package/dist/src/modules/stealth/StealthScripts.d.ts +3 -2
- package/dist/src/modules/stealth/StealthScripts.js +35 -1
- package/dist/src/modules/stealth/StealthVerifier.d.ts +1 -1
- package/dist/src/modules/stealth/StealthVerifier.js +1 -1
- package/dist/src/modules/trace/TraceDB.js +63 -63
- package/dist/src/native/CodeInjector.js +1 -1
- package/dist/src/native/HardwareBreakpoint.js +1 -1
- package/dist/src/server/MCPServer.js +1 -0
- package/dist/src/server/MCPServer.search.helpers.js +1 -1
- package/dist/src/server/MCPServer.tools.js +1 -1
- package/dist/src/server/ToolCallContextGuard.d.ts +5 -0
- package/dist/src/server/ToolCallContextGuard.js +77 -0
- package/dist/src/server/ToolRouter.d.ts +1 -1
- package/dist/src/server/ToolRouter.js +2 -2
- package/dist/src/server/domains/analysis/handlers.impl.d.ts +8 -8
- package/dist/src/server/domains/analysis/handlers.impl.js +8 -8
- package/dist/src/server/domains/analysis/handlers.web-tools.js +2 -2
- package/dist/src/server/domains/browser/definitions.tools.page-core.js +59 -59
- package/dist/src/server/domains/browser/definitions.tools.runtime.js +41 -41
- package/dist/src/server/domains/browser/definitions.tools.security.js +114 -114
- package/dist/src/server/domains/browser/handlers/facade-initializer.d.ts +3 -3
- package/dist/src/server/domains/browser/handlers/facade-initializer.js +3 -3
- package/dist/src/server/domains/browser/handlers/framework-state.js +210 -0
- package/dist/src/server/domains/browser/handlers/stealth-injection.js +8 -2
- package/dist/src/server/domains/browser/handlers.impl.d.ts +15 -11
- package/dist/src/server/domains/browser/handlers.impl.js +4 -4
- package/dist/src/server/domains/coordination/definitions.js +67 -0
- package/dist/src/server/domains/coordination/index.d.ts +18 -0
- package/dist/src/server/domains/coordination/index.js +132 -0
- package/dist/src/server/domains/coordination/manifest.js +15 -0
- package/dist/src/server/domains/graphql/handlers.impl.core.runtime.replay.js +2 -2
- package/dist/src/server/domains/graphql/handlers.impl.core.runtime.shared.js +77 -77
- package/dist/src/server/domains/hooks/ai-handlers.js +3 -3
- package/dist/src/server/domains/maintenance/handlers.d.ts +2 -2
- package/dist/src/server/domains/maintenance/handlers.js +2 -2
- package/dist/src/server/domains/platform/handlers/bridge-handlers.d.ts +1 -1
- package/dist/src/server/domains/platform/handlers/bridge-handlers.js +1 -1
- package/dist/src/server/domains/platform/handlers/miniapp-handlers.d.ts +1 -1
- package/dist/src/server/domains/platform/handlers/miniapp-handlers.js +1 -1
- package/dist/src/server/domains/process/handlers.impl.core.runtime.inject.js +1 -1
- package/dist/src/server/domains/trace/TraceSummarizer.d.ts +60 -0
- package/dist/src/server/domains/trace/TraceSummarizer.js +109 -0
- package/dist/src/server/domains/trace/definitions.tools.js +101 -71
- package/dist/src/server/domains/trace/handlers.d.ts +2 -1
- package/dist/src/server/domains/trace/handlers.js +59 -4
- package/dist/src/server/domains/trace/manifest.js +3 -1
- package/dist/src/server/domains/transform/handlers.impl.transform-base.js +103 -103
- package/dist/src/server/domains/wasm/handlers.js +2 -2
- package/dist/src/server/domains/workflow/handlers.impl.workflow-account-bundle.js +1 -1
- package/dist/src/server/domains/workflow/handlers.impl.workflow-api.js +51 -51
- package/dist/src/server/domains/workflow/handlers.impl.workflow-base.js +51 -51
- package/dist/src/server/extensions/ExtensionManager.roots.js +15 -5
- package/dist/src/server/http/HttpMiddleware.js +1 -1
- package/dist/src/server/registry/contracts.d.ts +6 -0
- package/dist/src/server/sandbox/MCPBridge.d.ts +9 -0
- package/dist/src/server/sandbox/MCPBridge.js +22 -0
- package/dist/src/server/sandbox/QuickJSSandbox.d.ts +4 -1
- package/dist/src/server/sandbox/QuickJSSandbox.js +149 -0
- package/dist/src/server/sandbox/SandboxHelpers.js +250 -250
- package/dist/src/server/sandbox/types.d.ts +13 -0
- package/dist/src/server/search/AffinityGraph.d.ts +7 -1
- package/dist/src/server/search/AffinityGraph.js +24 -3
- package/dist/src/services/LLMService.js +1 -1
- package/dist/src/utils/UnifiedCacheManager.d.ts +1 -1
- package/dist/src/utils/UnifiedCacheManager.js +2 -2
- package/dist/src/utils/cliFastPath.js +18 -4
- package/package.json +5 -3
- package/scripts/postinstall.cjs +37 -37
- package/src/native/scripts/linux/enum-windows.sh +12 -12
- package/src/native/scripts/macos/enum-windows.applescript +22 -22
- package/src/native/scripts/windows/enum-windows-by-class.ps1 +51 -51
- package/src/native/scripts/windows/enum-windows.ps1 +44 -44
- 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', {
|