@jshookmcp/jshook 0.2.2 → 0.2.5
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 +15 -6
- package/README.zh.md +19 -4
- 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/packages/extension-sdk/src/bridges/shared.js +2 -2
- package/dist/packages/extension-sdk/src/plugin.d.ts +5 -0
- package/dist/packages/extension-sdk/src/plugin.js +119 -33
- package/dist/packages/extension-sdk/src/workflow.d.ts +156 -0
- package/dist/packages/extension-sdk/src/workflow.js +236 -0
- package/dist/src/config/search-defaults.js +161 -0
- package/dist/src/constants.d.ts +3 -0
- package/dist/src/constants.js +4 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +13 -17
- package/dist/src/modules/analyzer/CodeAnalyzer.d.ts +1 -3
- package/dist/src/modules/analyzer/CodeAnalyzer.js +16 -28
- package/dist/src/modules/analyzer/CodeAnalyzerDataFlow.d.ts +1 -2
- package/dist/src/modules/analyzer/CodeAnalyzerDataFlow.js +1 -45
- package/dist/src/modules/analyzer/IntelligentAnalyzer.d.ts +1 -37
- package/dist/src/modules/analyzer/IntelligentAnalyzer.js +9 -142
- package/dist/src/modules/analyzer/PatternDetector.js +3 -3
- package/dist/src/modules/analyzer/PatternDetectorAuthPatterns.js +1 -1
- package/dist/src/modules/browser/BrowserDiscovery.d.ts +6 -5
- package/dist/src/modules/browser/BrowserDiscovery.js +3 -3
- package/dist/src/modules/browser/BrowserModeManager.d.ts +1 -1
- package/dist/src/modules/browser/BrowserModeManager.js +11 -10
- package/dist/src/modules/browser/TabRegistry.js +2 -2
- package/dist/src/modules/browser/UnifiedBrowserManager.d.ts +1 -0
- package/dist/src/modules/browser/UnifiedBrowserManager.js +19 -4
- package/dist/src/modules/captcha/AICaptchaDetector.d.ts +14 -23
- package/dist/src/modules/captcha/AICaptchaDetector.js +8 -202
- 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 +5 -6
- package/dist/src/modules/collector/DOMInspector.d.ts +3 -2
- package/dist/src/modules/collector/DOMInspector.js +49 -59
- package/dist/src/modules/collector/PageController.d.ts +17 -4
- package/dist/src/modules/collector/PageController.js +2 -5
- package/dist/src/modules/collector/PageScriptCollectors.js +3 -3
- package/dist/src/modules/crypto/CryptoDetector.d.ts +1 -4
- package/dist/src/modules/crypto/CryptoDetector.js +2 -42
- package/dist/src/modules/crypto/CryptoRules.js +1 -1
- package/dist/src/modules/debugger/BlackboxManager.js +1 -1
- package/dist/src/modules/debugger/DebuggerManager.impl.core.scope.js +1 -1
- package/dist/src/modules/debugger/ScriptManager.impl.extract-function-tree.js +5 -3
- package/dist/src/modules/debugger/WatchExpressionManager.js +1 -1
- package/dist/src/modules/deobfuscator/Deobfuscator.d.ts +1 -4
- package/dist/src/modules/deobfuscator/Deobfuscator.js +4 -39
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.d.ts +0 -3
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.js +2 -8
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.d.ts +2 -3
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.js +5 -57
- package/dist/src/modules/deobfuscator/JScramblerDeobfuscator.js +3 -4
- package/dist/src/modules/deobfuscator/PackerDeobfuscator.js +1 -1
- package/dist/src/modules/deobfuscator/VMDeobfuscator.d.ts +2 -10
- package/dist/src/modules/deobfuscator/VMDeobfuscator.js +3 -128
- package/dist/src/modules/deobfuscator/webcrack.js +15 -2
- package/dist/src/modules/emulator/AIEnvironmentAnalyzer.d.ts +5 -8
- package/dist/src/modules/emulator/AIEnvironmentAnalyzer.js +10 -102
- package/dist/src/modules/emulator/EnvironmentEmulator.d.ts +1 -5
- package/dist/src/modules/emulator/EnvironmentEmulator.js +7 -91
- package/dist/src/modules/emulator/EnvironmentEmulatorFetch.js +58 -61
- package/dist/src/modules/emulator/templates/chrome-env.d.ts +17 -7
- package/dist/src/modules/emulator/templates/chrome-env.js +14 -7
- package/dist/src/modules/external/ExternalToolRunner.d.ts +1 -1
- package/dist/src/modules/external/ExternalToolRunner.js +26 -23
- package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.d.ts +13 -0
- package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.js +42 -0
- package/dist/src/modules/monitor/FetchInterceptor.d.ts +46 -0
- package/dist/src/modules/monitor/FetchInterceptor.js +191 -0
- package/dist/src/modules/monitor/PerformanceMonitor.js +8 -7
- package/dist/src/modules/process/BaseMemoryManager.d.ts +1 -1
- package/dist/src/modules/process/LinuxProcessManager.js +4 -2
- package/dist/src/modules/process/MacProcessManager.js +1 -1
- package/dist/src/modules/process/MemoryManager.d.ts +1 -1
- package/dist/src/modules/process/MemoryManager.js +2 -2
- package/dist/src/modules/process/ProcessManager.impl.js +1 -1
- package/dist/src/modules/process/memory/AuditTrail.js +1 -1
- package/dist/src/modules/process/memory/reader.js +35 -3
- package/dist/src/modules/process/memory/regions.enumerate.js +1 -1
- package/dist/src/modules/process/memory/regions.protection.js +42 -9
- package/dist/src/modules/process/memory/scanner.d.ts +5 -1
- package/dist/src/modules/process/memory/scanner.darwin.js +57 -0
- package/dist/src/modules/process/memory/scanner.js +88 -4
- package/dist/src/modules/process/memory/writer.js +44 -4
- package/dist/src/modules/security/ExecutionSandbox.js +7 -8
- package/dist/src/modules/stealth/FingerprintManager.js +1 -1
- package/dist/src/modules/stealth/StealthScripts.d.ts +4 -2
- package/dist/src/modules/stealth/StealthScripts.js +53 -14
- package/dist/src/modules/stealth/StealthVerifier.d.ts +1 -1
- package/dist/src/modules/stealth/StealthVerifier.js +2 -4
- package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.d.ts +14 -0
- package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.js +181 -2
- package/dist/src/modules/trace/TraceDB.js +12 -6
- package/dist/src/modules/trace/TraceRecorder.js +1 -5
- package/dist/src/native/AntiCheatDetector.js +67 -16
- package/dist/src/native/CodeInjector.js +4 -4
- package/dist/src/native/HardwareBreakpoint.js +25 -16
- package/dist/src/native/HeapAnalyzer.js +2 -2
- package/dist/src/native/MemoryController.js +1 -1
- package/dist/src/native/MemoryScanSession.js +2 -2
- package/dist/src/native/MemoryScanner.js +4 -8
- package/dist/src/native/NativeMemoryManager.impl.js +2 -2
- package/dist/src/native/PEAnalyzer.js +14 -15
- package/dist/src/native/PointerChainEngine.js +2 -4
- package/dist/src/native/ScriptLoader.js +4 -9
- package/dist/src/native/Speedhack.js +1 -1
- package/dist/src/native/StructureAnalyzer.js +52 -33
- package/dist/src/native/Win32API.d.ts +1 -0
- package/dist/src/native/Win32API.js +13 -0
- package/dist/src/native/Win32Debug.js +19 -19
- package/dist/src/native/platform/darwin/DarwinAPI.d.ts +2 -0
- package/dist/src/native/platform/darwin/DarwinAPI.js +8 -0
- package/dist/src/native/platform/darwin/DarwinMemoryProvider.js +6 -1
- package/dist/src/server/MCPServer.context.d.ts +2 -1
- package/dist/src/server/MCPServer.d.ts +2 -1
- package/dist/src/server/MCPServer.domain.d.ts +1 -1
- package/dist/src/server/MCPServer.domain.js +81 -16
- package/dist/src/server/MCPServer.js +42 -14
- package/dist/src/server/MCPServer.resources.d.ts +2 -0
- package/dist/src/server/MCPServer.resources.js +91 -0
- package/dist/src/server/MCPServer.search.handlers.call.js +2 -1
- package/dist/src/server/MCPServer.search.helpers.js +2 -2
- package/dist/src/server/MCPServer.tools.js +1 -1
- package/dist/src/server/MCPServer.transport.js +12 -0
- package/dist/src/server/ToolCallContextGuard.d.ts +5 -0
- package/dist/src/server/ToolCallContextGuard.js +85 -0
- package/dist/src/server/ToolRouter.d.ts +26 -10
- package/dist/src/server/ToolRouter.intent.d.ts +26 -0
- package/dist/src/server/ToolRouter.intent.js +77 -0
- package/dist/src/server/ToolRouter.js +103 -284
- package/dist/src/server/ToolRouter.policy.d.ts +22 -0
- package/dist/src/server/ToolRouter.policy.js +163 -0
- package/dist/src/server/ToolRouter.probe.d.ts +17 -0
- package/dist/src/server/ToolRouter.probe.js +103 -0
- package/dist/src/server/ToolRouter.renderer.d.ts +9 -0
- package/dist/src/server/ToolRouter.renderer.js +52 -0
- package/dist/src/server/activation/ActivationController.js +15 -12
- package/dist/src/server/activation/CompoundConditionEngine.js +1 -1
- package/dist/src/server/activation/PredictiveBooster.js +1 -3
- package/dist/src/server/domains/analysis/definitions.js +155 -655
- package/dist/src/server/domains/analysis/handlers.impl.d.ts +8 -8
- package/dist/src/server/domains/analysis/handlers.impl.js +34 -28
- package/dist/src/server/domains/analysis/handlers.web-tools.js +4 -3
- package/dist/src/server/domains/analysis/manifest.js +6 -4
- package/dist/src/server/domains/antidebug/definitions.js +25 -111
- package/dist/src/server/domains/browser/definitions.tools.advanced.js +59 -88
- package/dist/src/server/domains/browser/definitions.tools.behavior.js +120 -227
- package/dist/src/server/domains/browser/definitions.tools.page-core.js +157 -386
- package/dist/src/server/domains/browser/definitions.tools.page-system.js +108 -250
- package/dist/src/server/domains/browser/definitions.tools.runtime.js +61 -174
- package/dist/src/server/domains/browser/definitions.tools.security.js +92 -237
- package/dist/src/server/domains/browser/handlers/camoufox-browser.js +3 -2
- package/dist/src/server/domains/browser/handlers/captcha-solver.js +3 -3
- package/dist/src/server/domains/browser/handlers/dom-query.js +2 -1
- 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 +231 -3
- package/dist/src/server/domains/browser/handlers/indexeddb-dump.js +21 -20
- package/dist/src/server/domains/browser/handlers/script-management.js +1 -1
- package/dist/src/server/domains/browser/handlers/stealth-injection.js +8 -2
- package/dist/src/server/domains/browser/handlers.impl.d.ts +15 -12
- package/dist/src/server/domains/browser/handlers.impl.js +5 -6
- package/dist/src/server/domains/browser/manifest.js +37 -13
- package/dist/src/server/domains/coordination/definitions.js +50 -149
- package/dist/src/server/domains/coordination/index.d.ts +20 -1
- package/dist/src/server/domains/coordination/index.js +133 -0
- package/dist/src/server/domains/coordination/manifest.js +15 -0
- package/dist/src/server/domains/debugger/definitions.tools.advanced.js +72 -189
- package/dist/src/server/domains/debugger/definitions.tools.core.js +114 -288
- package/dist/src/server/domains/debugger/manifest.js +9 -2
- package/dist/src/server/domains/encoding/definitions.js +43 -153
- package/dist/src/server/domains/encoding/handlers.base.js +2 -2
- package/dist/src/server/domains/evidence/definitions.d.ts +2 -0
- package/dist/src/server/domains/evidence/definitions.js +42 -0
- package/dist/src/server/domains/evidence/handlers.d.ts +582 -0
- package/dist/src/server/domains/evidence/handlers.js +60 -0
- package/dist/src/server/domains/evidence/index.d.ts +2 -0
- package/dist/src/server/domains/evidence/index.js +2 -0
- package/dist/src/server/domains/evidence/manifest.d.ts +63 -0
- package/dist/src/server/domains/evidence/manifest.js +78 -0
- package/dist/src/server/domains/graphql/definitions.js +53 -141
- package/dist/src/server/domains/graphql/handlers.impl.core.runtime.replay.js +92 -114
- package/dist/src/server/domains/hooks/ai-handlers.d.ts +0 -7
- package/dist/src/server/domains/hooks/ai-handlers.js +4 -70
- package/dist/src/server/domains/hooks/definitions.js +69 -335
- package/dist/src/server/domains/hooks/manifest.d.ts +1 -1
- package/dist/src/server/domains/hooks/manifest.js +1 -2
- package/dist/src/server/domains/instrumentation/definitions.d.ts +2 -0
- package/dist/src/server/domains/instrumentation/definitions.js +99 -0
- package/dist/src/server/domains/instrumentation/handlers.d.ts +78 -0
- package/dist/src/server/domains/instrumentation/handlers.js +206 -0
- package/dist/src/server/domains/instrumentation/index.d.ts +2 -0
- package/dist/src/server/domains/instrumentation/index.js +2 -0
- package/dist/src/server/domains/instrumentation/manifest.d.ts +63 -0
- package/dist/src/server/domains/instrumentation/manifest.js +114 -0
- package/dist/src/server/domains/macro/definitions.js +16 -43
- package/dist/src/server/domains/maintenance/definitions.js +60 -219
- package/dist/src/server/domains/maintenance/handlers.d.ts +2 -2
- package/dist/src/server/domains/maintenance/handlers.extensions.js +78 -20
- package/dist/src/server/domains/maintenance/handlers.js +2 -2
- package/dist/src/server/domains/memory/definitions.js +387 -559
- package/dist/src/server/domains/memory/handlers/hooks.d.ts +55 -0
- package/dist/src/server/domains/memory/handlers/hooks.js +115 -0
- package/dist/src/server/domains/memory/handlers/integrity.d.ts +77 -0
- package/dist/src/server/domains/memory/handlers/integrity.js +180 -0
- package/dist/src/server/domains/memory/handlers/pointer-chain.d.ts +29 -0
- package/dist/src/server/domains/memory/handlers/pointer-chain.js +82 -0
- package/dist/src/server/domains/memory/handlers/readwrite.d.ts +41 -0
- package/dist/src/server/domains/memory/handlers/readwrite.js +78 -0
- package/dist/src/server/domains/memory/handlers/scan.d.ts +35 -0
- package/dist/src/server/domains/memory/handlers/scan.js +97 -0
- package/dist/src/server/domains/memory/handlers/session.d.ts +23 -0
- package/dist/src/server/domains/memory/handlers/session.js +49 -0
- package/dist/src/server/domains/memory/handlers/structure.d.ts +29 -0
- package/dist/src/server/domains/memory/handlers/structure.js +74 -0
- package/dist/src/server/domains/memory/handlers.impl.d.ts +49 -54
- package/dist/src/server/domains/memory/handlers.impl.js +63 -494
- package/dist/src/server/domains/memory/manifest.js +236 -64
- package/dist/src/server/domains/native-bridge/definitions.js +54 -192
- package/dist/src/server/domains/native-bridge/index.d.ts +1 -0
- package/dist/src/server/domains/native-bridge/index.js +2 -1
- package/dist/src/server/domains/network/auth-extractor.js +1 -1
- package/dist/src/server/domains/network/definitions.js +175 -578
- package/dist/src/server/domains/network/handlers.base.core.d.ts +64 -0
- package/dist/src/server/domains/network/handlers.base.core.js +623 -0
- package/dist/src/server/domains/network/handlers.base.d.ts +2 -124
- package/dist/src/server/domains/network/handlers.base.js +3 -878
- package/dist/src/server/domains/network/handlers.base.performance.d.ts +63 -0
- package/dist/src/server/domains/network/handlers.base.performance.js +193 -0
- package/dist/src/server/domains/network/handlers.base.types.d.ts +42 -0
- package/dist/src/server/domains/network/handlers.base.types.js +89 -0
- package/dist/src/server/domains/network/handlers.impl.core.runtime.d.ts +1 -1
- package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.d.ts +21 -0
- package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.js +186 -0
- package/dist/src/server/domains/network/handlers.impl.core.runtime.js +1 -1
- package/dist/src/server/domains/network/manifest.js +15 -0
- package/dist/src/server/domains/network/replay.js +1 -4
- package/dist/src/server/domains/platform/definitions.js +121 -112
- package/dist/src/server/domains/platform/handlers/bridge-handlers.d.ts +5 -1
- package/dist/src/server/domains/platform/handlers/bridge-handlers.js +194 -5
- package/dist/src/server/domains/platform/handlers/electron-asar-helpers.js +26 -6
- package/dist/src/server/domains/platform/handlers/electron-dual-cdp.d.ts +3 -0
- package/dist/src/server/domains/platform/handlers/electron-dual-cdp.js +170 -0
- package/dist/src/server/domains/platform/handlers/electron-fuse-handler.d.ts +3 -0
- package/dist/src/server/domains/platform/handlers/electron-fuse-handler.js +193 -0
- package/dist/src/server/domains/platform/handlers/electron-handlers.d.ts +6 -0
- package/dist/src/server/domains/platform/handlers/electron-handlers.js +95 -2
- package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.d.ts +2 -0
- package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.js +370 -0
- package/dist/src/server/domains/platform/handlers/electron-userdata-handler.d.ts +2 -0
- package/dist/src/server/domains/platform/handlers/electron-userdata-handler.js +78 -0
- package/dist/src/server/domains/platform/handlers/miniapp-handlers.d.ts +1 -1
- package/dist/src/server/domains/platform/handlers/miniapp-handlers.js +4 -4
- package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.d.ts +2 -0
- package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.js +207 -0
- package/dist/src/server/domains/platform/handlers.d.ts +48 -0
- package/dist/src/server/domains/platform/handlers.js +29 -0
- package/dist/src/server/domains/platform/manifest.js +38 -0
- package/dist/src/server/domains/process/definitions.js +163 -647
- package/dist/src/server/domains/process/handlers.base.d.ts +3 -95
- package/dist/src/server/domains/process/handlers.base.js +7 -462
- package/dist/src/server/domains/process/handlers.base.process.d.ts +61 -0
- package/dist/src/server/domains/process/handlers.base.process.js +417 -0
- package/dist/src/server/domains/process/handlers.base.types.d.ts +57 -0
- package/dist/src/server/domains/process/handlers.base.types.js +50 -0
- package/dist/src/server/domains/process/handlers.impl.core.runtime.inject.js +19 -17
- package/dist/src/server/domains/process/manifest.js +6 -1
- package/dist/src/server/domains/sandbox/definitions.js +11 -33
- package/dist/src/server/domains/sandbox/handlers.js +8 -3
- package/dist/src/server/domains/shared/ResponseBuilder.d.ts +209 -0
- package/dist/src/server/domains/shared/ResponseBuilder.js +48 -0
- package/dist/src/server/domains/shared/modules.d.ts +0 -2
- package/dist/src/server/domains/shared/modules.js +0 -1
- package/dist/src/server/domains/sourcemap/definitions.js +27 -111
- package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-common.js +7 -2
- package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-main.js +1 -1
- package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-parse-base.js +1 -1
- package/dist/src/server/domains/sourcemap/manifest.d.ts +1 -1
- package/dist/src/server/domains/sourcemap/manifest.js +1 -1
- package/dist/src/server/domains/streaming/definitions.js +36 -148
- package/dist/src/server/domains/streaming/handlers.impl.streaming-sse.js +163 -164
- package/dist/src/server/domains/streaming/handlers.impl.streaming-ws.js +1 -1
- package/dist/src/server/domains/trace/TraceSummarizer.d.ts +60 -0
- package/dist/src/server/domains/trace/TraceSummarizer.js +112 -0
- package/dist/src/server/domains/trace/definitions.tools.js +51 -176
- package/dist/src/server/domains/trace/handlers.d.ts +2 -1
- package/dist/src/server/domains/trace/handlers.js +62 -9
- package/dist/src/server/domains/trace/index.d.ts +2 -1
- package/dist/src/server/domains/trace/index.js +2 -1
- package/dist/src/server/domains/trace/manifest.js +18 -4
- package/dist/src/server/domains/transform/definitions.js +50 -210
- package/dist/src/server/domains/transform/handlers.impl.transform-base.js +6 -6
- package/dist/src/server/domains/transform/handlers.impl.transform-crypto.js +18 -19
- package/dist/src/server/domains/transform/manifest.d.ts +1 -1
- package/dist/src/server/domains/transform/manifest.js +1 -1
- package/dist/src/server/domains/wasm/definitions.js +55 -232
- package/dist/src/server/domains/wasm/handlers.js +3 -3
- package/dist/src/server/domains/workflow/definitions.js +144 -414
- package/dist/src/server/domains/workflow/handlers.impl.workflow-account-bundle.js +2 -2
- package/dist/src/server/domains/workflow/handlers.impl.workflow-base.d.ts +2 -0
- package/dist/src/server/domains/workflow/handlers.impl.workflow-base.js +126 -87
- package/dist/src/server/domains/workflow/handlers.impl.workflow-batch.js +5 -5
- package/dist/src/server/evidence/ReverseEvidenceGraph.d.ts +20 -0
- package/dist/src/server/evidence/ReverseEvidenceGraph.js +208 -0
- package/dist/src/server/evidence/index.d.ts +2 -0
- package/dist/src/server/evidence/index.js +1 -0
- package/dist/src/server/evidence/types.d.ts +22 -0
- package/dist/src/server/evidence/types.js +1 -0
- package/dist/src/server/extensions/ExtensionManager.d.ts +1 -0
- package/dist/src/server/extensions/ExtensionManager.discovery.js +72 -9
- package/dist/src/server/extensions/ExtensionManager.integrity.js +1 -1
- package/dist/src/server/extensions/ExtensionManager.js +193 -40
- package/dist/src/server/extensions/ExtensionManager.roots.d.ts +1 -1
- package/dist/src/server/extensions/ExtensionManager.roots.js +19 -9
- package/dist/src/server/extensions/plugin-config.js +1 -1
- package/dist/src/server/extensions/plugin-env.d.ts +1 -1
- package/dist/src/server/extensions/plugin-env.js +10 -4
- package/dist/src/server/extensions/types.d.ts +17 -0
- package/dist/src/server/extensions/types.js +1 -1
- package/dist/src/server/http/HttpMiddleware.js +1 -1
- package/dist/src/server/instrumentation/EvidenceGraphBridge.d.ts +13 -0
- package/dist/src/server/instrumentation/EvidenceGraphBridge.js +150 -0
- package/dist/src/server/instrumentation/InstrumentationSession.d.ts +60 -0
- package/dist/src/server/instrumentation/InstrumentationSession.js +269 -0
- package/dist/src/server/instrumentation/index.d.ts +2 -0
- package/dist/src/server/instrumentation/index.js +2 -0
- package/dist/src/server/instrumentation/types.d.ts +62 -0
- package/dist/src/server/instrumentation/types.js +7 -0
- package/dist/src/server/macros/MacroConfigLoader.d.ts +6 -5
- package/dist/src/server/macros/MacroConfigLoader.js +61 -59
- package/dist/src/server/macros/MacroRunner.js +6 -2
- package/dist/src/server/macros/builtins/index.d.ts +2 -3
- package/dist/src/server/macros/builtins/index.js +51 -7
- package/dist/src/server/plugins/PluginContract.d.ts +1 -1
- package/dist/src/server/registry/contracts.d.ts +7 -1
- package/dist/src/server/registry/discovery.js +5 -4
- package/dist/src/server/registry/ensure-browser-core.js +0 -3
- package/dist/src/server/registry/index.js +4 -4
- package/dist/src/server/registry/tool-builder.d.ts +46 -0
- package/dist/src/server/registry/tool-builder.js +105 -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 +162 -2
- 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/server/search/EmbeddingWorker.js +5 -3
- package/dist/src/server/search/FeedbackTracker.d.ts +9 -0
- package/dist/src/server/search/FeedbackTracker.js +26 -0
- package/dist/src/server/search/QueryNormalizer.d.ts +6 -0
- package/dist/src/server/search/QueryNormalizer.js +94 -0
- package/dist/src/server/search/ToolSearchEngineImpl.d.ts +2 -3
- package/dist/src/server/search/ToolSearchEngineImpl.js +38 -88
- package/dist/src/server/workflows/WorkflowContract.d.ts +24 -0
- package/dist/src/server/workflows/WorkflowContract.js +12 -0
- package/dist/src/server/workflows/WorkflowEngine.d.ts +1 -0
- package/dist/src/server/workflows/WorkflowEngine.js +136 -3
- package/dist/src/types/config.d.ts +0 -14
- package/dist/src/types/deobfuscator.d.ts +0 -1
- package/dist/src/types/index.d.ts +1 -1
- package/dist/src/utils/DetailedDataManager.js +2 -0
- package/dist/src/utils/RingBuffer.js +5 -5
- package/dist/src/utils/TokenBudgetManager.js +1 -1
- package/dist/src/utils/UnifiedCacheManager.d.ts +1 -1
- package/dist/src/utils/UnifiedCacheManager.js +3 -3
- package/dist/src/utils/artifactRetention.js +2 -2
- package/dist/src/utils/betterSqlite3.d.ts +11 -0
- package/dist/src/utils/betterSqlite3.js +88 -0
- package/dist/src/utils/browserExecutable.js +2 -2
- package/dist/src/utils/cliFastPath.js +17 -6
- package/dist/src/utils/config.js +4 -26
- package/dist/src/utils/environmentDoctor.js +138 -11
- package/dist/src/utils/outputPaths.js +16 -9
- package/dist/src/utils/parallel.js +1 -3
- package/package.json +76 -72
- 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
- package/workflows/.gitkeep +0 -0
- package/dist/src/modules/analyzer/AISummarizer.d.ts +0 -39
- package/dist/src/modules/analyzer/AISummarizer.js +0 -122
- package/dist/src/modules/hook/AIHookGenerator.d.ts +0 -52
- package/dist/src/modules/hook/AIHookGenerator.js +0 -360
- package/dist/src/modules/hook/AIHookGeneratorTemplates.d.ts +0 -9
- package/dist/src/modules/hook/AIHookGeneratorTemplates.js +0 -157
- package/dist/src/server/macros/builtins/deobfuscate-ast-flow.d.ts +0 -2
- package/dist/src/server/macros/builtins/deobfuscate-ast-flow.js +0 -25
- package/dist/src/server/macros/builtins/unpacker-flow.d.ts +0 -2
- package/dist/src/server/macros/builtins/unpacker-flow.js +0 -25
- package/dist/src/services/LLMService.d.ts +0 -37
- package/dist/src/services/LLMService.js +0 -233
- package/dist/src/services/prompts/analysis.d.ts +0 -9
- package/dist/src/services/prompts/analysis.js +0 -158
- package/dist/src/services/prompts/crypto.d.ts +0 -2
- package/dist/src/services/prompts/crypto.js +0 -108
- package/dist/src/services/prompts/deobfuscation.d.ts +0 -6
- package/dist/src/services/prompts/deobfuscation.js +0 -300
- package/dist/src/services/prompts/environment.d.ts +0 -16
- package/dist/src/services/prompts/environment.js +0 -372
- package/dist/src/services/prompts/intelligence.d.ts +0 -4
- package/dist/src/services/prompts/intelligence.js +0 -250
- package/dist/src/services/prompts/taint.d.ts +0 -2
- package/dist/src/services/prompts/taint.js +0 -54
|
@@ -3,15 +3,25 @@ import { scanMemoryWindows } from './scanner.windows.js';
|
|
|
3
3
|
import { scanMemoryLinux } from './scanner.linux.js';
|
|
4
4
|
import { scanMemoryMac } from './scanner.darwin.js';
|
|
5
5
|
export { buildPatternBytesAndMask, patternToBytesMac } from './scanner.patterns.js';
|
|
6
|
-
export async function scanMemory(platform, pid, pattern, patternType = 'hex') {
|
|
6
|
+
export async function scanMemory(platform, pid, pattern, patternType = 'hex', suspendTarget = false) {
|
|
7
|
+
let suspended = false;
|
|
7
8
|
try {
|
|
9
|
+
if (suspendTarget) {
|
|
10
|
+
suspended = await suspendProcess(platform, pid);
|
|
11
|
+
if (suspended) {
|
|
12
|
+
logger.info(`Suspended process ${pid} for consistent memory scan`);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
logger.warn(`Could not suspend process ${pid} — scanning unsuspended`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
8
18
|
switch (platform) {
|
|
9
19
|
case 'win32':
|
|
10
|
-
return scanMemoryWindows(pid, pattern, patternType);
|
|
20
|
+
return await scanMemoryWindows(pid, pattern, patternType);
|
|
11
21
|
case 'linux':
|
|
12
|
-
return scanMemoryLinux(pid, pattern, patternType);
|
|
22
|
+
return await scanMemoryLinux(pid, pattern, patternType);
|
|
13
23
|
case 'darwin':
|
|
14
|
-
return scanMemoryMac(pid, pattern, patternType);
|
|
24
|
+
return await scanMemoryMac(pid, pattern, patternType);
|
|
15
25
|
default:
|
|
16
26
|
return { success: false, addresses: [], error: `Memory scan not supported on ${platform}` };
|
|
17
27
|
}
|
|
@@ -24,6 +34,12 @@ export async function scanMemory(platform, pid, pattern, patternType = 'hex') {
|
|
|
24
34
|
error: error instanceof Error ? error.message : String(error),
|
|
25
35
|
};
|
|
26
36
|
}
|
|
37
|
+
finally {
|
|
38
|
+
if (suspended) {
|
|
39
|
+
await resumeProcess(platform, pid);
|
|
40
|
+
logger.info(`Resumed process ${pid} after memory scan`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
27
43
|
}
|
|
28
44
|
export async function scanMemoryFiltered(pid, pattern, addresses, patternType = 'hex', _readMemoryFn, scanMemoryFn) {
|
|
29
45
|
const validAddresses = [];
|
|
@@ -59,3 +75,71 @@ export async function scanMemoryFiltered(pid, pattern, addresses, patternType =
|
|
|
59
75
|
stats: { resultsFound: results.length, patternLength: pattern.length },
|
|
60
76
|
};
|
|
61
77
|
}
|
|
78
|
+
async function suspendProcess(platform, pid) {
|
|
79
|
+
try {
|
|
80
|
+
switch (platform) {
|
|
81
|
+
case 'darwin': {
|
|
82
|
+
const { createPlatformProvider } = await import('../../../native/platform/factory.js');
|
|
83
|
+
const provider = createPlatformProvider();
|
|
84
|
+
const avail = await provider.checkAvailability();
|
|
85
|
+
if (!avail.available)
|
|
86
|
+
return false;
|
|
87
|
+
const handle = provider.openProcess(pid, false);
|
|
88
|
+
try {
|
|
89
|
+
const { taskSuspend } = await import('../../../native/platform/darwin/DarwinAPI.js');
|
|
90
|
+
const { machTaskSelf, taskForPid, KERN } = await import('../../../native/platform/darwin/DarwinAPI.js');
|
|
91
|
+
const { kr, task } = taskForPid(machTaskSelf(), pid);
|
|
92
|
+
if (kr !== KERN.SUCCESS)
|
|
93
|
+
return false;
|
|
94
|
+
const suspendKr = taskSuspend(task);
|
|
95
|
+
return suspendKr === KERN.SUCCESS;
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
provider.closeProcess(handle);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
case 'linux': {
|
|
102
|
+
const { execAsync } = await import('../../process/memory/types.js');
|
|
103
|
+
await execAsync(`kill -STOP ${pid}`, { timeout: 2000 });
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
case 'win32': {
|
|
107
|
+
const { execAsync } = await import('../../process/memory/types.js');
|
|
108
|
+
await execAsync(`powershell -NoProfile -Command "(Add-Type -MemberDefinition '[DllImport("ntdll.dll")] public static extern int NtSuspendProcess(IntPtr h);' -Name W -Namespace N -PassThru)::NtSuspendProcess((Get-Process -Id ${pid}).Handle)"`, { timeout: 5000 });
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
default:
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
logger.warn(`Failed to suspend process ${pid}:`, err);
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async function resumeProcess(platform, pid) {
|
|
121
|
+
try {
|
|
122
|
+
switch (platform) {
|
|
123
|
+
case 'darwin': {
|
|
124
|
+
const { machTaskSelf, taskForPid, taskResume, KERN } = await import('../../../native/platform/darwin/DarwinAPI.js');
|
|
125
|
+
const { kr, task } = taskForPid(machTaskSelf(), pid);
|
|
126
|
+
if (kr === KERN.SUCCESS)
|
|
127
|
+
taskResume(task);
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
case 'linux': {
|
|
131
|
+
const { execAsync } = await import('../../process/memory/types.js');
|
|
132
|
+
await execAsync(`kill -CONT ${pid}`, { timeout: 2000 });
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
case 'win32': {
|
|
136
|
+
const { execAsync } = await import('../../process/memory/types.js');
|
|
137
|
+
await execAsync(`powershell -NoProfile -Command "(Add-Type -MemberDefinition '[DllImport("ntdll.dll")] public static extern int NtResumeProcess(IntPtr h);' -Name W -Namespace N -PassThru)::NtResumeProcess((Get-Process -Id ${pid}).Handle)"`, { timeout: 5000 });
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
logger.error(`CRITICAL: Failed to resume process ${pid} — may need manual SIGCONT:`, err);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { logger } from '../../../utils/logger.js';
|
|
2
2
|
import { nativeMemoryManager } from '../../../native/NativeMemoryManager.js';
|
|
3
3
|
import { isKoffiAvailable } from '../../../native/Win32API.js';
|
|
4
|
+
import { MEMORY_MAX_WRITE_BYTES } from '../../../constants.js';
|
|
4
5
|
import { execAsync, executePowerShellScript, } from '../../process/memory/types.js';
|
|
5
6
|
async function writeMemoryWindows(pid, address, data) {
|
|
6
7
|
try {
|
|
@@ -108,11 +109,32 @@ async function writeMemoryMac(pid, address, data, checkProtectionFn) {
|
|
|
108
109
|
if (address === 0) {
|
|
109
110
|
return { success: false, error: 'Invalid address: null pointer (0x0)' };
|
|
110
111
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
if (data.length === 0 || data.length > MEMORY_MAX_WRITE_BYTES) {
|
|
113
|
+
return {
|
|
114
|
+
success: false,
|
|
115
|
+
error: `Invalid write size: must be 1–${MEMORY_MAX_WRITE_BYTES} bytes`,
|
|
116
|
+
};
|
|
114
117
|
}
|
|
115
118
|
const addrHex = `0x${address.toString(16)}`;
|
|
119
|
+
try {
|
|
120
|
+
const { createPlatformProvider } = await import('../../../native/platform/factory.js');
|
|
121
|
+
const provider = createPlatformProvider();
|
|
122
|
+
const avail = await provider.checkAvailability();
|
|
123
|
+
if (avail.available) {
|
|
124
|
+
const handle = provider.openProcess(pid, true);
|
|
125
|
+
try {
|
|
126
|
+
const result = provider.writeMemory(handle, BigInt(address), data);
|
|
127
|
+
logger.debug('Native Mach memory write succeeded (zero-pause)');
|
|
128
|
+
return { success: true, bytesWritten: result.bytesWritten };
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
provider.closeProcess(handle);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (nativeErr) {
|
|
136
|
+
logger.debug('Native Mach write failed, falling back to lldb:', nativeErr);
|
|
137
|
+
}
|
|
116
138
|
const prot = await checkProtectionFn(pid, addrHex);
|
|
117
139
|
if (!prot.success) {
|
|
118
140
|
return { success: false, error: `Cannot verify memory region: ${prot.error}` };
|
|
@@ -138,8 +160,12 @@ async function writeMemoryMac(pid, address, data, checkProtectionFn) {
|
|
|
138
160
|
return { success: false, error: error instanceof Error ? error.message : String(error) };
|
|
139
161
|
}
|
|
140
162
|
}
|
|
163
|
+
const HEX_ADDR = /^(?:0x)?[0-9a-fA-F]{1,16}$/;
|
|
141
164
|
export async function writeMemory(platform, pid, address, data, encoding = 'hex', checkProtectionFn) {
|
|
142
165
|
try {
|
|
166
|
+
if (!HEX_ADDR.test(address)) {
|
|
167
|
+
return { success: false, error: 'Invalid address format. Use hex like "0x12345678"' };
|
|
168
|
+
}
|
|
143
169
|
const addrNum = parseInt(address, 16);
|
|
144
170
|
if (isNaN(addrNum)) {
|
|
145
171
|
return { success: false, error: 'Invalid address format' };
|
|
@@ -154,9 +180,15 @@ export async function writeMemory(platform, pid, address, data, encoding = 'hex'
|
|
|
154
180
|
buffer = Buffer.from(cleanHex, 'hex');
|
|
155
181
|
}
|
|
156
182
|
}
|
|
157
|
-
catch
|
|
183
|
+
catch {
|
|
158
184
|
return { success: false, error: `Invalid ${encoding} data` };
|
|
159
185
|
}
|
|
186
|
+
if (buffer.length === 0 || buffer.length > MEMORY_MAX_WRITE_BYTES) {
|
|
187
|
+
return {
|
|
188
|
+
success: false,
|
|
189
|
+
error: `Write size must be 1–${MEMORY_MAX_WRITE_BYTES} bytes (${(MEMORY_MAX_WRITE_BYTES / 1024).toFixed(0)} KB)`,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
160
192
|
if (platform === 'win32' && isKoffiAvailable()) {
|
|
161
193
|
try {
|
|
162
194
|
const result = await nativeMemoryManager.writeMemory(pid, address, data, encoding);
|
|
@@ -189,7 +221,15 @@ export async function writeMemory(platform, pid, address, data, encoding = 'hex'
|
|
|
189
221
|
return { success: false, error: error instanceof Error ? error.message : String(error) };
|
|
190
222
|
}
|
|
191
223
|
}
|
|
224
|
+
const MAX_BATCH_PATCHES = 1000;
|
|
192
225
|
export async function batchMemoryWrite(pid, patches, writeFn) {
|
|
226
|
+
if (patches.length > MAX_BATCH_PATCHES) {
|
|
227
|
+
return {
|
|
228
|
+
success: false,
|
|
229
|
+
results: [],
|
|
230
|
+
error: `Too many patches (${patches.length}), max ${MAX_BATCH_PATCHES}`,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
193
233
|
const results = [];
|
|
194
234
|
for (const patch of patches) {
|
|
195
235
|
const result = await writeFn(pid, patch.address, patch.data, patch.encoding || 'hex');
|
|
@@ -57,7 +57,13 @@ export class ExecutionSandbox {
|
|
|
57
57
|
const startTime = Date.now();
|
|
58
58
|
return new Promise((resolve) => {
|
|
59
59
|
let settled = false;
|
|
60
|
-
|
|
60
|
+
const terminationTimeout = setTimeout(() => {
|
|
61
|
+
if (!settled) {
|
|
62
|
+
void worker.terminate();
|
|
63
|
+
logger.warn(`[ExecutionSandbox] Worker terminated after ${timeoutMs + SANDBOX_TERMINATE_GRACE_MS}ms`);
|
|
64
|
+
finish({ ok: false, error: 'Execution timed out (worker terminated)', timedOut: true });
|
|
65
|
+
}
|
|
66
|
+
}, timeoutMs + SANDBOX_TERMINATE_GRACE_MS);
|
|
61
67
|
const workerOptions = {
|
|
62
68
|
eval: true,
|
|
63
69
|
workerData: {
|
|
@@ -80,13 +86,6 @@ export class ExecutionSandbox {
|
|
|
80
86
|
clearTimeout(terminationTimeout);
|
|
81
87
|
resolve({ ...result, durationMs: Date.now() - startTime });
|
|
82
88
|
};
|
|
83
|
-
terminationTimeout = setTimeout(() => {
|
|
84
|
-
if (!settled) {
|
|
85
|
-
void worker.terminate();
|
|
86
|
-
logger.warn(`[ExecutionSandbox] Worker terminated after ${timeoutMs + SANDBOX_TERMINATE_GRACE_MS}ms`);
|
|
87
|
-
finish({ ok: false, error: 'Execution timed out (worker terminated)', timedOut: true });
|
|
88
|
-
}
|
|
89
|
-
}, timeoutMs + SANDBOX_TERMINATE_GRACE_MS);
|
|
90
89
|
worker.on('message', (msg) => {
|
|
91
90
|
finish({
|
|
92
91
|
ok: msg.ok,
|
|
@@ -70,7 +70,7 @@ export class FingerprintManager {
|
|
|
70
70
|
throw new Error('fingerprint-injector not installed');
|
|
71
71
|
}
|
|
72
72
|
try {
|
|
73
|
-
const { newInjectedPage } = await import('fingerprint-injector');
|
|
73
|
+
const { newInjectedPage } = (await import('fingerprint-injector'));
|
|
74
74
|
const fp = 'fingerprint' in profile ? profile.fingerprint : profile;
|
|
75
75
|
await newInjectedPage(page, { fingerprint: fp });
|
|
76
76
|
logger.info('Fingerprint injected into page');
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { Page } from 'rebrowser-puppeteer-core';
|
|
1
|
+
import { type Page } from 'rebrowser-puppeteer-core';
|
|
2
2
|
export declare class StealthScripts {
|
|
3
|
-
|
|
3
|
+
protected constructor();
|
|
4
|
+
protected static injectedPages: WeakSet<object>;
|
|
4
5
|
static injectAll(page: Page): Promise<void>;
|
|
6
|
+
static injectTimingDefense(page: Page): Promise<void>;
|
|
5
7
|
static hideWebDriver(page: Page): Promise<void>;
|
|
6
8
|
static mockChrome(page: Page): Promise<void>;
|
|
7
9
|
static mockPlugins(page: Page): Promise<void>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {} from 'rebrowser-puppeteer-core';
|
|
2
2
|
import { logger } from '../../utils/logger.js';
|
|
3
3
|
export class StealthScripts {
|
|
4
|
+
constructor() { }
|
|
4
5
|
static injectedPages = new WeakSet();
|
|
5
6
|
static async injectAll(page) {
|
|
6
7
|
if (this.injectedPages.has(page)) {
|
|
@@ -20,9 +21,43 @@ export class StealthScripts {
|
|
|
20
21
|
this.fixMediaDevices(page),
|
|
21
22
|
this.mockNotifications(page),
|
|
22
23
|
]);
|
|
24
|
+
await this.injectTimingDefense(page);
|
|
23
25
|
this.injectedPages.add(page);
|
|
24
26
|
logger.info(' ');
|
|
25
27
|
}
|
|
28
|
+
static async injectTimingDefense(page) {
|
|
29
|
+
await page.evaluateOnNewDocument(() => {
|
|
30
|
+
const _originalPerfNow = performance.now.bind(performance);
|
|
31
|
+
const _originalDateNow = Date.now;
|
|
32
|
+
let _cdpOffset = 0;
|
|
33
|
+
performance.now = function () {
|
|
34
|
+
const win = window;
|
|
35
|
+
if (typeof win.__cdpTimingOffset === 'number') {
|
|
36
|
+
_cdpOffset = win.__cdpTimingOffset;
|
|
37
|
+
}
|
|
38
|
+
return _originalPerfNow() - _cdpOffset;
|
|
39
|
+
};
|
|
40
|
+
Date.now = function () {
|
|
41
|
+
const win = window;
|
|
42
|
+
if (typeof win.__cdpTimingOffset === 'number') {
|
|
43
|
+
_cdpOffset = win.__cdpTimingOffset;
|
|
44
|
+
}
|
|
45
|
+
return _originalDateNow.call(Date) - Math.floor(_cdpOffset);
|
|
46
|
+
};
|
|
47
|
+
const _OriginalDate = Date;
|
|
48
|
+
const _ProxiedDate = function (...args) {
|
|
49
|
+
if (args.length === 0) {
|
|
50
|
+
return new _OriginalDate(_OriginalDate.now());
|
|
51
|
+
}
|
|
52
|
+
return new _OriginalDate(...args);
|
|
53
|
+
};
|
|
54
|
+
_ProxiedDate.now = _OriginalDate.now;
|
|
55
|
+
_ProxiedDate.parse = _OriginalDate.parse.bind(_OriginalDate);
|
|
56
|
+
_ProxiedDate.UTC = _OriginalDate.UTC.bind(_OriginalDate);
|
|
57
|
+
Object.defineProperty(_ProxiedDate, 'prototype', { value: _OriginalDate.prototype });
|
|
58
|
+
globalThis.Date = _ProxiedDate;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
26
61
|
static async hideWebDriver(page) {
|
|
27
62
|
await page.evaluateOnNewDocument(() => {
|
|
28
63
|
const originalNavigator = navigator;
|
|
@@ -156,29 +191,33 @@ export class StealthScripts {
|
|
|
156
191
|
await page.evaluateOnNewDocument(() => {
|
|
157
192
|
const originalToDataURL = HTMLCanvasElement.prototype.toDataURL;
|
|
158
193
|
const originalGetImageData = CanvasRenderingContext2D.prototype.getImageData;
|
|
159
|
-
const addNoise = (imageData) => {
|
|
160
|
-
const data = imageData.data;
|
|
161
|
-
if (data) {
|
|
162
|
-
for (let i = 0; i < data.length; i += 4) {
|
|
163
|
-
data[i] = data[i] ^ 1;
|
|
164
|
-
data[i + 1] = data[i + 1] ^ 1;
|
|
165
|
-
data[i + 2] = data[i + 2] ^ 1;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
return imageData;
|
|
169
|
-
};
|
|
170
194
|
HTMLCanvasElement.prototype.toDataURL = function (...args) {
|
|
171
195
|
const context = this.getContext('2d');
|
|
172
196
|
if (context) {
|
|
173
197
|
const imageData = context.getImageData(0, 0, this.width, this.height);
|
|
174
|
-
|
|
198
|
+
const data = imageData.data;
|
|
199
|
+
if (data) {
|
|
200
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
201
|
+
data[i] = data[i] ^ 1;
|
|
202
|
+
data[i + 1] = data[i + 1] ^ 1;
|
|
203
|
+
data[i + 2] = data[i + 2] ^ 1;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
175
206
|
context.putImageData(imageData, 0, 0);
|
|
176
207
|
}
|
|
177
208
|
return originalToDataURL.apply(this, args);
|
|
178
209
|
};
|
|
179
210
|
CanvasRenderingContext2D.prototype.getImageData = function (...args) {
|
|
180
211
|
const imageData = originalGetImageData.apply(this, args);
|
|
181
|
-
|
|
212
|
+
const data = imageData.data;
|
|
213
|
+
if (data) {
|
|
214
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
215
|
+
data[i] = data[i] ^ 1;
|
|
216
|
+
data[i + 1] = data[i + 1] ^ 1;
|
|
217
|
+
data[i + 2] = data[i + 2] ^ 1;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return imageData;
|
|
182
221
|
};
|
|
183
222
|
});
|
|
184
223
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {} from 'rebrowser-puppeteer-core';
|
|
2
2
|
export class StealthVerifier {
|
|
3
3
|
async verify(page) {
|
|
4
4
|
const checks = await page.evaluate(() => {
|
|
@@ -18,9 +18,7 @@ export class StealthVerifier {
|
|
|
18
18
|
expected: 'object',
|
|
19
19
|
actual: typeof win.chrome,
|
|
20
20
|
});
|
|
21
|
-
const chromeApp = hasChrome
|
|
22
|
-
? win.chrome.app
|
|
23
|
-
: null;
|
|
21
|
+
const chromeApp = hasChrome ? win.chrome.app : null;
|
|
24
22
|
const hasAppIsInstalled = chromeApp && typeof chromeApp === 'object' && 'isInstalled' in chromeApp;
|
|
25
23
|
results.push({
|
|
26
24
|
name: 'chrome.app.isInstalled',
|
|
@@ -59,6 +59,20 @@ export declare class JSVMPSymbolicExecutor extends SymbolicExecutor {
|
|
|
59
59
|
private executeAdd;
|
|
60
60
|
private executeSub;
|
|
61
61
|
private executeMul;
|
|
62
|
+
private executeDiv;
|
|
63
|
+
private executeMod;
|
|
64
|
+
private executeAnd;
|
|
65
|
+
private executeOr;
|
|
66
|
+
private executeNot;
|
|
67
|
+
private executeXor;
|
|
68
|
+
private executeEq;
|
|
69
|
+
private executeNe;
|
|
70
|
+
private executeLt;
|
|
71
|
+
private executeLe;
|
|
72
|
+
private executeGt;
|
|
73
|
+
private executeGe;
|
|
74
|
+
private executeJnz;
|
|
75
|
+
private executeDup;
|
|
62
76
|
private executeLoad;
|
|
63
77
|
private executeStore;
|
|
64
78
|
private executeJZ;
|
|
@@ -61,7 +61,7 @@ export class JSVMPSymbolicExecutor extends SymbolicExecutor {
|
|
|
61
61
|
break;
|
|
62
62
|
}
|
|
63
63
|
executionTrace.push(this.cloneStateInternal(state));
|
|
64
|
-
state = this.executeInstruction(state, instruction);
|
|
64
|
+
state = this.executeInstruction(state, instruction, instructions);
|
|
65
65
|
if (instruction.opcode === JSVMPOpcode.HALT) {
|
|
66
66
|
break;
|
|
67
67
|
}
|
|
@@ -88,7 +88,7 @@ export class JSVMPSymbolicExecutor extends SymbolicExecutor {
|
|
|
88
88
|
throw error;
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
-
executeInstruction(state, instruction) {
|
|
91
|
+
executeInstruction(state, instruction, instructions) {
|
|
92
92
|
const newState = this.cloneStateInternal(state);
|
|
93
93
|
switch (instruction.opcode) {
|
|
94
94
|
case JSVMPOpcode.PUSH:
|
|
@@ -106,6 +106,55 @@ export class JSVMPSymbolicExecutor extends SymbolicExecutor {
|
|
|
106
106
|
case JSVMPOpcode.MUL:
|
|
107
107
|
this.executeMul(newState);
|
|
108
108
|
break;
|
|
109
|
+
case JSVMPOpcode.DIV:
|
|
110
|
+
this.executeDiv(newState);
|
|
111
|
+
break;
|
|
112
|
+
case JSVMPOpcode.MOD:
|
|
113
|
+
this.executeMod(newState);
|
|
114
|
+
break;
|
|
115
|
+
case JSVMPOpcode.AND:
|
|
116
|
+
this.executeAnd(newState);
|
|
117
|
+
break;
|
|
118
|
+
case JSVMPOpcode.OR:
|
|
119
|
+
this.executeOr(newState);
|
|
120
|
+
break;
|
|
121
|
+
case JSVMPOpcode.NOT:
|
|
122
|
+
this.executeNot(newState);
|
|
123
|
+
break;
|
|
124
|
+
case JSVMPOpcode.XOR:
|
|
125
|
+
this.executeXor(newState);
|
|
126
|
+
break;
|
|
127
|
+
case JSVMPOpcode.EQ:
|
|
128
|
+
this.executeEq(newState);
|
|
129
|
+
break;
|
|
130
|
+
case JSVMPOpcode.NE:
|
|
131
|
+
this.executeNe(newState);
|
|
132
|
+
break;
|
|
133
|
+
case JSVMPOpcode.LT:
|
|
134
|
+
this.executeLt(newState);
|
|
135
|
+
break;
|
|
136
|
+
case JSVMPOpcode.LE:
|
|
137
|
+
this.executeLe(newState);
|
|
138
|
+
break;
|
|
139
|
+
case JSVMPOpcode.GT:
|
|
140
|
+
this.executeGt(newState);
|
|
141
|
+
break;
|
|
142
|
+
case JSVMPOpcode.GE:
|
|
143
|
+
this.executeGe(newState);
|
|
144
|
+
break;
|
|
145
|
+
case JSVMPOpcode.JNZ:
|
|
146
|
+
this.executeJnz(newState, this.asNumberOperand(instruction.operands[0]));
|
|
147
|
+
return newState;
|
|
148
|
+
case JSVMPOpcode.RET:
|
|
149
|
+
newState.pc = instructions.length;
|
|
150
|
+
return newState;
|
|
151
|
+
case JSVMPOpcode.DUP:
|
|
152
|
+
this.executeDup(newState);
|
|
153
|
+
break;
|
|
154
|
+
case JSVMPOpcode.LOAD_CONST:
|
|
155
|
+
this.executePush(newState, instruction.operands[0]);
|
|
156
|
+
newState.pc++;
|
|
157
|
+
return newState;
|
|
109
158
|
case JSVMPOpcode.LOAD:
|
|
110
159
|
this.executeLoad(newState, this.asStringOperand(instruction.operands[0]));
|
|
111
160
|
break;
|
|
@@ -168,6 +217,136 @@ export class JSVMPSymbolicExecutor extends SymbolicExecutor {
|
|
|
168
217
|
state.stack.push(result);
|
|
169
218
|
}
|
|
170
219
|
}
|
|
220
|
+
executeDiv(state) {
|
|
221
|
+
const b = state.stack.pop();
|
|
222
|
+
const a = state.stack.pop();
|
|
223
|
+
if (a && b) {
|
|
224
|
+
const result = this.createSymbolicValue('number', `${a.name} / ${b.name}`);
|
|
225
|
+
this.addConstraint(result, 'custom', `${result.name} = ${a.name} / ${b.name}`, '');
|
|
226
|
+
state.stack.push(result);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
executeMod(state) {
|
|
230
|
+
const b = state.stack.pop();
|
|
231
|
+
const a = state.stack.pop();
|
|
232
|
+
if (a && b) {
|
|
233
|
+
const result = this.createSymbolicValue('number', `${a.name} % ${b.name}`);
|
|
234
|
+
this.addConstraint(result, 'custom', `${result.name} = ${a.name} % ${b.name}`, '');
|
|
235
|
+
state.stack.push(result);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
executeAnd(state) {
|
|
239
|
+
const b = state.stack.pop();
|
|
240
|
+
const a = state.stack.pop();
|
|
241
|
+
if (a && b) {
|
|
242
|
+
const result = this.createSymbolicValue('boolean', `${a.name} && ${b.name}`);
|
|
243
|
+
this.addConstraint(result, 'custom', `${result.name} = ${a.name} && ${b.name}`, '');
|
|
244
|
+
state.stack.push(result);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
executeOr(state) {
|
|
248
|
+
const b = state.stack.pop();
|
|
249
|
+
const a = state.stack.pop();
|
|
250
|
+
if (a && b) {
|
|
251
|
+
const result = this.createSymbolicValue('boolean', `${a.name} || ${b.name}`);
|
|
252
|
+
this.addConstraint(result, 'custom', `${result.name} = ${a.name} || ${b.name}`, '');
|
|
253
|
+
state.stack.push(result);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
executeNot(state) {
|
|
257
|
+
const a = state.stack.pop();
|
|
258
|
+
if (a) {
|
|
259
|
+
const result = this.createSymbolicValue('boolean', `!${a.name}`);
|
|
260
|
+
this.addConstraint(result, 'custom', `${result.name} = !${a.name}`, '');
|
|
261
|
+
state.stack.push(result);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
executeXor(state) {
|
|
265
|
+
const b = state.stack.pop();
|
|
266
|
+
const a = state.stack.pop();
|
|
267
|
+
if (a && b) {
|
|
268
|
+
const result = this.createSymbolicValue('boolean', `${a.name} ^ ${b.name}`);
|
|
269
|
+
this.addConstraint(result, 'custom', `${result.name} = ${a.name} ^ ${b.name}`, '');
|
|
270
|
+
state.stack.push(result);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
executeEq(state) {
|
|
274
|
+
const b = state.stack.pop();
|
|
275
|
+
const a = state.stack.pop();
|
|
276
|
+
if (a && b) {
|
|
277
|
+
const result = this.createSymbolicValue('boolean', `${a.name} === ${b.name}`);
|
|
278
|
+
this.addConstraint(result, 'custom', `${result.name} = ${a.name} === ${b.name}`, '');
|
|
279
|
+
state.stack.push(result);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
executeNe(state) {
|
|
283
|
+
const b = state.stack.pop();
|
|
284
|
+
const a = state.stack.pop();
|
|
285
|
+
if (a && b) {
|
|
286
|
+
const result = this.createSymbolicValue('boolean', `${a.name} !== ${b.name}`);
|
|
287
|
+
this.addConstraint(result, 'custom', `${result.name} = ${a.name} !== ${b.name}`, '');
|
|
288
|
+
state.stack.push(result);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
executeLt(state) {
|
|
292
|
+
const b = state.stack.pop();
|
|
293
|
+
const a = state.stack.pop();
|
|
294
|
+
if (a && b) {
|
|
295
|
+
const result = this.createSymbolicValue('boolean', `${a.name} < ${b.name}`);
|
|
296
|
+
this.addConstraint(result, 'custom', `${result.name} = ${a.name} < ${b.name}`, '');
|
|
297
|
+
state.stack.push(result);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
executeLe(state) {
|
|
301
|
+
const b = state.stack.pop();
|
|
302
|
+
const a = state.stack.pop();
|
|
303
|
+
if (a && b) {
|
|
304
|
+
const result = this.createSymbolicValue('boolean', `${a.name} <= ${b.name}`);
|
|
305
|
+
this.addConstraint(result, 'custom', `${result.name} = ${a.name} <= ${b.name}`, '');
|
|
306
|
+
state.stack.push(result);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
executeGt(state) {
|
|
310
|
+
const b = state.stack.pop();
|
|
311
|
+
const a = state.stack.pop();
|
|
312
|
+
if (a && b) {
|
|
313
|
+
const result = this.createSymbolicValue('boolean', `${a.name} > ${b.name}`);
|
|
314
|
+
this.addConstraint(result, 'custom', `${result.name} = ${a.name} > ${b.name}`, '');
|
|
315
|
+
state.stack.push(result);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
executeGe(state) {
|
|
319
|
+
const b = state.stack.pop();
|
|
320
|
+
const a = state.stack.pop();
|
|
321
|
+
if (a && b) {
|
|
322
|
+
const result = this.createSymbolicValue('boolean', `${a.name} >= ${b.name}`);
|
|
323
|
+
this.addConstraint(result, 'custom', `${result.name} = ${a.name} >= ${b.name}`, '');
|
|
324
|
+
state.stack.push(result);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
executeJnz(state, target) {
|
|
328
|
+
const condition = state.stack.pop();
|
|
329
|
+
if (condition) {
|
|
330
|
+
const constraint = {
|
|
331
|
+
type: 'inequality',
|
|
332
|
+
expression: `${condition.name} != 0`,
|
|
333
|
+
description: '',
|
|
334
|
+
};
|
|
335
|
+
state.pathConstraints.push(constraint);
|
|
336
|
+
state.pc = target;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
executeDup(state) {
|
|
340
|
+
const value = state.stack[state.stack.length - 1];
|
|
341
|
+
if (value) {
|
|
342
|
+
const dup = this.createSymbolicValue(value.type, value.name, value.source);
|
|
343
|
+
dup.constraints = [...value.constraints];
|
|
344
|
+
if (value.possibleValues) {
|
|
345
|
+
dup.possibleValues = [...value.possibleValues];
|
|
346
|
+
}
|
|
347
|
+
state.stack.push(dup);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
171
350
|
executeLoad(state, varName) {
|
|
172
351
|
const value = state.memory.get(varName);
|
|
173
352
|
if (value) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { formatBetterSqlite3Error } from '../../utils/betterSqlite3.js';
|
|
1
2
|
let Database;
|
|
2
3
|
try {
|
|
3
4
|
Database = require('better-sqlite3');
|
|
@@ -19,9 +20,14 @@ export class TraceDB {
|
|
|
19
20
|
constructor(options) {
|
|
20
21
|
this.options = options;
|
|
21
22
|
if (!Database) {
|
|
22
|
-
throw new Error(
|
|
23
|
+
throw new Error(formatBetterSqlite3Error(new Error("Cannot find package 'better-sqlite3'")));
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
this.db = new Database(options.dbPath);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
throw new Error(formatBetterSqlite3Error(error), { cause: error });
|
|
23
30
|
}
|
|
24
|
-
this.db = new Database(options.dbPath);
|
|
25
31
|
this.batchSize = options.batchSize ?? 200;
|
|
26
32
|
this.db.pragma('journal_mode = WAL');
|
|
27
33
|
this.db.pragma('synchronous = NORMAL');
|
|
@@ -138,7 +144,7 @@ export class TraceDB {
|
|
|
138
144
|
return { columns, rows: [], rowCount: 0 };
|
|
139
145
|
}
|
|
140
146
|
const columns = Object.keys(rows[0]);
|
|
141
|
-
const rowArrays = rows.map(row => columns.map(col => row[col]));
|
|
147
|
+
const rowArrays = rows.map((row) => columns.map((col) => row[col]));
|
|
142
148
|
return { columns, rows: rowArrays, rowCount: rows.length };
|
|
143
149
|
}
|
|
144
150
|
getEventsByTimeRange(start, end) {
|
|
@@ -150,7 +156,7 @@ export class TraceDB {
|
|
|
150
156
|
WHERE timestamp >= ? AND timestamp <= ?
|
|
151
157
|
ORDER BY timestamp ASC
|
|
152
158
|
`);
|
|
153
|
-
return stmt.all(start, end).map(row => ({
|
|
159
|
+
return stmt.all(start, end).map((row) => ({
|
|
154
160
|
id: row['id'],
|
|
155
161
|
timestamp: row['timestamp'],
|
|
156
162
|
category: row['category'],
|
|
@@ -169,7 +175,7 @@ export class TraceDB {
|
|
|
169
175
|
WHERE address = ?
|
|
170
176
|
ORDER BY timestamp ASC
|
|
171
177
|
`);
|
|
172
|
-
return stmt.all(address).map(row => ({
|
|
178
|
+
return stmt.all(address).map((row) => ({
|
|
173
179
|
id: row['id'],
|
|
174
180
|
timestamp: row['timestamp'],
|
|
175
181
|
address: row['address'],
|
|
@@ -186,7 +192,7 @@ export class TraceDB {
|
|
|
186
192
|
FROM heap_snapshots
|
|
187
193
|
ORDER BY timestamp ASC
|
|
188
194
|
`);
|
|
189
|
-
return stmt.all().map(row => ({
|
|
195
|
+
return stmt.all().map((row) => ({
|
|
190
196
|
id: row['id'],
|
|
191
197
|
timestamp: row['timestamp'],
|
|
192
198
|
snapshotData: row['snapshot_data'],
|