@jshookmcp/jshook 0.2.7 → 0.2.9
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 +36 -5
- package/README.zh.md +36 -5
- package/dist/{AntiCheatDetector-S8VRj-dD.mjs → AntiCheatDetector-BNk-EoBt.mjs} +3 -3
- package/dist/{CodeInjector-4Z3ngPoX.mjs → CodeInjector-Cq8q01kp.mjs} +5 -5
- package/dist/ConsoleMonitor-CPVQW1Y-.mjs +2201 -0
- package/dist/{DarwinAPI-B8hg_yhz.mjs → DarwinAPI-BNPxu0RH.mjs} +1 -1
- package/dist/DetailedDataManager-BQQcxh64.mjs +217 -0
- package/dist/EventBus-DgPmwpeu.mjs +141 -0
- package/dist/EvidenceGraphBridge-SFesNera.mjs +153 -0
- package/dist/{ExtensionManager-CZ6IveoV.mjs → ExtensionManager-CWYgw0YW.mjs} +13 -6
- package/dist/{FingerprintManager-BVxFJL2-.mjs → FingerprintManager-gzWtkKuf.mjs} +1 -1
- package/dist/{HardwareBreakpoint-DK1yjWkV.mjs → HardwareBreakpoint-B9gZCdFP.mjs} +3 -3
- package/dist/{HeapAnalyzer-CEbo10xU.mjs → HeapAnalyzer-BLDH0dCv.mjs} +4 -4
- package/dist/HookGeneratorBuilders.core.generators.storage-CtcdK78Q.mjs +639 -0
- package/dist/InstrumentationSession-CvPC7Jwy.mjs +244 -0
- package/dist/{MemoryController-DdtnBdD4.mjs → MemoryController-CbVdCIJF.mjs} +3 -3
- package/dist/{MemoryScanSession-RMixN3bX.mjs → MemoryScanSession-BsDZbLYm.mjs} +81 -78
- package/dist/{MemoryScanner-QjK4ld0B.mjs → MemoryScanner-Bcpml6II.mjs} +44 -18
- package/dist/{NativeMemoryManager.impl-CB6gJ0NM.mjs → NativeMemoryManager.impl-dZtA1ZGn.mjs} +14 -53
- package/dist/{NativeMemoryManager.utils-BML4q1ry.mjs → NativeMemoryManager.utils-B-FjA2mJ.mjs} +1 -1
- package/dist/{PEAnalyzer-CK0xe0Fs.mjs → PEAnalyzer-D1lzJ_VG.mjs} +2 -2
- package/dist/PageController-Bqm2kZ_X.mjs +417 -0
- package/dist/{PointerChainEngine-Cd73qu5b.mjs → PointerChainEngine-BOhyVsjx.mjs} +4 -4
- package/dist/PrerequisiteError-Dl33Svkz.mjs +20 -0
- package/dist/ResponseBuilder-D3iFYx2N.mjs +143 -0
- package/dist/ReverseEvidenceGraph-Dlsk94LC.mjs +269 -0
- package/dist/ScriptManager-aHHq0X7U.mjs +3000 -0
- package/dist/{Speedhack-CeF0XmEz.mjs → Speedhack-CqdIFlQl.mjs} +2 -2
- package/dist/{StructureAnalyzer-D4GkMduU.mjs → StructureAnalyzer-DhFaPvRO.mjs} +3 -3
- package/dist/ToolCatalog-C0JGZoOm.mjs +582 -0
- package/dist/ToolError-jh9whhMd.mjs +15 -0
- package/dist/ToolProbe-oC7aPrkv.mjs +45 -0
- package/dist/ToolRegistry-BjaF4oNz.mjs +131 -0
- package/dist/ToolRouter.policy-BWV67ZK-.mjs +304 -0
- package/dist/TraceRecorder-DgxyVbdQ.mjs +519 -0
- package/dist/{Win32API-Bc0QnQsN.mjs → Win32API-CePkipZY.mjs} +1 -1
- package/dist/{Win32Debug-DUHt9XUn.mjs → Win32Debug-BvKs-gxc.mjs} +2 -2
- package/dist/WorkflowEngine-CuvkZtWu.mjs +598 -0
- package/dist/analysis-CL9uACt9.mjs +463 -0
- package/dist/antidebug-CqDTB_uk.mjs +1081 -0
- package/dist/artifactRetention-CFEprwPw.mjs +591 -0
- package/dist/artifacts-Bk2-_uPq.mjs +59 -0
- package/dist/betterSqlite3-0pqusHHH.mjs +74 -0
- package/dist/binary-instrument-CXfpx6fT.mjs +979 -0
- package/dist/bind-helpers-xFfRF-qm.mjs +22 -0
- package/dist/boringssl-inspector-BH2D3VKc.mjs +180 -0
- package/dist/browser-BpOr5PEx.mjs +4082 -0
- package/dist/concurrency-Bt0yv1kJ.mjs +41 -0
- package/dist/{constants-CCvsN80K.mjs → constants-B0OANIBL.mjs} +88 -46
- package/dist/coordination-qUbyF8KU.mjs +259 -0
- package/dist/debugger-gnKxRSN0.mjs +1271 -0
- package/dist/definitions-6M-eejaT.mjs +53 -0
- package/dist/definitions-B18eyf0B.mjs +18 -0
- package/dist/definitions-B3QdlrHv.mjs +34 -0
- package/dist/definitions-B4rAvHNZ.mjs +63 -0
- package/dist/definitions-BB_4jnmy.mjs +37 -0
- package/dist/definitions-BMfYXoNC.mjs +43 -0
- package/dist/definitions-Beid2EB3.mjs +27 -0
- package/dist/definitions-C1UvM5Iy.mjs +126 -0
- package/dist/definitions-CXEI7QC72.mjs +216 -0
- package/dist/definitions-C_4r7Fo-2.mjs +14 -0
- package/dist/definitions-CkFDALoa.mjs +26 -0
- package/dist/definitions-Cke7zEb8.mjs +94 -0
- package/dist/definitions-ClJLzsJQ.mjs +25 -0
- package/dist/definitions-Cq-zroAU.mjs +28 -0
- package/dist/definitions-Cy3Sl6gV.mjs +34 -0
- package/dist/definitions-D3VsGcvz.mjs +47 -0
- package/dist/definitions-DVGfrn7y.mjs +96 -0
- package/dist/definitions-LKpC3-nL.mjs +9 -0
- package/dist/definitions-bAhHQJq9.mjs +359 -0
- package/dist/encoding-Bvz5jLRv.mjs +1065 -0
- package/dist/evidence-graph-bridge-C_fv9PuC.mjs +135 -0
- package/dist/{factory-CibqTNC8.mjs → factory-DxlGh9Xf.mjs} +37 -52
- package/dist/graphql-DYWzJ29s.mjs +1026 -0
- package/dist/handlers-9sAbfIg-.mjs +2552 -0
- package/dist/handlers-Bl8zkwz1.mjs +2716 -0
- package/dist/handlers-C67ktuRN.mjs +710 -0
- package/dist/handlers-C87g8oCe.mjs +276 -0
- package/dist/handlers-CTsDAO6p.mjs +681 -0
- package/dist/handlers-Cgyg6c0U.mjs +645 -0
- package/dist/handlers-D6j6yka7.mjs +2124 -0
- package/dist/handlers-DdFzXLvF.mjs +446 -0
- package/dist/handlers-DeLOCd5m.mjs +799 -0
- package/dist/handlers-DlCJN4Td.mjs +757 -0
- package/dist/handlers-DxGIq15_2.mjs +917 -0
- package/dist/handlers-U6L4xhuF.mjs +585 -0
- package/dist/handlers-tB9Mp9ZK.mjs +84 -0
- package/dist/handlers-tiy7EIBp.mjs +572 -0
- package/dist/handlers.impl-DS0d9fUw.mjs +761 -0
- package/dist/hooks-CzCWByww.mjs +898 -0
- package/dist/index.mjs +384 -155
- package/dist/{logger-BmWzC2lM.mjs → logger-Dh_xb7_2.mjs} +14 -6
- package/dist/maintenance-P7ePRXQC.mjs +830 -0
- package/dist/manifest-2ToTpjv8.mjs +106 -0
- package/dist/manifest-3g71z6Bg.mjs +79 -0
- package/dist/manifest-82baTv4U.mjs +45 -0
- package/dist/manifest-B3QVVeBS.mjs +82 -0
- package/dist/manifest-BB2J8IMJ.mjs +149 -0
- package/dist/manifest-BKbgbSiY.mjs +60 -0
- package/dist/manifest-Bcf-TJzH.mjs +848 -0
- package/dist/manifest-BmtZzQiQ2.mjs +45 -0
- package/dist/manifest-Bnd7kqEY.mjs +55 -0
- package/dist/manifest-BqQX6OQC2.mjs +65 -0
- package/dist/manifest-BqrQ4Tpj.mjs +81 -0
- package/dist/manifest-Br4RPFt5.mjs +370 -0
- package/dist/manifest-C5qDjysN.mjs +107 -0
- package/dist/manifest-C9RT5nk32.mjs +34 -0
- package/dist/manifest-CAhOuvSl.mjs +204 -0
- package/dist/manifest-CBYWCUBJ.mjs +51 -0
- package/dist/manifest-CFADCRa1.mjs +37 -0
- package/dist/manifest-CQVhavRF.mjs +114 -0
- package/dist/manifest-CT7zZBV1.mjs +48 -0
- package/dist/manifest-CV12bcrF.mjs +121 -0
- package/dist/manifest-CXsRWjjI.mjs +224 -0
- package/dist/manifest-CZLUCfG02.mjs +95 -0
- package/dist/manifest-D6phHKFd.mjs +131 -0
- package/dist/manifest-DCyjf4n2.mjs +294 -0
- package/dist/manifest-DHsnKgP6.mjs +60 -0
- package/dist/manifest-Df_dliIe.mjs +55 -0
- package/dist/manifest-Dh8WBmEW.mjs +129 -0
- package/dist/manifest-DhKRAT8_.mjs +92 -0
- package/dist/manifest-DlpTj4ic2.mjs +193 -0
- package/dist/manifest-DrbmZcFl2.mjs +253 -0
- package/dist/manifest-DuwHjUa5.mjs +70 -0
- package/dist/manifest-DzwvxPJX.mjs +38 -0
- package/dist/manifest-NXctwWQq.mjs +68 -0
- package/dist/manifest-Sc_0JQ13.mjs +418 -0
- package/dist/manifest-gZ4s_UtG.mjs +96 -0
- package/dist/manifest-qSleDqdO.mjs +1023 -0
- package/dist/modules-C184v-S9.mjs +11365 -0
- package/dist/mojo-ipc-B_H61Afw.mjs +525 -0
- package/dist/network-671Cw6hV.mjs +3346 -0
- package/dist/{artifacts-BbdOMET5.mjs → outputPaths-B1uGmrWZ.mjs} +219 -212
- package/dist/parse-args-BlRjqlkL.mjs +39 -0
- package/dist/platform-WmNn8Sxb.mjs +2070 -0
- package/dist/process-QcbIy5Zq.mjs +1401 -0
- package/dist/proxy-DqNs0bAd.mjs +170 -0
- package/dist/registry-D-6e18lB.mjs +34 -0
- package/dist/response-BQVP-xUn.mjs +28 -0
- package/dist/server/plugin-api.mjs +2 -2
- package/dist/shared-state-board-DV-dpHFJ.mjs +586 -0
- package/dist/sourcemap-Dq8ez8vS.mjs +650 -0
- package/dist/ssrf-policy-ZaUfvhq7.mjs +166 -0
- package/dist/streaming-BUQ0VJsg.mjs +725 -0
- package/dist/tool-builder-DCbIC5Eo.mjs +186 -0
- package/dist/transform-CiYJfNX0.mjs +1007 -0
- package/dist/types-Bx92KJfT.mjs +4 -0
- package/dist/wasm-DQTnHDs4.mjs +531 -0
- package/dist/workflow-f3xJOcjx.mjs +725 -0
- package/package.json +48 -78
- package/dist/ExtensionManager-DqUSOamB.mjs +0 -2
- package/dist/ToolCatalog-CnwmMIw3.mjs +0 -61483
- package/dist/{CacheAdapters-CzFNpD9a.mjs → CacheAdapters-CDe5WPSV.mjs} +0 -0
- package/dist/{StealthVerifier-BzBCFiwx.mjs → StealthVerifier-Bo4T3bz8.mjs} +0 -0
- package/dist/{VersionDetector-CNXcvD46.mjs → VersionDetector-CwVLVdDM.mjs} +0 -0
- package/dist/{formatAddress-ChCSIRWT.mjs → formatAddress-DVkj9kpI.mjs} +0 -0
- package/dist/{types-BBjOqye-.mjs → types-CPhOReNX.mjs} +1 -1
|
@@ -0,0 +1,1081 @@
|
|
|
1
|
+
import { o as argStringArray, r as argNumber, t as argBool } from "./parse-args-BlRjqlkL.mjs";
|
|
2
|
+
import { o as evaluateOnNewDocumentWithTimeout, s as evaluateWithTimeout } from "./PageController-Bqm2kZ_X.mjs";
|
|
3
|
+
import "./definitions-B18eyf0B.mjs";
|
|
4
|
+
//#region src/server/domains/antidebug/scripts.data.bypass-core.ts
|
|
5
|
+
const ANTI_DEBUG_BYPASS_CORE_SCRIPTS = {
|
|
6
|
+
bypassDebuggerStatement: `(function () {
|
|
7
|
+
var globalObj = typeof window !== 'undefined' ? window : globalThis;
|
|
8
|
+
var installFlag = '__ANTI_DEBUGGER_STATEMENT_INSTALLED__';
|
|
9
|
+
if (Object.prototype.hasOwnProperty.call(globalObj, installFlag)) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
Object.defineProperty(globalObj, installFlag, {
|
|
15
|
+
value: true,
|
|
16
|
+
enumerable: false,
|
|
17
|
+
configurable: false,
|
|
18
|
+
writable: false
|
|
19
|
+
});
|
|
20
|
+
} catch (_) {
|
|
21
|
+
globalObj[installFlag] = true;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
var mode = __ANTI_DEBUG_MODE__;
|
|
25
|
+
var NativeFunction = Function;
|
|
26
|
+
|
|
27
|
+
function sanitizeSource(source) {
|
|
28
|
+
if (typeof source !== 'string') {
|
|
29
|
+
return source;
|
|
30
|
+
}
|
|
31
|
+
if (!/\\bdebugger\\b/.test(source)) {
|
|
32
|
+
return source;
|
|
33
|
+
}
|
|
34
|
+
if (mode === 'remove') {
|
|
35
|
+
return source.replace(/\\bdebugger\\b\\s*;?/g, '');
|
|
36
|
+
}
|
|
37
|
+
return source.replace(/\\bdebugger\\b\\s*;?/g, 'void 0;');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
var PatchedFunction = new Proxy(NativeFunction, {
|
|
41
|
+
apply: function (target, thisArg, argArray) {
|
|
42
|
+
if (Array.isArray(argArray) && argArray.length > 0) {
|
|
43
|
+
var nextArgs = argArray.slice();
|
|
44
|
+
var lastIndex = nextArgs.length - 1;
|
|
45
|
+
nextArgs[lastIndex] = sanitizeSource(nextArgs[lastIndex]);
|
|
46
|
+
return Reflect.apply(target, thisArg, nextArgs);
|
|
47
|
+
}
|
|
48
|
+
return Reflect.apply(target, thisArg, argArray);
|
|
49
|
+
},
|
|
50
|
+
construct: function (target, argArray, newTarget) {
|
|
51
|
+
if (Array.isArray(argArray) && argArray.length > 0) {
|
|
52
|
+
var nextArgs = argArray.slice();
|
|
53
|
+
var lastIndex = nextArgs.length - 1;
|
|
54
|
+
nextArgs[lastIndex] = sanitizeSource(nextArgs[lastIndex]);
|
|
55
|
+
return Reflect.construct(target, nextArgs, newTarget);
|
|
56
|
+
}
|
|
57
|
+
return Reflect.construct(target, argArray, newTarget);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
Object.defineProperty(PatchedFunction, 'toString', {
|
|
63
|
+
value: function () {
|
|
64
|
+
return 'function Function() { [native code] }';
|
|
65
|
+
},
|
|
66
|
+
enumerable: false,
|
|
67
|
+
configurable: false,
|
|
68
|
+
writable: false
|
|
69
|
+
});
|
|
70
|
+
} catch (_) {}
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
Object.defineProperty(Function.prototype, 'constructor', {
|
|
74
|
+
value: PatchedFunction,
|
|
75
|
+
enumerable: false,
|
|
76
|
+
configurable: false,
|
|
77
|
+
writable: false
|
|
78
|
+
});
|
|
79
|
+
} catch (_) {}
|
|
80
|
+
|
|
81
|
+
function patchScriptElement(scriptEl) {
|
|
82
|
+
if (!scriptEl || scriptEl.tagName !== 'SCRIPT') {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (scriptEl.src) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
var code = scriptEl.textContent || '';
|
|
91
|
+
if (!/\\bdebugger\\b/.test(code)) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (mode === 'remove') {
|
|
96
|
+
try {
|
|
97
|
+
scriptEl.remove();
|
|
98
|
+
} catch (_) {}
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
try {
|
|
103
|
+
scriptEl.textContent = sanitizeSource(code);
|
|
104
|
+
} catch (_) {}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function visitNode(node) {
|
|
108
|
+
if (!node || node.nodeType !== 1) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
var element = node;
|
|
113
|
+
if (element.tagName === 'SCRIPT') {
|
|
114
|
+
patchScriptElement(element);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (typeof element.querySelectorAll === 'function') {
|
|
118
|
+
var nestedScripts = element.querySelectorAll('script');
|
|
119
|
+
for (var i = 0; i < nestedScripts.length; i += 1) {
|
|
120
|
+
patchScriptElement(nestedScripts[i]);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
var observer = new MutationObserver(function (mutations) {
|
|
126
|
+
for (var i = 0; i < mutations.length; i += 1) {
|
|
127
|
+
var mutation = mutations[i];
|
|
128
|
+
if (!mutation.addedNodes) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
for (var j = 0; j < mutation.addedNodes.length; j += 1) {
|
|
132
|
+
visitNode(mutation.addedNodes[j]);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
function startObserving() {
|
|
138
|
+
try {
|
|
139
|
+
if (document.documentElement) {
|
|
140
|
+
observer.observe(document.documentElement, {
|
|
141
|
+
childList: true,
|
|
142
|
+
subtree: true
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
} catch (_) {}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (document.documentElement) {
|
|
149
|
+
startObserving();
|
|
150
|
+
} else {
|
|
151
|
+
document.addEventListener('DOMContentLoaded', startObserving, { once: true });
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
var existingScripts = document.querySelectorAll('script');
|
|
155
|
+
for (var i = 0; i < existingScripts.length; i += 1) {
|
|
156
|
+
patchScriptElement(existingScripts[i]);
|
|
157
|
+
}
|
|
158
|
+
})();`,
|
|
159
|
+
bypassTiming: `(function () {
|
|
160
|
+
var globalObj = typeof window !== 'undefined' ? window : globalThis;
|
|
161
|
+
var installFlag = '__ANTI_DEBUG_TIMING_INSTALLED__';
|
|
162
|
+
if (Object.prototype.hasOwnProperty.call(globalObj, installFlag)) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
try {
|
|
167
|
+
Object.defineProperty(globalObj, installFlag, {
|
|
168
|
+
value: true,
|
|
169
|
+
enumerable: false,
|
|
170
|
+
configurable: false,
|
|
171
|
+
writable: false
|
|
172
|
+
});
|
|
173
|
+
} catch (_) {
|
|
174
|
+
globalObj[installFlag] = true;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
var maxDrift = __ANTI_DEBUG_MAX_DRIFT__;
|
|
178
|
+
if (typeof maxDrift !== 'number' || !isFinite(maxDrift) || maxDrift < 0) {
|
|
179
|
+
maxDrift = 50;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
var perfNow = typeof performance !== 'undefined' && performance && typeof performance.now === 'function'
|
|
183
|
+
? performance.now.bind(performance)
|
|
184
|
+
: function () { return Date.now(); };
|
|
185
|
+
|
|
186
|
+
var dateNow = Date.now.bind(Date);
|
|
187
|
+
|
|
188
|
+
var lastPerfReal = perfNow();
|
|
189
|
+
var logicalPerf = lastPerfReal;
|
|
190
|
+
|
|
191
|
+
var lastDateReal = dateNow();
|
|
192
|
+
var logicalDate = lastDateReal;
|
|
193
|
+
|
|
194
|
+
function stepLogicalTime(currentReal, lastRealRef, logicalRef) {
|
|
195
|
+
var delta = currentReal - lastRealRef.value;
|
|
196
|
+
if (!isFinite(delta) || delta < 0) {
|
|
197
|
+
delta = 0;
|
|
198
|
+
}
|
|
199
|
+
if (delta > maxDrift) {
|
|
200
|
+
delta = maxDrift;
|
|
201
|
+
}
|
|
202
|
+
logicalRef.value += delta;
|
|
203
|
+
lastRealRef.value = currentReal;
|
|
204
|
+
return logicalRef.value;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
var perfLastRef = { value: lastPerfReal };
|
|
208
|
+
var perfLogicalRef = { value: logicalPerf };
|
|
209
|
+
var dateLastRef = { value: lastDateReal };
|
|
210
|
+
var dateLogicalRef = { value: logicalDate };
|
|
211
|
+
|
|
212
|
+
var wrappedPerformanceNow = function () {
|
|
213
|
+
return stepLogicalTime(perfNow(), perfLastRef, perfLogicalRef);
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
var wrappedDateNow = function () {
|
|
217
|
+
return Math.floor(stepLogicalTime(dateNow(), dateLastRef, dateLogicalRef));
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
try {
|
|
221
|
+
Object.defineProperty(performance, 'now', {
|
|
222
|
+
value: wrappedPerformanceNow,
|
|
223
|
+
enumerable: false,
|
|
224
|
+
configurable: false,
|
|
225
|
+
writable: false
|
|
226
|
+
});
|
|
227
|
+
} catch (_) {
|
|
228
|
+
try {
|
|
229
|
+
performance.now = wrappedPerformanceNow;
|
|
230
|
+
} catch (_) {}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
try {
|
|
234
|
+
Object.defineProperty(Date, 'now', {
|
|
235
|
+
value: wrappedDateNow,
|
|
236
|
+
enumerable: false,
|
|
237
|
+
configurable: false,
|
|
238
|
+
writable: false
|
|
239
|
+
});
|
|
240
|
+
} catch (_) {
|
|
241
|
+
try {
|
|
242
|
+
Date.now = wrappedDateNow;
|
|
243
|
+
} catch (_) {}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
var labels = Object.create(null);
|
|
247
|
+
var nativeConsoleLog = typeof console !== 'undefined' && console && typeof console.log === 'function'
|
|
248
|
+
? console.log.bind(console)
|
|
249
|
+
: function () {};
|
|
250
|
+
|
|
251
|
+
var wrappedTime = function (label) {
|
|
252
|
+
var key = String(label == null ? 'default' : label);
|
|
253
|
+
labels[key] = wrappedPerformanceNow();
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
var wrappedTimeEnd = function (label) {
|
|
257
|
+
var key = String(label == null ? 'default' : label);
|
|
258
|
+
var nowValue = wrappedPerformanceNow();
|
|
259
|
+
var startValue = labels[key];
|
|
260
|
+
if (typeof startValue !== 'number') {
|
|
261
|
+
nativeConsoleLog(key + ': 0.000ms');
|
|
262
|
+
return 0;
|
|
263
|
+
}
|
|
264
|
+
var duration = Math.max(0, nowValue - startValue);
|
|
265
|
+
delete labels[key];
|
|
266
|
+
nativeConsoleLog(key + ': ' + duration.toFixed(3) + 'ms');
|
|
267
|
+
return duration;
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
try {
|
|
271
|
+
Object.defineProperty(console, 'time', {
|
|
272
|
+
value: wrappedTime,
|
|
273
|
+
enumerable: false,
|
|
274
|
+
configurable: false,
|
|
275
|
+
writable: false
|
|
276
|
+
});
|
|
277
|
+
} catch (_) {
|
|
278
|
+
try {
|
|
279
|
+
console.time = wrappedTime;
|
|
280
|
+
} catch (_) {}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
try {
|
|
284
|
+
Object.defineProperty(console, 'timeEnd', {
|
|
285
|
+
value: wrappedTimeEnd,
|
|
286
|
+
enumerable: false,
|
|
287
|
+
configurable: false,
|
|
288
|
+
writable: false
|
|
289
|
+
});
|
|
290
|
+
} catch (_) {
|
|
291
|
+
try {
|
|
292
|
+
console.timeEnd = wrappedTimeEnd;
|
|
293
|
+
} catch (_) {}
|
|
294
|
+
}
|
|
295
|
+
})();`,
|
|
296
|
+
bypassStackTrace: `(function () {
|
|
297
|
+
var globalObj = typeof window !== 'undefined' ? window : globalThis;
|
|
298
|
+
var installFlag = '__ANTI_DEBUG_STACK_TRACE_INSTALLED__';
|
|
299
|
+
if (Object.prototype.hasOwnProperty.call(globalObj, installFlag)) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
try {
|
|
304
|
+
Object.defineProperty(globalObj, installFlag, {
|
|
305
|
+
value: true,
|
|
306
|
+
enumerable: false,
|
|
307
|
+
configurable: false,
|
|
308
|
+
writable: false
|
|
309
|
+
});
|
|
310
|
+
} catch (_) {
|
|
311
|
+
globalObj[installFlag] = true;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
var configuredPatterns = __ANTI_DEBUG_FILTER_PATTERNS__;
|
|
315
|
+
if (!Array.isArray(configuredPatterns)) {
|
|
316
|
+
configuredPatterns = ['puppeteer', 'devtools', '__puppeteer', 'cdp'];
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
var normalizedPatterns = configuredPatterns
|
|
320
|
+
.map(function (item) {
|
|
321
|
+
return String(item).toLowerCase().trim();
|
|
322
|
+
})
|
|
323
|
+
.filter(function (item) {
|
|
324
|
+
return item.length > 0;
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
function sanitizeStack(stackText) {
|
|
328
|
+
if (typeof stackText !== 'string' || stackText.length === 0) {
|
|
329
|
+
return stackText;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
var lines = stackText.split('\\n');
|
|
333
|
+
var filtered = [];
|
|
334
|
+
for (var i = 0; i < lines.length; i += 1) {
|
|
335
|
+
var line = lines[i];
|
|
336
|
+
var lowerLine = line.toLowerCase();
|
|
337
|
+
var blocked = false;
|
|
338
|
+
for (var j = 0; j < normalizedPatterns.length; j += 1) {
|
|
339
|
+
if (lowerLine.indexOf(normalizedPatterns[j]) !== -1) {
|
|
340
|
+
blocked = true;
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
if (!blocked) {
|
|
345
|
+
filtered.push(line);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
return filtered.join('\\n');
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
var sourceMapKey = '__ANTI_NATIVE_SOURCE_MAP__';
|
|
353
|
+
var toStringFlag = '__ANTI_TOSTRING_PATCHED__';
|
|
354
|
+
var nativeSourceMap = globalObj[sourceMapKey];
|
|
355
|
+
|
|
356
|
+
if (!(nativeSourceMap instanceof WeakMap)) {
|
|
357
|
+
nativeSourceMap = new WeakMap();
|
|
358
|
+
try {
|
|
359
|
+
Object.defineProperty(globalObj, sourceMapKey, {
|
|
360
|
+
value: nativeSourceMap,
|
|
361
|
+
enumerable: false,
|
|
362
|
+
configurable: false,
|
|
363
|
+
writable: false
|
|
364
|
+
});
|
|
365
|
+
} catch (_) {
|
|
366
|
+
globalObj[sourceMapKey] = nativeSourceMap;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
if (!globalObj[toStringFlag]) {
|
|
371
|
+
var nativeToString = Function.prototype.toString;
|
|
372
|
+
var patchedToString = function () {
|
|
373
|
+
if (nativeSourceMap && nativeSourceMap.has(this)) {
|
|
374
|
+
return nativeSourceMap.get(this);
|
|
375
|
+
}
|
|
376
|
+
return nativeToString.call(this);
|
|
377
|
+
};
|
|
378
|
+
|
|
379
|
+
try {
|
|
380
|
+
Object.defineProperty(Function.prototype, 'toString', {
|
|
381
|
+
value: patchedToString,
|
|
382
|
+
enumerable: false,
|
|
383
|
+
configurable: false,
|
|
384
|
+
writable: false
|
|
385
|
+
});
|
|
386
|
+
Object.defineProperty(globalObj, toStringFlag, {
|
|
387
|
+
value: true,
|
|
388
|
+
enumerable: false,
|
|
389
|
+
configurable: false,
|
|
390
|
+
writable: false
|
|
391
|
+
});
|
|
392
|
+
} catch (_) {
|
|
393
|
+
globalObj[toStringFlag] = true;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
function markAsNative(fn, name) {
|
|
398
|
+
if (!(nativeSourceMap instanceof WeakMap) || typeof fn !== 'function') {
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
var fnName = String(name || fn.name || 'anonymous').replace(/[^a-zA-Z0-9_$]/g, '');
|
|
402
|
+
nativeSourceMap.set(fn, 'function ' + fnName + '() { [native code] }');
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
function sanitizeError(error) {
|
|
406
|
+
if (!error || typeof error !== 'object') {
|
|
407
|
+
return error;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
try {
|
|
411
|
+
if (typeof error.stack === 'string') {
|
|
412
|
+
Object.defineProperty(error, 'stack', {
|
|
413
|
+
value: sanitizeStack(error.stack),
|
|
414
|
+
enumerable: false,
|
|
415
|
+
configurable: true,
|
|
416
|
+
writable: true
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
} catch (_) {}
|
|
420
|
+
|
|
421
|
+
return error;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
var NativeError = Error;
|
|
425
|
+
var PatchedError = function () {
|
|
426
|
+
var args = Array.prototype.slice.call(arguments);
|
|
427
|
+
var err = Reflect.construct(NativeError, args, PatchedError);
|
|
428
|
+
return sanitizeError(err);
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
PatchedError.prototype = NativeError.prototype;
|
|
432
|
+
try {
|
|
433
|
+
Object.setPrototypeOf(PatchedError, NativeError);
|
|
434
|
+
} catch (_) {}
|
|
435
|
+
|
|
436
|
+
if (typeof NativeError.captureStackTrace === 'function') {
|
|
437
|
+
var nativeCapture = NativeError.captureStackTrace.bind(NativeError);
|
|
438
|
+
var patchedCapture = function (target, constructorOpt) {
|
|
439
|
+
nativeCapture(target, constructorOpt);
|
|
440
|
+
sanitizeError(target);
|
|
441
|
+
};
|
|
442
|
+
|
|
443
|
+
try {
|
|
444
|
+
Object.defineProperty(PatchedError, 'captureStackTrace', {
|
|
445
|
+
value: patchedCapture,
|
|
446
|
+
enumerable: false,
|
|
447
|
+
configurable: false,
|
|
448
|
+
writable: false
|
|
449
|
+
});
|
|
450
|
+
markAsNative(patchedCapture, 'captureStackTrace');
|
|
451
|
+
} catch (_) {}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
var stackDescriptor = Object.getOwnPropertyDescriptor(NativeError.prototype, 'stack');
|
|
455
|
+
if (stackDescriptor && typeof stackDescriptor.get === 'function') {
|
|
456
|
+
var nativeStackGetter = stackDescriptor.get;
|
|
457
|
+
var nativeStackSetter = stackDescriptor.set;
|
|
458
|
+
|
|
459
|
+
try {
|
|
460
|
+
Object.defineProperty(NativeError.prototype, 'stack', {
|
|
461
|
+
get: function () {
|
|
462
|
+
return sanitizeStack(nativeStackGetter.call(this));
|
|
463
|
+
},
|
|
464
|
+
set: function (value) {
|
|
465
|
+
if (typeof nativeStackSetter === 'function') {
|
|
466
|
+
nativeStackSetter.call(this, value);
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
Object.defineProperty(this, 'stack', {
|
|
470
|
+
value: value,
|
|
471
|
+
enumerable: false,
|
|
472
|
+
configurable: true,
|
|
473
|
+
writable: true
|
|
474
|
+
});
|
|
475
|
+
},
|
|
476
|
+
enumerable: false,
|
|
477
|
+
configurable: stackDescriptor.configurable === true
|
|
478
|
+
});
|
|
479
|
+
} catch (_) {}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
markAsNative(PatchedError, 'Error');
|
|
483
|
+
|
|
484
|
+
try {
|
|
485
|
+
Object.defineProperty(globalObj, 'Error', {
|
|
486
|
+
value: PatchedError,
|
|
487
|
+
enumerable: false,
|
|
488
|
+
configurable: false,
|
|
489
|
+
writable: false
|
|
490
|
+
});
|
|
491
|
+
} catch (_) {
|
|
492
|
+
try {
|
|
493
|
+
globalObj.Error = PatchedError;
|
|
494
|
+
} catch (_) {}
|
|
495
|
+
}
|
|
496
|
+
})();`
|
|
497
|
+
};
|
|
498
|
+
//#endregion
|
|
499
|
+
//#region src/server/domains/antidebug/scripts.data.bypass-console.ts
|
|
500
|
+
const ANTI_DEBUG_BYPASS_CONSOLE_SCRIPT = { bypassConsoleDetect: `(function () {
|
|
501
|
+
var globalObj = typeof window !== 'undefined' ? window : globalThis;
|
|
502
|
+
var installFlag = '__ANTI_DEBUG_CONSOLE_INSTALLED__';
|
|
503
|
+
if (Object.prototype.hasOwnProperty.call(globalObj, installFlag)) {
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
try {
|
|
508
|
+
Object.defineProperty(globalObj, installFlag, {
|
|
509
|
+
value: true,
|
|
510
|
+
enumerable: false,
|
|
511
|
+
configurable: false,
|
|
512
|
+
writable: false
|
|
513
|
+
});
|
|
514
|
+
} catch (_) {
|
|
515
|
+
globalObj[installFlag] = true;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
var sourceMapKey = '__ANTI_NATIVE_SOURCE_MAP__';
|
|
519
|
+
var toStringFlag = '__ANTI_TOSTRING_PATCHED__';
|
|
520
|
+
var nativeSourceMap = globalObj[sourceMapKey];
|
|
521
|
+
|
|
522
|
+
if (!(nativeSourceMap instanceof WeakMap)) {
|
|
523
|
+
nativeSourceMap = new WeakMap();
|
|
524
|
+
try {
|
|
525
|
+
Object.defineProperty(globalObj, sourceMapKey, {
|
|
526
|
+
value: nativeSourceMap,
|
|
527
|
+
enumerable: false,
|
|
528
|
+
configurable: false,
|
|
529
|
+
writable: false
|
|
530
|
+
});
|
|
531
|
+
} catch (_) {
|
|
532
|
+
globalObj[sourceMapKey] = nativeSourceMap;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
if (!globalObj[toStringFlag]) {
|
|
537
|
+
var nativeToString = Function.prototype.toString;
|
|
538
|
+
var patchedToString = function () {
|
|
539
|
+
if (nativeSourceMap && nativeSourceMap.has(this)) {
|
|
540
|
+
return nativeSourceMap.get(this);
|
|
541
|
+
}
|
|
542
|
+
return nativeToString.call(this);
|
|
543
|
+
};
|
|
544
|
+
|
|
545
|
+
try {
|
|
546
|
+
Object.defineProperty(Function.prototype, 'toString', {
|
|
547
|
+
value: patchedToString,
|
|
548
|
+
enumerable: false,
|
|
549
|
+
configurable: false,
|
|
550
|
+
writable: false
|
|
551
|
+
});
|
|
552
|
+
Object.defineProperty(globalObj, toStringFlag, {
|
|
553
|
+
value: true,
|
|
554
|
+
enumerable: false,
|
|
555
|
+
configurable: false,
|
|
556
|
+
writable: false
|
|
557
|
+
});
|
|
558
|
+
} catch (_) {
|
|
559
|
+
globalObj[toStringFlag] = true;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
function markAsNative(fn, name) {
|
|
564
|
+
if (!(nativeSourceMap instanceof WeakMap) || typeof fn !== 'function') {
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
var fnName = String(name || fn.name || 'anonymous').replace(/[^a-zA-Z0-9_$]/g, '');
|
|
568
|
+
nativeSourceMap.set(fn, 'function ' + fnName + '() { [native code] }');
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
function sanitizeArg(value, depth, seen) {
|
|
572
|
+
if (depth > 3) {
|
|
573
|
+
return '[MaxDepth]';
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
var valueType = typeof value;
|
|
577
|
+
if (value == null || valueType === 'string' || valueType === 'number' || valueType === 'boolean' || valueType === 'bigint') {
|
|
578
|
+
return value;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
if (valueType === 'symbol') {
|
|
582
|
+
return value.toString();
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
if (valueType === 'function') {
|
|
586
|
+
return '[Function ' + (value.name || 'anonymous') + ']';
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
if (valueType !== 'object') {
|
|
590
|
+
return String(value);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
if (!(seen instanceof WeakSet)) {
|
|
594
|
+
seen = new WeakSet();
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
if (seen.has(value)) {
|
|
598
|
+
return '[Circular]';
|
|
599
|
+
}
|
|
600
|
+
seen.add(value);
|
|
601
|
+
|
|
602
|
+
if (Array.isArray(value)) {
|
|
603
|
+
var outArray = [];
|
|
604
|
+
for (var i = 0; i < value.length; i += 1) {
|
|
605
|
+
outArray.push(sanitizeArg(value[i], depth + 1, seen));
|
|
606
|
+
}
|
|
607
|
+
return outArray;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
var outObject = {};
|
|
611
|
+
var descriptors = {};
|
|
612
|
+
try {
|
|
613
|
+
descriptors = Object.getOwnPropertyDescriptors(value);
|
|
614
|
+
} catch (_) {
|
|
615
|
+
return '[Uninspectable Object]';
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
var keys = Object.keys(descriptors);
|
|
619
|
+
for (var j = 0; j < keys.length; j += 1) {
|
|
620
|
+
var key = keys[j];
|
|
621
|
+
var descriptor = descriptors[key];
|
|
622
|
+
if (!descriptor) {
|
|
623
|
+
continue;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
if (typeof descriptor.get === 'function' && !Object.prototype.hasOwnProperty.call(descriptor, 'value')) {
|
|
627
|
+
outObject[key] = '[Getter]';
|
|
628
|
+
continue;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
if (Object.prototype.hasOwnProperty.call(descriptor, 'value')) {
|
|
632
|
+
outObject[key] = sanitizeArg(descriptor.value, depth + 1, seen);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
return outObject;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
function wrapConsoleMethod(methodName, nativeMethod) {
|
|
640
|
+
var wrapped = function () {
|
|
641
|
+
if (methodName === 'clear') {
|
|
642
|
+
return undefined;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
var rawArgs = Array.prototype.slice.call(arguments);
|
|
646
|
+
var safeArgs = [];
|
|
647
|
+
for (var i = 0; i < rawArgs.length; i += 1) {
|
|
648
|
+
safeArgs.push(sanitizeArg(rawArgs[i], 0, new WeakSet()));
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
try {
|
|
652
|
+
nativeMethod.apply(console, safeArgs);
|
|
653
|
+
} catch (_) {}
|
|
654
|
+
|
|
655
|
+
return undefined;
|
|
656
|
+
};
|
|
657
|
+
|
|
658
|
+
markAsNative(wrapped, methodName);
|
|
659
|
+
return wrapped;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
var methods = ['log', 'debug', 'info', 'warn', 'error', 'table', 'dir', 'trace', 'clear'];
|
|
663
|
+
for (var idx = 0; idx < methods.length; idx += 1) {
|
|
664
|
+
var methodName = methods[idx];
|
|
665
|
+
var nativeMethod = console && console[methodName];
|
|
666
|
+
if (typeof nativeMethod !== 'function') {
|
|
667
|
+
continue;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
var wrappedMethod = wrapConsoleMethod(methodName, nativeMethod);
|
|
671
|
+
|
|
672
|
+
try {
|
|
673
|
+
Object.defineProperty(console, methodName, {
|
|
674
|
+
value: wrappedMethod,
|
|
675
|
+
enumerable: false,
|
|
676
|
+
configurable: false,
|
|
677
|
+
writable: false
|
|
678
|
+
});
|
|
679
|
+
} catch (_) {
|
|
680
|
+
try {
|
|
681
|
+
console[methodName] = wrappedMethod;
|
|
682
|
+
} catch (_) {}
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
})();` };
|
|
686
|
+
//#endregion
|
|
687
|
+
//#region src/server/domains/antidebug/scripts.data.detect.ts
|
|
688
|
+
const ANTI_DEBUG_DETECT_SCRIPTS = { detectProtections: `(async function () {
|
|
689
|
+
function pushUnique(list, value) {
|
|
690
|
+
if (list.indexOf(value) === -1) {
|
|
691
|
+
list.push(value);
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
var findings = [];
|
|
696
|
+
var recommendations = [];
|
|
697
|
+
|
|
698
|
+
function addFinding(type, severity, evidence, strategy) {
|
|
699
|
+
findings.push({
|
|
700
|
+
type: type,
|
|
701
|
+
severity: severity,
|
|
702
|
+
evidence: evidence,
|
|
703
|
+
recommendedBypass: strategy
|
|
704
|
+
});
|
|
705
|
+
pushUnique(recommendations, strategy);
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
var inlineScripts = [];
|
|
709
|
+
try {
|
|
710
|
+
var scriptNodes = document.querySelectorAll('script');
|
|
711
|
+
for (var i = 0; i < scriptNodes.length; i += 1) {
|
|
712
|
+
var node = scriptNodes[i];
|
|
713
|
+
if (!node.src && typeof node.textContent === 'string' && node.textContent.trim().length > 0) {
|
|
714
|
+
inlineScripts.push(node.textContent.slice(0, 200000));
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
} catch (_) {}
|
|
718
|
+
|
|
719
|
+
var externalScripts = [];
|
|
720
|
+
try {
|
|
721
|
+
var externalCount = 0;
|
|
722
|
+
var allScriptNodes = document.querySelectorAll('script[src]');
|
|
723
|
+
for (var j = 0; j < allScriptNodes.length; j += 1) {
|
|
724
|
+
if (externalCount >= 8) {
|
|
725
|
+
break;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
var scriptSrc = allScriptNodes[j].src;
|
|
729
|
+
if (!scriptSrc) {
|
|
730
|
+
continue;
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
try {
|
|
734
|
+
var absoluteUrl = new URL(scriptSrc, location.href);
|
|
735
|
+
if (absoluteUrl.origin !== location.origin) {
|
|
736
|
+
continue;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
var response = await fetch(absoluteUrl.href, { credentials: 'same-origin' });
|
|
740
|
+
if (!response.ok) {
|
|
741
|
+
continue;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
var text = await response.text();
|
|
745
|
+
externalScripts.push(text.slice(0, 200000));
|
|
746
|
+
externalCount += 1;
|
|
747
|
+
} catch (_) {}
|
|
748
|
+
}
|
|
749
|
+
} catch (_) {}
|
|
750
|
+
|
|
751
|
+
var sourceBlob = (inlineScripts.join('\\n') + '\\n' + externalScripts.join('\\n')).toLowerCase();
|
|
752
|
+
|
|
753
|
+
var debuggerTimerPattern = /(setinterval|settimeout)[\\s\\S]{0,180}debugger|debugger\\s*;/i;
|
|
754
|
+
if (debuggerTimerPattern.test(sourceBlob)) {
|
|
755
|
+
addFinding(
|
|
756
|
+
'debugger_statement',
|
|
757
|
+
'high',
|
|
758
|
+
'Found debugger statements or timer-driven debugger triggers in script sources.',
|
|
759
|
+
'antidebug_bypass_debugger_statement'
|
|
760
|
+
);
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
var timingPattern = /(performance\\.now\\s*\\(|date\\.now\\s*\\()[\\s\\S]{0,120}(>|>=|<|<=|===|!==)[\\s\\S]{0,60}(50|100|200|500|1000)/i;
|
|
764
|
+
if (timingPattern.test(sourceBlob)) {
|
|
765
|
+
addFinding(
|
|
766
|
+
'timing_check',
|
|
767
|
+
'high',
|
|
768
|
+
'Found timing delta logic around performance.now()/Date.now().',
|
|
769
|
+
'antidebug_bypass_timing'
|
|
770
|
+
);
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
var stackPattern = /(new\\s+error\\s*\\(|error\\s*\\(|\\.stack\\b|preparestacktrace)/i;
|
|
774
|
+
if (stackPattern.test(sourceBlob)) {
|
|
775
|
+
addFinding(
|
|
776
|
+
'stack_trace_check',
|
|
777
|
+
'medium',
|
|
778
|
+
'Found Error.stack or stack trace analysis patterns.',
|
|
779
|
+
'antidebug_bypass_stack_trace'
|
|
780
|
+
);
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
var consolePattern = /(console\\.(log|clear|table|debug|dir|trace)\\s*\\(|console\\s*=|Object\\.defineProperty\\s*\\(\\s*console)/i;
|
|
784
|
+
if (consolePattern.test(sourceBlob)) {
|
|
785
|
+
addFinding(
|
|
786
|
+
'console_detect',
|
|
787
|
+
'medium',
|
|
788
|
+
'Found console instrumentation or console-based detection patterns.',
|
|
789
|
+
'antidebug_bypass_console_detect'
|
|
790
|
+
);
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
var devtoolsSizePattern = /(outerheight\\s*-\\s*innerheight|outerwidth\\s*-\\s*innerwidth|innerheight\\s*<\\s*outerheight|innerwidth\\s*<\\s*outerwidth)/i;
|
|
794
|
+
if (devtoolsSizePattern.test(sourceBlob)) {
|
|
795
|
+
addFinding(
|
|
796
|
+
'devtools_window_check',
|
|
797
|
+
'low',
|
|
798
|
+
'Found outer/inner window dimension comparison likely used for devtools panel detection.',
|
|
799
|
+
'antidebug_bypass_all'
|
|
800
|
+
);
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
var overwrittenConsoleMethods = [];
|
|
804
|
+
var nativeCodePattern = /\\{\\s*\\[native code\\]\\s*\\}/i;
|
|
805
|
+
var runtimeMethods = ['log', 'debug', 'info', 'warn', 'error', 'table', 'clear'];
|
|
806
|
+
for (var k = 0; k < runtimeMethods.length; k += 1) {
|
|
807
|
+
var methodName = runtimeMethods[k];
|
|
808
|
+
try {
|
|
809
|
+
var candidate = console[methodName];
|
|
810
|
+
if (typeof candidate !== 'function') {
|
|
811
|
+
overwrittenConsoleMethods.push(methodName + ':non-function');
|
|
812
|
+
continue;
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
var fnSource = Function.prototype.toString.call(candidate);
|
|
816
|
+
if (!nativeCodePattern.test(fnSource)) {
|
|
817
|
+
overwrittenConsoleMethods.push(methodName);
|
|
818
|
+
}
|
|
819
|
+
} catch (_) {}
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
if (overwrittenConsoleMethods.length > 0) {
|
|
823
|
+
addFinding(
|
|
824
|
+
'console_runtime_overwrite',
|
|
825
|
+
'medium',
|
|
826
|
+
'Runtime console methods appear wrapped/overwritten: ' + overwrittenConsoleMethods.join(', '),
|
|
827
|
+
'antidebug_bypass_console_detect'
|
|
828
|
+
);
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
return {
|
|
832
|
+
success: true,
|
|
833
|
+
detected: findings.length > 0,
|
|
834
|
+
count: findings.length,
|
|
835
|
+
protections: findings,
|
|
836
|
+
recommendations: recommendations,
|
|
837
|
+
evidence: {
|
|
838
|
+
scannedInlineScripts: inlineScripts.length,
|
|
839
|
+
scannedExternalScripts: externalScripts.length,
|
|
840
|
+
sourceBytesApprox: sourceBlob.length
|
|
841
|
+
}
|
|
842
|
+
};
|
|
843
|
+
})();` };
|
|
844
|
+
//#endregion
|
|
845
|
+
//#region src/server/domains/antidebug/scripts.data.ts
|
|
846
|
+
const ANTI_DEBUG_SCRIPTS = {
|
|
847
|
+
...ANTI_DEBUG_BYPASS_CORE_SCRIPTS,
|
|
848
|
+
...ANTI_DEBUG_BYPASS_CONSOLE_SCRIPT,
|
|
849
|
+
...ANTI_DEBUG_DETECT_SCRIPTS
|
|
850
|
+
};
|
|
851
|
+
//#endregion
|
|
852
|
+
//#region src/server/domains/antidebug/handlers.ts
|
|
853
|
+
var AntiDebugToolHandlers = class AntiDebugToolHandlers {
|
|
854
|
+
static DEFAULT_DEBUGGER_MODE = "remove";
|
|
855
|
+
static DEFAULT_MAX_DRIFT = 50;
|
|
856
|
+
static DEFAULT_STACK_FILTER_PATTERNS = [
|
|
857
|
+
"puppeteer",
|
|
858
|
+
"devtools",
|
|
859
|
+
"__puppeteer",
|
|
860
|
+
"CDP"
|
|
861
|
+
];
|
|
862
|
+
constructor(collector) {
|
|
863
|
+
this.collector = collector;
|
|
864
|
+
}
|
|
865
|
+
toTextResponse(payload) {
|
|
866
|
+
return { content: [{
|
|
867
|
+
type: "text",
|
|
868
|
+
text: JSON.stringify(payload, null, 2)
|
|
869
|
+
}] };
|
|
870
|
+
}
|
|
871
|
+
parseDebuggerMode(value) {
|
|
872
|
+
if (value === "remove" || value === "noop") return value;
|
|
873
|
+
if (typeof value === "string") {
|
|
874
|
+
const normalized = value.trim().toLowerCase();
|
|
875
|
+
if (normalized === "remove" || normalized === "noop") return normalized;
|
|
876
|
+
}
|
|
877
|
+
return AntiDebugToolHandlers.DEFAULT_DEBUGGER_MODE;
|
|
878
|
+
}
|
|
879
|
+
mergeStackFilterPatterns(extraPatterns) {
|
|
880
|
+
const merged = [...AntiDebugToolHandlers.DEFAULT_STACK_FILTER_PATTERNS, ...extraPatterns].map((item) => item.trim());
|
|
881
|
+
return Array.from(new Set(merged.filter((item) => item.length > 0)));
|
|
882
|
+
}
|
|
883
|
+
buildScript(template, replacements) {
|
|
884
|
+
let output = template;
|
|
885
|
+
for (const [token, value] of Object.entries(replacements)) output = output.split(token).join(value);
|
|
886
|
+
return output;
|
|
887
|
+
}
|
|
888
|
+
buildDebuggerBypassScript(mode) {
|
|
889
|
+
return this.buildScript(ANTI_DEBUG_SCRIPTS.bypassDebuggerStatement, { __ANTI_DEBUG_MODE__: JSON.stringify(mode) });
|
|
890
|
+
}
|
|
891
|
+
buildTimingBypassScript(maxDrift) {
|
|
892
|
+
return this.buildScript(ANTI_DEBUG_SCRIPTS.bypassTiming, { __ANTI_DEBUG_MAX_DRIFT__: String(maxDrift) });
|
|
893
|
+
}
|
|
894
|
+
buildStackTraceBypassScript(filterPatterns) {
|
|
895
|
+
return this.buildScript(ANTI_DEBUG_SCRIPTS.bypassStackTrace, { __ANTI_DEBUG_FILTER_PATTERNS__: JSON.stringify(filterPatterns) });
|
|
896
|
+
}
|
|
897
|
+
async injectScripts(page, scripts, persistent) {
|
|
898
|
+
if (persistent) for (const script of scripts) await evaluateOnNewDocumentWithTimeout(page, script);
|
|
899
|
+
for (const script of scripts) await evaluateWithTimeout(page, script);
|
|
900
|
+
}
|
|
901
|
+
async getPage() {
|
|
902
|
+
return this.collector.getActivePage();
|
|
903
|
+
}
|
|
904
|
+
async handleAntiDebugBypassAll(args) {
|
|
905
|
+
try {
|
|
906
|
+
const persistent = argBool(args, "persistent", true);
|
|
907
|
+
const page = await this.getPage();
|
|
908
|
+
const scripts = [
|
|
909
|
+
this.buildDebuggerBypassScript(AntiDebugToolHandlers.DEFAULT_DEBUGGER_MODE),
|
|
910
|
+
this.buildTimingBypassScript(AntiDebugToolHandlers.DEFAULT_MAX_DRIFT),
|
|
911
|
+
this.buildStackTraceBypassScript(this.mergeStackFilterPatterns([])),
|
|
912
|
+
ANTI_DEBUG_SCRIPTS.bypassConsoleDetect
|
|
913
|
+
];
|
|
914
|
+
await this.injectScripts(page, scripts, persistent);
|
|
915
|
+
return this.toTextResponse({
|
|
916
|
+
success: true,
|
|
917
|
+
tool: "antidebug_bypass_all",
|
|
918
|
+
persistent,
|
|
919
|
+
injectedCount: scripts.length,
|
|
920
|
+
injected: [
|
|
921
|
+
"bypassDebuggerStatement",
|
|
922
|
+
"bypassTiming",
|
|
923
|
+
"bypassStackTrace",
|
|
924
|
+
"bypassConsoleDetect"
|
|
925
|
+
]
|
|
926
|
+
});
|
|
927
|
+
} catch (error) {
|
|
928
|
+
return this.toTextResponse({
|
|
929
|
+
success: false,
|
|
930
|
+
tool: "antidebug_bypass_all",
|
|
931
|
+
error: error instanceof Error ? error.message : String(error)
|
|
932
|
+
});
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
async handleAntiDebugBypassDebuggerStatement(args) {
|
|
936
|
+
try {
|
|
937
|
+
const mode = this.parseDebuggerMode(args.mode);
|
|
938
|
+
const page = await this.getPage();
|
|
939
|
+
const script = this.buildDebuggerBypassScript(mode);
|
|
940
|
+
await this.injectScripts(page, [script], true);
|
|
941
|
+
return this.toTextResponse({
|
|
942
|
+
success: true,
|
|
943
|
+
tool: "antidebug_bypass_debugger_statement",
|
|
944
|
+
mode,
|
|
945
|
+
persistent: true
|
|
946
|
+
});
|
|
947
|
+
} catch (error) {
|
|
948
|
+
return this.toTextResponse({
|
|
949
|
+
success: false,
|
|
950
|
+
tool: "antidebug_bypass_debugger_statement",
|
|
951
|
+
error: error instanceof Error ? error.message : String(error)
|
|
952
|
+
});
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
async handleAntiDebugBypassTiming(args) {
|
|
956
|
+
try {
|
|
957
|
+
const maxDrift = argNumber(args, "maxDrift", AntiDebugToolHandlers.DEFAULT_MAX_DRIFT) ?? AntiDebugToolHandlers.DEFAULT_MAX_DRIFT;
|
|
958
|
+
const page = await this.getPage();
|
|
959
|
+
const script = this.buildTimingBypassScript(maxDrift);
|
|
960
|
+
await this.injectScripts(page, [script], true);
|
|
961
|
+
return this.toTextResponse({
|
|
962
|
+
success: true,
|
|
963
|
+
tool: "antidebug_bypass_timing",
|
|
964
|
+
maxDrift,
|
|
965
|
+
persistent: true
|
|
966
|
+
});
|
|
967
|
+
} catch (error) {
|
|
968
|
+
return this.toTextResponse({
|
|
969
|
+
success: false,
|
|
970
|
+
tool: "antidebug_bypass_timing",
|
|
971
|
+
error: error instanceof Error ? error.message : String(error)
|
|
972
|
+
});
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
async handleAntiDebugBypassStackTrace(args) {
|
|
976
|
+
try {
|
|
977
|
+
const userPatterns = argStringArray(args, "filterPatterns");
|
|
978
|
+
const mergedPatterns = this.mergeStackFilterPatterns(userPatterns);
|
|
979
|
+
const page = await this.getPage();
|
|
980
|
+
const script = this.buildStackTraceBypassScript(mergedPatterns);
|
|
981
|
+
await this.injectScripts(page, [script], true);
|
|
982
|
+
return this.toTextResponse({
|
|
983
|
+
success: true,
|
|
984
|
+
tool: "antidebug_bypass_stack_trace",
|
|
985
|
+
filterPatterns: mergedPatterns,
|
|
986
|
+
persistent: true
|
|
987
|
+
});
|
|
988
|
+
} catch (error) {
|
|
989
|
+
return this.toTextResponse({
|
|
990
|
+
success: false,
|
|
991
|
+
tool: "antidebug_bypass_stack_trace",
|
|
992
|
+
error: error instanceof Error ? error.message : String(error)
|
|
993
|
+
});
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
async handleAntiDebugBypassConsoleDetect(_args) {
|
|
997
|
+
try {
|
|
998
|
+
const page = await this.getPage();
|
|
999
|
+
await this.injectScripts(page, [ANTI_DEBUG_SCRIPTS.bypassConsoleDetect], true);
|
|
1000
|
+
return this.toTextResponse({
|
|
1001
|
+
success: true,
|
|
1002
|
+
tool: "antidebug_bypass_console_detect",
|
|
1003
|
+
persistent: true
|
|
1004
|
+
});
|
|
1005
|
+
} catch (error) {
|
|
1006
|
+
return this.toTextResponse({
|
|
1007
|
+
success: false,
|
|
1008
|
+
tool: "antidebug_bypass_console_detect",
|
|
1009
|
+
error: error instanceof Error ? error.message : String(error)
|
|
1010
|
+
});
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
async handleAntiDebugDetectProtections(_args) {
|
|
1014
|
+
try {
|
|
1015
|
+
const result = await evaluateWithTimeout(await this.getPage(), ANTI_DEBUG_SCRIPTS.detectProtections);
|
|
1016
|
+
return this.toTextResponse({
|
|
1017
|
+
success: result?.success ?? true,
|
|
1018
|
+
tool: "antidebug_detect_protections",
|
|
1019
|
+
detected: result?.detected ?? false,
|
|
1020
|
+
count: result?.count ?? 0,
|
|
1021
|
+
protections: result?.protections ?? [],
|
|
1022
|
+
recommendations: result?.recommendations ?? [],
|
|
1023
|
+
evidence: result?.evidence ?? {}
|
|
1024
|
+
});
|
|
1025
|
+
} catch (error) {
|
|
1026
|
+
return this.toTextResponse({
|
|
1027
|
+
success: false,
|
|
1028
|
+
tool: "antidebug_detect_protections",
|
|
1029
|
+
error: error instanceof Error ? error.message : String(error)
|
|
1030
|
+
});
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
async handleAntidebugBypass(args) {
|
|
1034
|
+
const rawTypes = args["types"];
|
|
1035
|
+
const typesArr = Array.isArray(rawTypes) ? rawTypes : ["all"];
|
|
1036
|
+
const types = typesArr.length === 0 ? ["all"] : typesArr;
|
|
1037
|
+
if (types.includes("all")) return this.handleAntiDebugBypassAll(args);
|
|
1038
|
+
const persistent = argBool(args, "persistent", true);
|
|
1039
|
+
const mode = this.parseDebuggerMode(args["mode"]);
|
|
1040
|
+
const maxDrift = argNumber(args, "maxDrift", AntiDebugToolHandlers.DEFAULT_MAX_DRIFT) ?? AntiDebugToolHandlers.DEFAULT_MAX_DRIFT;
|
|
1041
|
+
const userPatterns = argStringArray(args, "filterPatterns");
|
|
1042
|
+
const applied = [];
|
|
1043
|
+
try {
|
|
1044
|
+
const page = await this.getPage();
|
|
1045
|
+
if (types.includes("debugger_statement")) {
|
|
1046
|
+
const script = this.buildDebuggerBypassScript(mode);
|
|
1047
|
+
await this.injectScripts(page, [script], persistent);
|
|
1048
|
+
applied.push("debugger_statement");
|
|
1049
|
+
}
|
|
1050
|
+
if (types.includes("timing")) {
|
|
1051
|
+
const script = this.buildTimingBypassScript(maxDrift);
|
|
1052
|
+
await this.injectScripts(page, [script], persistent);
|
|
1053
|
+
applied.push("timing");
|
|
1054
|
+
}
|
|
1055
|
+
if (types.includes("stack_trace")) {
|
|
1056
|
+
const mergedPatterns = this.mergeStackFilterPatterns(userPatterns);
|
|
1057
|
+
const script = this.buildStackTraceBypassScript(mergedPatterns);
|
|
1058
|
+
await this.injectScripts(page, [script], persistent);
|
|
1059
|
+
applied.push("stack_trace");
|
|
1060
|
+
}
|
|
1061
|
+
if (types.includes("console_detect")) {
|
|
1062
|
+
await this.injectScripts(page, [ANTI_DEBUG_SCRIPTS.bypassConsoleDetect], persistent);
|
|
1063
|
+
applied.push("console_detect");
|
|
1064
|
+
}
|
|
1065
|
+
return this.toTextResponse({
|
|
1066
|
+
success: true,
|
|
1067
|
+
tool: "antidebug_bypass",
|
|
1068
|
+
applied,
|
|
1069
|
+
persistent
|
|
1070
|
+
});
|
|
1071
|
+
} catch (error) {
|
|
1072
|
+
return this.toTextResponse({
|
|
1073
|
+
success: false,
|
|
1074
|
+
tool: "antidebug_bypass",
|
|
1075
|
+
error: error instanceof Error ? error.message : String(error)
|
|
1076
|
+
});
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
};
|
|
1080
|
+
//#endregion
|
|
1081
|
+
export { AntiDebugToolHandlers };
|