@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.
Files changed (414) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +15 -6
  3. package/README.zh.md +19 -4
  4. package/dist/native/scripts/linux/enum-windows.sh +12 -12
  5. package/dist/native/scripts/macos/enum-windows.applescript +22 -22
  6. package/dist/native/scripts/windows/enum-windows-by-class.ps1 +51 -51
  7. package/dist/native/scripts/windows/enum-windows.ps1 +44 -44
  8. package/dist/native/scripts/windows/inject-dll.ps1 +21 -21
  9. package/dist/packages/extension-sdk/src/bridges/shared.js +2 -2
  10. package/dist/packages/extension-sdk/src/plugin.d.ts +5 -0
  11. package/dist/packages/extension-sdk/src/plugin.js +119 -33
  12. package/dist/packages/extension-sdk/src/workflow.d.ts +156 -0
  13. package/dist/packages/extension-sdk/src/workflow.js +236 -0
  14. package/dist/src/config/search-defaults.js +161 -0
  15. package/dist/src/constants.d.ts +3 -0
  16. package/dist/src/constants.js +4 -1
  17. package/dist/src/index.d.ts +1 -1
  18. package/dist/src/index.js +13 -17
  19. package/dist/src/modules/analyzer/CodeAnalyzer.d.ts +1 -3
  20. package/dist/src/modules/analyzer/CodeAnalyzer.js +16 -28
  21. package/dist/src/modules/analyzer/CodeAnalyzerDataFlow.d.ts +1 -2
  22. package/dist/src/modules/analyzer/CodeAnalyzerDataFlow.js +1 -45
  23. package/dist/src/modules/analyzer/IntelligentAnalyzer.d.ts +1 -37
  24. package/dist/src/modules/analyzer/IntelligentAnalyzer.js +9 -142
  25. package/dist/src/modules/analyzer/PatternDetector.js +3 -3
  26. package/dist/src/modules/analyzer/PatternDetectorAuthPatterns.js +1 -1
  27. package/dist/src/modules/browser/BrowserDiscovery.d.ts +6 -5
  28. package/dist/src/modules/browser/BrowserDiscovery.js +3 -3
  29. package/dist/src/modules/browser/BrowserModeManager.d.ts +1 -1
  30. package/dist/src/modules/browser/BrowserModeManager.js +11 -10
  31. package/dist/src/modules/browser/TabRegistry.js +2 -2
  32. package/dist/src/modules/browser/UnifiedBrowserManager.d.ts +1 -0
  33. package/dist/src/modules/browser/UnifiedBrowserManager.js +19 -4
  34. package/dist/src/modules/captcha/AICaptchaDetector.d.ts +14 -23
  35. package/dist/src/modules/captcha/AICaptchaDetector.js +8 -202
  36. package/dist/src/modules/captcha/CaptchaDetector.d.ts +31 -17
  37. package/dist/src/modules/captcha/CaptchaDetector.js +1 -1
  38. package/dist/src/modules/collector/CodeCache.d.ts +2 -2
  39. package/dist/src/modules/collector/CodeCollector.d.ts +12 -9
  40. package/dist/src/modules/collector/CodeCollector.js +5 -6
  41. package/dist/src/modules/collector/DOMInspector.d.ts +3 -2
  42. package/dist/src/modules/collector/DOMInspector.js +49 -59
  43. package/dist/src/modules/collector/PageController.d.ts +17 -4
  44. package/dist/src/modules/collector/PageController.js +2 -5
  45. package/dist/src/modules/collector/PageScriptCollectors.js +3 -3
  46. package/dist/src/modules/crypto/CryptoDetector.d.ts +1 -4
  47. package/dist/src/modules/crypto/CryptoDetector.js +2 -42
  48. package/dist/src/modules/crypto/CryptoRules.js +1 -1
  49. package/dist/src/modules/debugger/BlackboxManager.js +1 -1
  50. package/dist/src/modules/debugger/DebuggerManager.impl.core.scope.js +1 -1
  51. package/dist/src/modules/debugger/ScriptManager.impl.extract-function-tree.js +5 -3
  52. package/dist/src/modules/debugger/WatchExpressionManager.js +1 -1
  53. package/dist/src/modules/deobfuscator/Deobfuscator.d.ts +1 -4
  54. package/dist/src/modules/deobfuscator/Deobfuscator.js +4 -39
  55. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.d.ts +0 -3
  56. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.js +2 -8
  57. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.d.ts +2 -3
  58. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.js +5 -57
  59. package/dist/src/modules/deobfuscator/JScramblerDeobfuscator.js +3 -4
  60. package/dist/src/modules/deobfuscator/PackerDeobfuscator.js +1 -1
  61. package/dist/src/modules/deobfuscator/VMDeobfuscator.d.ts +2 -10
  62. package/dist/src/modules/deobfuscator/VMDeobfuscator.js +3 -128
  63. package/dist/src/modules/deobfuscator/webcrack.js +15 -2
  64. package/dist/src/modules/emulator/AIEnvironmentAnalyzer.d.ts +5 -8
  65. package/dist/src/modules/emulator/AIEnvironmentAnalyzer.js +10 -102
  66. package/dist/src/modules/emulator/EnvironmentEmulator.d.ts +1 -5
  67. package/dist/src/modules/emulator/EnvironmentEmulator.js +7 -91
  68. package/dist/src/modules/emulator/EnvironmentEmulatorFetch.js +58 -61
  69. package/dist/src/modules/emulator/templates/chrome-env.d.ts +17 -7
  70. package/dist/src/modules/emulator/templates/chrome-env.js +14 -7
  71. package/dist/src/modules/external/ExternalToolRunner.d.ts +1 -1
  72. package/dist/src/modules/external/ExternalToolRunner.js +26 -23
  73. package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.d.ts +13 -0
  74. package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.js +42 -0
  75. package/dist/src/modules/monitor/FetchInterceptor.d.ts +46 -0
  76. package/dist/src/modules/monitor/FetchInterceptor.js +191 -0
  77. package/dist/src/modules/monitor/PerformanceMonitor.js +8 -7
  78. package/dist/src/modules/process/BaseMemoryManager.d.ts +1 -1
  79. package/dist/src/modules/process/LinuxProcessManager.js +4 -2
  80. package/dist/src/modules/process/MacProcessManager.js +1 -1
  81. package/dist/src/modules/process/MemoryManager.d.ts +1 -1
  82. package/dist/src/modules/process/MemoryManager.js +2 -2
  83. package/dist/src/modules/process/ProcessManager.impl.js +1 -1
  84. package/dist/src/modules/process/memory/AuditTrail.js +1 -1
  85. package/dist/src/modules/process/memory/reader.js +35 -3
  86. package/dist/src/modules/process/memory/regions.enumerate.js +1 -1
  87. package/dist/src/modules/process/memory/regions.protection.js +42 -9
  88. package/dist/src/modules/process/memory/scanner.d.ts +5 -1
  89. package/dist/src/modules/process/memory/scanner.darwin.js +57 -0
  90. package/dist/src/modules/process/memory/scanner.js +88 -4
  91. package/dist/src/modules/process/memory/writer.js +44 -4
  92. package/dist/src/modules/security/ExecutionSandbox.js +7 -8
  93. package/dist/src/modules/stealth/FingerprintManager.js +1 -1
  94. package/dist/src/modules/stealth/StealthScripts.d.ts +4 -2
  95. package/dist/src/modules/stealth/StealthScripts.js +53 -14
  96. package/dist/src/modules/stealth/StealthVerifier.d.ts +1 -1
  97. package/dist/src/modules/stealth/StealthVerifier.js +2 -4
  98. package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.d.ts +14 -0
  99. package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.js +181 -2
  100. package/dist/src/modules/trace/TraceDB.js +12 -6
  101. package/dist/src/modules/trace/TraceRecorder.js +1 -5
  102. package/dist/src/native/AntiCheatDetector.js +67 -16
  103. package/dist/src/native/CodeInjector.js +4 -4
  104. package/dist/src/native/HardwareBreakpoint.js +25 -16
  105. package/dist/src/native/HeapAnalyzer.js +2 -2
  106. package/dist/src/native/MemoryController.js +1 -1
  107. package/dist/src/native/MemoryScanSession.js +2 -2
  108. package/dist/src/native/MemoryScanner.js +4 -8
  109. package/dist/src/native/NativeMemoryManager.impl.js +2 -2
  110. package/dist/src/native/PEAnalyzer.js +14 -15
  111. package/dist/src/native/PointerChainEngine.js +2 -4
  112. package/dist/src/native/ScriptLoader.js +4 -9
  113. package/dist/src/native/Speedhack.js +1 -1
  114. package/dist/src/native/StructureAnalyzer.js +52 -33
  115. package/dist/src/native/Win32API.d.ts +1 -0
  116. package/dist/src/native/Win32API.js +13 -0
  117. package/dist/src/native/Win32Debug.js +19 -19
  118. package/dist/src/native/platform/darwin/DarwinAPI.d.ts +2 -0
  119. package/dist/src/native/platform/darwin/DarwinAPI.js +8 -0
  120. package/dist/src/native/platform/darwin/DarwinMemoryProvider.js +6 -1
  121. package/dist/src/server/MCPServer.context.d.ts +2 -1
  122. package/dist/src/server/MCPServer.d.ts +2 -1
  123. package/dist/src/server/MCPServer.domain.d.ts +1 -1
  124. package/dist/src/server/MCPServer.domain.js +81 -16
  125. package/dist/src/server/MCPServer.js +42 -14
  126. package/dist/src/server/MCPServer.resources.d.ts +2 -0
  127. package/dist/src/server/MCPServer.resources.js +91 -0
  128. package/dist/src/server/MCPServer.search.handlers.call.js +2 -1
  129. package/dist/src/server/MCPServer.search.helpers.js +2 -2
  130. package/dist/src/server/MCPServer.tools.js +1 -1
  131. package/dist/src/server/MCPServer.transport.js +12 -0
  132. package/dist/src/server/ToolCallContextGuard.d.ts +5 -0
  133. package/dist/src/server/ToolCallContextGuard.js +85 -0
  134. package/dist/src/server/ToolRouter.d.ts +26 -10
  135. package/dist/src/server/ToolRouter.intent.d.ts +26 -0
  136. package/dist/src/server/ToolRouter.intent.js +77 -0
  137. package/dist/src/server/ToolRouter.js +103 -284
  138. package/dist/src/server/ToolRouter.policy.d.ts +22 -0
  139. package/dist/src/server/ToolRouter.policy.js +163 -0
  140. package/dist/src/server/ToolRouter.probe.d.ts +17 -0
  141. package/dist/src/server/ToolRouter.probe.js +103 -0
  142. package/dist/src/server/ToolRouter.renderer.d.ts +9 -0
  143. package/dist/src/server/ToolRouter.renderer.js +52 -0
  144. package/dist/src/server/activation/ActivationController.js +15 -12
  145. package/dist/src/server/activation/CompoundConditionEngine.js +1 -1
  146. package/dist/src/server/activation/PredictiveBooster.js +1 -3
  147. package/dist/src/server/domains/analysis/definitions.js +155 -655
  148. package/dist/src/server/domains/analysis/handlers.impl.d.ts +8 -8
  149. package/dist/src/server/domains/analysis/handlers.impl.js +34 -28
  150. package/dist/src/server/domains/analysis/handlers.web-tools.js +4 -3
  151. package/dist/src/server/domains/analysis/manifest.js +6 -4
  152. package/dist/src/server/domains/antidebug/definitions.js +25 -111
  153. package/dist/src/server/domains/browser/definitions.tools.advanced.js +59 -88
  154. package/dist/src/server/domains/browser/definitions.tools.behavior.js +120 -227
  155. package/dist/src/server/domains/browser/definitions.tools.page-core.js +157 -386
  156. package/dist/src/server/domains/browser/definitions.tools.page-system.js +108 -250
  157. package/dist/src/server/domains/browser/definitions.tools.runtime.js +61 -174
  158. package/dist/src/server/domains/browser/definitions.tools.security.js +92 -237
  159. package/dist/src/server/domains/browser/handlers/camoufox-browser.js +3 -2
  160. package/dist/src/server/domains/browser/handlers/captcha-solver.js +3 -3
  161. package/dist/src/server/domains/browser/handlers/dom-query.js +2 -1
  162. package/dist/src/server/domains/browser/handlers/facade-initializer.d.ts +3 -3
  163. package/dist/src/server/domains/browser/handlers/facade-initializer.js +3 -3
  164. package/dist/src/server/domains/browser/handlers/framework-state.js +231 -3
  165. package/dist/src/server/domains/browser/handlers/indexeddb-dump.js +21 -20
  166. package/dist/src/server/domains/browser/handlers/script-management.js +1 -1
  167. package/dist/src/server/domains/browser/handlers/stealth-injection.js +8 -2
  168. package/dist/src/server/domains/browser/handlers.impl.d.ts +15 -12
  169. package/dist/src/server/domains/browser/handlers.impl.js +5 -6
  170. package/dist/src/server/domains/browser/manifest.js +37 -13
  171. package/dist/src/server/domains/coordination/definitions.js +50 -149
  172. package/dist/src/server/domains/coordination/index.d.ts +20 -1
  173. package/dist/src/server/domains/coordination/index.js +133 -0
  174. package/dist/src/server/domains/coordination/manifest.js +15 -0
  175. package/dist/src/server/domains/debugger/definitions.tools.advanced.js +72 -189
  176. package/dist/src/server/domains/debugger/definitions.tools.core.js +114 -288
  177. package/dist/src/server/domains/debugger/manifest.js +9 -2
  178. package/dist/src/server/domains/encoding/definitions.js +43 -153
  179. package/dist/src/server/domains/encoding/handlers.base.js +2 -2
  180. package/dist/src/server/domains/evidence/definitions.d.ts +2 -0
  181. package/dist/src/server/domains/evidence/definitions.js +42 -0
  182. package/dist/src/server/domains/evidence/handlers.d.ts +582 -0
  183. package/dist/src/server/domains/evidence/handlers.js +60 -0
  184. package/dist/src/server/domains/evidence/index.d.ts +2 -0
  185. package/dist/src/server/domains/evidence/index.js +2 -0
  186. package/dist/src/server/domains/evidence/manifest.d.ts +63 -0
  187. package/dist/src/server/domains/evidence/manifest.js +78 -0
  188. package/dist/src/server/domains/graphql/definitions.js +53 -141
  189. package/dist/src/server/domains/graphql/handlers.impl.core.runtime.replay.js +92 -114
  190. package/dist/src/server/domains/hooks/ai-handlers.d.ts +0 -7
  191. package/dist/src/server/domains/hooks/ai-handlers.js +4 -70
  192. package/dist/src/server/domains/hooks/definitions.js +69 -335
  193. package/dist/src/server/domains/hooks/manifest.d.ts +1 -1
  194. package/dist/src/server/domains/hooks/manifest.js +1 -2
  195. package/dist/src/server/domains/instrumentation/definitions.d.ts +2 -0
  196. package/dist/src/server/domains/instrumentation/definitions.js +99 -0
  197. package/dist/src/server/domains/instrumentation/handlers.d.ts +78 -0
  198. package/dist/src/server/domains/instrumentation/handlers.js +206 -0
  199. package/dist/src/server/domains/instrumentation/index.d.ts +2 -0
  200. package/dist/src/server/domains/instrumentation/index.js +2 -0
  201. package/dist/src/server/domains/instrumentation/manifest.d.ts +63 -0
  202. package/dist/src/server/domains/instrumentation/manifest.js +114 -0
  203. package/dist/src/server/domains/macro/definitions.js +16 -43
  204. package/dist/src/server/domains/maintenance/definitions.js +60 -219
  205. package/dist/src/server/domains/maintenance/handlers.d.ts +2 -2
  206. package/dist/src/server/domains/maintenance/handlers.extensions.js +78 -20
  207. package/dist/src/server/domains/maintenance/handlers.js +2 -2
  208. package/dist/src/server/domains/memory/definitions.js +387 -559
  209. package/dist/src/server/domains/memory/handlers/hooks.d.ts +55 -0
  210. package/dist/src/server/domains/memory/handlers/hooks.js +115 -0
  211. package/dist/src/server/domains/memory/handlers/integrity.d.ts +77 -0
  212. package/dist/src/server/domains/memory/handlers/integrity.js +180 -0
  213. package/dist/src/server/domains/memory/handlers/pointer-chain.d.ts +29 -0
  214. package/dist/src/server/domains/memory/handlers/pointer-chain.js +82 -0
  215. package/dist/src/server/domains/memory/handlers/readwrite.d.ts +41 -0
  216. package/dist/src/server/domains/memory/handlers/readwrite.js +78 -0
  217. package/dist/src/server/domains/memory/handlers/scan.d.ts +35 -0
  218. package/dist/src/server/domains/memory/handlers/scan.js +97 -0
  219. package/dist/src/server/domains/memory/handlers/session.d.ts +23 -0
  220. package/dist/src/server/domains/memory/handlers/session.js +49 -0
  221. package/dist/src/server/domains/memory/handlers/structure.d.ts +29 -0
  222. package/dist/src/server/domains/memory/handlers/structure.js +74 -0
  223. package/dist/src/server/domains/memory/handlers.impl.d.ts +49 -54
  224. package/dist/src/server/domains/memory/handlers.impl.js +63 -494
  225. package/dist/src/server/domains/memory/manifest.js +236 -64
  226. package/dist/src/server/domains/native-bridge/definitions.js +54 -192
  227. package/dist/src/server/domains/native-bridge/index.d.ts +1 -0
  228. package/dist/src/server/domains/native-bridge/index.js +2 -1
  229. package/dist/src/server/domains/network/auth-extractor.js +1 -1
  230. package/dist/src/server/domains/network/definitions.js +175 -578
  231. package/dist/src/server/domains/network/handlers.base.core.d.ts +64 -0
  232. package/dist/src/server/domains/network/handlers.base.core.js +623 -0
  233. package/dist/src/server/domains/network/handlers.base.d.ts +2 -124
  234. package/dist/src/server/domains/network/handlers.base.js +3 -878
  235. package/dist/src/server/domains/network/handlers.base.performance.d.ts +63 -0
  236. package/dist/src/server/domains/network/handlers.base.performance.js +193 -0
  237. package/dist/src/server/domains/network/handlers.base.types.d.ts +42 -0
  238. package/dist/src/server/domains/network/handlers.base.types.js +89 -0
  239. package/dist/src/server/domains/network/handlers.impl.core.runtime.d.ts +1 -1
  240. package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.d.ts +21 -0
  241. package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.js +186 -0
  242. package/dist/src/server/domains/network/handlers.impl.core.runtime.js +1 -1
  243. package/dist/src/server/domains/network/manifest.js +15 -0
  244. package/dist/src/server/domains/network/replay.js +1 -4
  245. package/dist/src/server/domains/platform/definitions.js +121 -112
  246. package/dist/src/server/domains/platform/handlers/bridge-handlers.d.ts +5 -1
  247. package/dist/src/server/domains/platform/handlers/bridge-handlers.js +194 -5
  248. package/dist/src/server/domains/platform/handlers/electron-asar-helpers.js +26 -6
  249. package/dist/src/server/domains/platform/handlers/electron-dual-cdp.d.ts +3 -0
  250. package/dist/src/server/domains/platform/handlers/electron-dual-cdp.js +170 -0
  251. package/dist/src/server/domains/platform/handlers/electron-fuse-handler.d.ts +3 -0
  252. package/dist/src/server/domains/platform/handlers/electron-fuse-handler.js +193 -0
  253. package/dist/src/server/domains/platform/handlers/electron-handlers.d.ts +6 -0
  254. package/dist/src/server/domains/platform/handlers/electron-handlers.js +95 -2
  255. package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.d.ts +2 -0
  256. package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.js +370 -0
  257. package/dist/src/server/domains/platform/handlers/electron-userdata-handler.d.ts +2 -0
  258. package/dist/src/server/domains/platform/handlers/electron-userdata-handler.js +78 -0
  259. package/dist/src/server/domains/platform/handlers/miniapp-handlers.d.ts +1 -1
  260. package/dist/src/server/domains/platform/handlers/miniapp-handlers.js +4 -4
  261. package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.d.ts +2 -0
  262. package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.js +207 -0
  263. package/dist/src/server/domains/platform/handlers.d.ts +48 -0
  264. package/dist/src/server/domains/platform/handlers.js +29 -0
  265. package/dist/src/server/domains/platform/manifest.js +38 -0
  266. package/dist/src/server/domains/process/definitions.js +163 -647
  267. package/dist/src/server/domains/process/handlers.base.d.ts +3 -95
  268. package/dist/src/server/domains/process/handlers.base.js +7 -462
  269. package/dist/src/server/domains/process/handlers.base.process.d.ts +61 -0
  270. package/dist/src/server/domains/process/handlers.base.process.js +417 -0
  271. package/dist/src/server/domains/process/handlers.base.types.d.ts +57 -0
  272. package/dist/src/server/domains/process/handlers.base.types.js +50 -0
  273. package/dist/src/server/domains/process/handlers.impl.core.runtime.inject.js +19 -17
  274. package/dist/src/server/domains/process/manifest.js +6 -1
  275. package/dist/src/server/domains/sandbox/definitions.js +11 -33
  276. package/dist/src/server/domains/sandbox/handlers.js +8 -3
  277. package/dist/src/server/domains/shared/ResponseBuilder.d.ts +209 -0
  278. package/dist/src/server/domains/shared/ResponseBuilder.js +48 -0
  279. package/dist/src/server/domains/shared/modules.d.ts +0 -2
  280. package/dist/src/server/domains/shared/modules.js +0 -1
  281. package/dist/src/server/domains/sourcemap/definitions.js +27 -111
  282. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-common.js +7 -2
  283. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-main.js +1 -1
  284. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-parse-base.js +1 -1
  285. package/dist/src/server/domains/sourcemap/manifest.d.ts +1 -1
  286. package/dist/src/server/domains/sourcemap/manifest.js +1 -1
  287. package/dist/src/server/domains/streaming/definitions.js +36 -148
  288. package/dist/src/server/domains/streaming/handlers.impl.streaming-sse.js +163 -164
  289. package/dist/src/server/domains/streaming/handlers.impl.streaming-ws.js +1 -1
  290. package/dist/src/server/domains/trace/TraceSummarizer.d.ts +60 -0
  291. package/dist/src/server/domains/trace/TraceSummarizer.js +112 -0
  292. package/dist/src/server/domains/trace/definitions.tools.js +51 -176
  293. package/dist/src/server/domains/trace/handlers.d.ts +2 -1
  294. package/dist/src/server/domains/trace/handlers.js +62 -9
  295. package/dist/src/server/domains/trace/index.d.ts +2 -1
  296. package/dist/src/server/domains/trace/index.js +2 -1
  297. package/dist/src/server/domains/trace/manifest.js +18 -4
  298. package/dist/src/server/domains/transform/definitions.js +50 -210
  299. package/dist/src/server/domains/transform/handlers.impl.transform-base.js +6 -6
  300. package/dist/src/server/domains/transform/handlers.impl.transform-crypto.js +18 -19
  301. package/dist/src/server/domains/transform/manifest.d.ts +1 -1
  302. package/dist/src/server/domains/transform/manifest.js +1 -1
  303. package/dist/src/server/domains/wasm/definitions.js +55 -232
  304. package/dist/src/server/domains/wasm/handlers.js +3 -3
  305. package/dist/src/server/domains/workflow/definitions.js +144 -414
  306. package/dist/src/server/domains/workflow/handlers.impl.workflow-account-bundle.js +2 -2
  307. package/dist/src/server/domains/workflow/handlers.impl.workflow-base.d.ts +2 -0
  308. package/dist/src/server/domains/workflow/handlers.impl.workflow-base.js +126 -87
  309. package/dist/src/server/domains/workflow/handlers.impl.workflow-batch.js +5 -5
  310. package/dist/src/server/evidence/ReverseEvidenceGraph.d.ts +20 -0
  311. package/dist/src/server/evidence/ReverseEvidenceGraph.js +208 -0
  312. package/dist/src/server/evidence/index.d.ts +2 -0
  313. package/dist/src/server/evidence/index.js +1 -0
  314. package/dist/src/server/evidence/types.d.ts +22 -0
  315. package/dist/src/server/evidence/types.js +1 -0
  316. package/dist/src/server/extensions/ExtensionManager.d.ts +1 -0
  317. package/dist/src/server/extensions/ExtensionManager.discovery.js +72 -9
  318. package/dist/src/server/extensions/ExtensionManager.integrity.js +1 -1
  319. package/dist/src/server/extensions/ExtensionManager.js +193 -40
  320. package/dist/src/server/extensions/ExtensionManager.roots.d.ts +1 -1
  321. package/dist/src/server/extensions/ExtensionManager.roots.js +19 -9
  322. package/dist/src/server/extensions/plugin-config.js +1 -1
  323. package/dist/src/server/extensions/plugin-env.d.ts +1 -1
  324. package/dist/src/server/extensions/plugin-env.js +10 -4
  325. package/dist/src/server/extensions/types.d.ts +17 -0
  326. package/dist/src/server/extensions/types.js +1 -1
  327. package/dist/src/server/http/HttpMiddleware.js +1 -1
  328. package/dist/src/server/instrumentation/EvidenceGraphBridge.d.ts +13 -0
  329. package/dist/src/server/instrumentation/EvidenceGraphBridge.js +150 -0
  330. package/dist/src/server/instrumentation/InstrumentationSession.d.ts +60 -0
  331. package/dist/src/server/instrumentation/InstrumentationSession.js +269 -0
  332. package/dist/src/server/instrumentation/index.d.ts +2 -0
  333. package/dist/src/server/instrumentation/index.js +2 -0
  334. package/dist/src/server/instrumentation/types.d.ts +62 -0
  335. package/dist/src/server/instrumentation/types.js +7 -0
  336. package/dist/src/server/macros/MacroConfigLoader.d.ts +6 -5
  337. package/dist/src/server/macros/MacroConfigLoader.js +61 -59
  338. package/dist/src/server/macros/MacroRunner.js +6 -2
  339. package/dist/src/server/macros/builtins/index.d.ts +2 -3
  340. package/dist/src/server/macros/builtins/index.js +51 -7
  341. package/dist/src/server/plugins/PluginContract.d.ts +1 -1
  342. package/dist/src/server/registry/contracts.d.ts +7 -1
  343. package/dist/src/server/registry/discovery.js +5 -4
  344. package/dist/src/server/registry/ensure-browser-core.js +0 -3
  345. package/dist/src/server/registry/index.js +4 -4
  346. package/dist/src/server/registry/tool-builder.d.ts +46 -0
  347. package/dist/src/server/registry/tool-builder.js +105 -0
  348. package/dist/src/server/sandbox/MCPBridge.d.ts +9 -0
  349. package/dist/src/server/sandbox/MCPBridge.js +22 -0
  350. package/dist/src/server/sandbox/QuickJSSandbox.d.ts +4 -1
  351. package/dist/src/server/sandbox/QuickJSSandbox.js +162 -2
  352. package/dist/src/server/sandbox/types.d.ts +13 -0
  353. package/dist/src/server/search/AffinityGraph.d.ts +7 -1
  354. package/dist/src/server/search/AffinityGraph.js +24 -3
  355. package/dist/src/server/search/EmbeddingWorker.js +5 -3
  356. package/dist/src/server/search/FeedbackTracker.d.ts +9 -0
  357. package/dist/src/server/search/FeedbackTracker.js +26 -0
  358. package/dist/src/server/search/QueryNormalizer.d.ts +6 -0
  359. package/dist/src/server/search/QueryNormalizer.js +94 -0
  360. package/dist/src/server/search/ToolSearchEngineImpl.d.ts +2 -3
  361. package/dist/src/server/search/ToolSearchEngineImpl.js +38 -88
  362. package/dist/src/server/workflows/WorkflowContract.d.ts +24 -0
  363. package/dist/src/server/workflows/WorkflowContract.js +12 -0
  364. package/dist/src/server/workflows/WorkflowEngine.d.ts +1 -0
  365. package/dist/src/server/workflows/WorkflowEngine.js +136 -3
  366. package/dist/src/types/config.d.ts +0 -14
  367. package/dist/src/types/deobfuscator.d.ts +0 -1
  368. package/dist/src/types/index.d.ts +1 -1
  369. package/dist/src/utils/DetailedDataManager.js +2 -0
  370. package/dist/src/utils/RingBuffer.js +5 -5
  371. package/dist/src/utils/TokenBudgetManager.js +1 -1
  372. package/dist/src/utils/UnifiedCacheManager.d.ts +1 -1
  373. package/dist/src/utils/UnifiedCacheManager.js +3 -3
  374. package/dist/src/utils/artifactRetention.js +2 -2
  375. package/dist/src/utils/betterSqlite3.d.ts +11 -0
  376. package/dist/src/utils/betterSqlite3.js +88 -0
  377. package/dist/src/utils/browserExecutable.js +2 -2
  378. package/dist/src/utils/cliFastPath.js +17 -6
  379. package/dist/src/utils/config.js +4 -26
  380. package/dist/src/utils/environmentDoctor.js +138 -11
  381. package/dist/src/utils/outputPaths.js +16 -9
  382. package/dist/src/utils/parallel.js +1 -3
  383. package/package.json +76 -72
  384. package/scripts/postinstall.cjs +37 -37
  385. package/src/native/scripts/linux/enum-windows.sh +12 -12
  386. package/src/native/scripts/macos/enum-windows.applescript +22 -22
  387. package/src/native/scripts/windows/enum-windows-by-class.ps1 +51 -51
  388. package/src/native/scripts/windows/enum-windows.ps1 +44 -44
  389. package/src/native/scripts/windows/inject-dll.ps1 +21 -21
  390. package/workflows/.gitkeep +0 -0
  391. package/dist/src/modules/analyzer/AISummarizer.d.ts +0 -39
  392. package/dist/src/modules/analyzer/AISummarizer.js +0 -122
  393. package/dist/src/modules/hook/AIHookGenerator.d.ts +0 -52
  394. package/dist/src/modules/hook/AIHookGenerator.js +0 -360
  395. package/dist/src/modules/hook/AIHookGeneratorTemplates.d.ts +0 -9
  396. package/dist/src/modules/hook/AIHookGeneratorTemplates.js +0 -157
  397. package/dist/src/server/macros/builtins/deobfuscate-ast-flow.d.ts +0 -2
  398. package/dist/src/server/macros/builtins/deobfuscate-ast-flow.js +0 -25
  399. package/dist/src/server/macros/builtins/unpacker-flow.d.ts +0 -2
  400. package/dist/src/server/macros/builtins/unpacker-flow.js +0 -25
  401. package/dist/src/services/LLMService.d.ts +0 -37
  402. package/dist/src/services/LLMService.js +0 -233
  403. package/dist/src/services/prompts/analysis.d.ts +0 -9
  404. package/dist/src/services/prompts/analysis.js +0 -158
  405. package/dist/src/services/prompts/crypto.d.ts +0 -2
  406. package/dist/src/services/prompts/crypto.js +0 -108
  407. package/dist/src/services/prompts/deobfuscation.d.ts +0 -6
  408. package/dist/src/services/prompts/deobfuscation.js +0 -300
  409. package/dist/src/services/prompts/environment.d.ts +0 -16
  410. package/dist/src/services/prompts/environment.js +0 -372
  411. package/dist/src/services/prompts/intelligence.d.ts +0 -4
  412. package/dist/src/services/prompts/intelligence.js +0 -250
  413. package/dist/src/services/prompts/taint.d.ts +0 -2
  414. package/dist/src/services/prompts/taint.js +0 -54
@@ -1,114 +1,123 @@
1
+ import { tool } from '../../registry/tool-builder.js';
1
2
  export const platformTools = [
2
- {
3
- name: 'miniapp_pkg_scan',
4
- description: '扫描本地小程序缓存目录,列出所有 小程序包文件。默认扫描常见 Windows 路径。',
5
- inputSchema: {
6
- type: 'object',
7
- properties: {
8
- searchPath: {
9
- type: 'string',
10
- description: '可选。指定扫描根目录;不提供时使用默认路径(MiniApp/Cache 与 MiniApp/Plugin)。',
11
- },
12
- },
13
- },
14
- annotations: {
15
- readOnlyHint: false,
16
- destructiveHint: false,
17
- idempotentHint: false,
18
- openWorldHint: false,
19
- },
20
- },
21
- {
22
- name: 'miniapp_pkg_unpack',
23
- description: '解包 小程序包文件。优先调用外部 外部解包工具,失败时自动降级为纯 Node.js 解析。',
24
- inputSchema: {
25
- type: 'object',
26
- properties: {
27
- inputPath: {
28
- type: 'string',
29
- description: '必填。小程序包文件路径。',
30
- },
31
- outputDir: {
32
- type: 'string',
33
- description: '可选。输出目录;不提供时自动生成 artifacts 临时目录。',
34
- },
35
- },
36
- required: ['inputPath'],
37
- },
38
- annotations: {
39
- readOnlyHint: false,
40
- destructiveHint: false,
41
- idempotentHint: false,
42
- openWorldHint: false,
43
- },
44
- },
45
- {
46
- name: 'miniapp_pkg_analyze',
47
- description: '分析解包后的小程序结构,提取 pages/subPackages/components/jsFiles/totalSize/appId。',
48
- inputSchema: {
49
- type: 'object',
50
- properties: {
51
- unpackedDir: {
52
- type: 'string',
53
- description: '必填。已解包目录路径。',
54
- },
55
- },
56
- required: ['unpackedDir'],
57
- },
58
- annotations: {
59
- readOnlyHint: false,
60
- destructiveHint: false,
61
- idempotentHint: false,
62
- openWorldHint: false,
63
- },
64
- },
65
- {
66
- name: 'asar_extract',
67
- description: '提取 Electron app.asar(纯 Node.js 实现,不依赖 @electron/asar)。支持仅列文件模式。',
68
- inputSchema: {
69
- type: 'object',
70
- properties: {
71
- inputPath: {
72
- type: 'string',
73
- description: '必填。asar 文件路径。',
74
- },
75
- outputDir: {
76
- type: 'string',
77
- description: '可选。提取目录;不提供时自动生成 artifacts 临时目录。',
78
- },
79
- listOnly: {
80
- type: 'boolean',
81
- description: '可选。默认 false;true 时仅列出文件清单,不执行提取。',
82
- default: false,
83
- },
84
- },
85
- required: ['inputPath'],
86
- },
87
- annotations: {
88
- readOnlyHint: false,
89
- destructiveHint: false,
90
- idempotentHint: false,
91
- openWorldHint: false,
92
- },
93
- },
94
- {
95
- name: 'electron_inspect_app',
96
- description: '分析 Electron 应用结构(.exe app 目录):package.json、main、preload、dependencies、devToolsEnabled。',
97
- inputSchema: {
98
- type: 'object',
99
- properties: {
100
- appPath: {
101
- type: 'string',
102
- description: '必填。Electron .exe 路径或应用目录路径。',
103
- },
104
- },
105
- required: ['appPath'],
106
- },
107
- annotations: {
108
- readOnlyHint: false,
109
- destructiveHint: false,
110
- idempotentHint: false,
111
- openWorldHint: false,
112
- },
113
- },
3
+ tool('miniapp_pkg_scan')
4
+ .desc('扫描本地小程序缓存目录,列出所有 小程序包文件。默认扫描常见 Windows 路径。')
5
+ .string('searchPath', '可选。指定扫描根目录;不提供时使用默认路径(MiniApp/Cache MiniApp/Plugin)。')
6
+ .build(),
7
+ tool('miniapp_pkg_unpack')
8
+ .desc('解包 小程序包文件。优先调用外部 外部解包工具,失败时自动降级为纯 Node.js 解析。')
9
+ .string('inputPath', '必填。小程序包文件路径。')
10
+ .string('outputDir', '可选。输出目录;不提供时自动生成 artifacts 临时目录。')
11
+ .required('inputPath')
12
+ .build(),
13
+ tool('miniapp_pkg_analyze')
14
+ .desc('分析解包后的小程序结构,提取 pages/subPackages/components/jsFiles/totalSize/appId。')
15
+ .string('unpackedDir', '必填。已解包目录路径。')
16
+ .required('unpackedDir')
17
+ .build(),
18
+ tool('asar_extract')
19
+ .desc('提取 Electron app.asar(纯 Node.js 实现,不依赖 @electron/asar)。支持仅列文件模式。')
20
+ .string('inputPath', '必填。asar 文件路径。')
21
+ .string('outputDir', '可选。提取目录;不提供时自动生成 artifacts 临时目录。')
22
+ .boolean('listOnly', '可选。默认 false;true 时仅列出文件清单,不执行提取。', {
23
+ default: false,
24
+ })
25
+ .required('inputPath')
26
+ .build(),
27
+ tool('electron_inspect_app')
28
+ .desc('分析 Electron 应用结构(.exe 或 app 目录):package.json、main、preload、dependencies、devToolsEnabled。')
29
+ .string('appPath', '必填。Electron .exe 路径或应用目录路径。')
30
+ .required('appPath')
31
+ .build(),
32
+ tool('electron_scan_userdata')
33
+ .desc('扫描指定目录中的所有 JSON 文件,返回 raw 内容。适用于 Electron 应用的用户数据目录(Windows: %APPDATA%, macOS: ~/Library/Application Support, Linux: ~/.config)。Agent 自行解读数据。')
34
+ .string('dirPath', '必填。要扫描的目录绝对路径(任意平台)。')
35
+ .number('maxFiles', '可选。最多读取的 JSON 文件数量。默认 20。', { default: 20 })
36
+ .number('maxFileSizeKB', '可选。单个文件大小上限(KB)。超限文件跳过。默认 1024。', {
37
+ default: 1024,
38
+ })
39
+ .required('dirPath')
40
+ .readOnly()
41
+ .idempotent()
42
+ .build(),
43
+ tool('asar_search')
44
+ .desc('在 ASAR 归档内执行正则搜索。Agent 提供 pattern,工具返回匹配文件路径和行内容。')
45
+ .string('inputPath', '必填。ASAR 文件路径。')
46
+ .string('pattern', '必填。正则表达式字符串。')
47
+ .string('fileGlob', '可选。文件扩展名过滤。默认 *.js。', { default: '*.js' })
48
+ .number('maxResults', '可选。最大返回匹配数。默认 100。', { default: 100 })
49
+ .required('inputPath', 'pattern')
50
+ .readOnly()
51
+ .idempotent()
52
+ .build(),
53
+ tool('electron_check_fuses')
54
+ .desc('检测 Electron 可执行文件中的 fuse 配置状态(ASAR 完整性校验、RunAsNode 等)。')
55
+ .string('exePath', '必填。Electron .exe 文件路径。')
56
+ .required('exePath')
57
+ .readOnly()
58
+ .idempotent()
59
+ .build(),
60
+ tool('electron_patch_fuses')
61
+ .desc('Patch Electron binary fuses to enable/disable debug capabilities. Creates backup before patching. Use profile="debug" to enable RunAsNode, NodeOptions, InspectArguments and disable OnlyLoadAppFromAsar.')
62
+ .string('exePath', 'Required. Path to the Electron .exe file to patch.')
63
+ .enum('profile', ['debug', 'custom'], 'Patch profile. "debug" enables debug-related fuses. "custom" requires a fuses object.', { default: 'debug' })
64
+ .object('fuses', {}, 'For profile="custom". Map of fuse names to ENABLE/DISABLE. E.g. {"RunAsNode": "ENABLE"}.')
65
+ .boolean('createBackup', 'Create a .exe.bak backup before patching.', { default: true })
66
+ .required('exePath')
67
+ .destructive()
68
+ .build(),
69
+ tool('v8_bytecode_decompile')
70
+ .desc('Decompile V8 bytecode (.jsc / bytenode) files. Uses view8 Python package for full decompilation (preferred), falls back to built-in constant pool extraction. Returns pseudocode or extracted strings for LLM analysis.')
71
+ .string('filePath', 'Required. Path to the .jsc or V8 bytecode file.')
72
+ .required('filePath')
73
+ .readOnly()
74
+ .idempotent()
75
+ .build(),
76
+ tool('electron_launch_debug')
77
+ .desc('Launch Electron app with dual CDP debugging: --inspect for main process (Node.js) and --remote-debugging-port for renderer (Chromium). Auto-checks fuse status.')
78
+ .string('exePath', 'Required. Path to the Electron .exe file.')
79
+ .number('mainPort', 'Main process inspect port.', { default: 9229 })
80
+ .number('rendererPort', 'Renderer remote debugging port.', { default: 9222 })
81
+ .array('args', { type: 'string' }, 'Extra command-line arguments.')
82
+ .boolean('skipFuseCheck', 'Skip fuse status check.', { default: false })
83
+ .number('waitMs', 'Milliseconds to wait for CDP ports.', { default: 8000 })
84
+ .required('exePath')
85
+ .openWorld()
86
+ .build(),
87
+ tool('electron_debug_status')
88
+ .desc('Check status of dual-CDP debug sessions launched by electron_launch_debug.')
89
+ .string('sessionId', 'Optional. Check specific session. Omit to list all.')
90
+ .readOnly()
91
+ .idempotent()
92
+ .build(),
93
+ tool('frida_bridge')
94
+ .desc('Dynamic instrumentation bridge via Frida. Actions: check_env (verify frida installed), generate_script (hook template), attach (live-attach to process), run_script (inject script), detach (disconnect), list_sessions, guide (usage help).')
95
+ .enum('action', ['check_env', 'generate_script', 'attach', 'run_script', 'detach', 'list_sessions', 'guide'], 'Action to perform.', { default: 'guide' })
96
+ .number('pid', 'Process ID for attach/run_script.')
97
+ .string('processName', 'Process name for attach (alternative to pid).')
98
+ .string('sessionId', 'Session ID for run_script/detach.')
99
+ .string('script', 'Frida JS script to inject (for run_script).')
100
+ .enum('hookType', ['intercept', 'replace', 'stalker', 'module_export'], 'Hook template type (for generate_script).', { default: 'intercept' })
101
+ .string('functionName', 'Target function name (for generate_script).')
102
+ .string('target', 'Target process name (for generate_script usage hint).')
103
+ .openWorld()
104
+ .build(),
105
+ tool('electron_ipc_sniff')
106
+ .desc('Sniff Electron IPC messages by injecting hooks into ipcRenderer via CDP. Captures invoke/send/sendSync with channel names and arguments. Actions: start (inject hooks), dump (retrieve captured messages), stop (end session), list (show sessions), guide.')
107
+ .enum('action', ['start', 'dump', 'stop', 'list', 'guide'], 'Action to perform.', {
108
+ default: 'guide',
109
+ })
110
+ .number('port', 'Renderer CDP port (--remote-debugging-port).', { default: 9222 })
111
+ .string('sessionId', 'Session ID for dump/stop.')
112
+ .boolean('clear', 'Clear captured messages after dump.', { default: true })
113
+ .openWorld()
114
+ .build(),
115
+ tool('jadx_bridge')
116
+ .desc('JADX decompiler bridge for Android APK/DEX/AAR files. Actions: check_env (verify jadx installed), decompile (run jadx on input), guide (usage help).')
117
+ .enum('action', ['check_env', 'decompile', 'guide'], 'Action to perform.', { default: 'guide' })
118
+ .string('inputPath', 'Required for decompile. Path to APK/DEX/AAR file.')
119
+ .string('outputDir', 'Optional. Output directory for decompiled sources.')
120
+ .array('extraArgs', { type: 'string' }, 'Extra jadx CLI arguments (e.g. ["--deobf", "--show-bad-code"]).')
121
+ .openWorld()
122
+ .build(),
114
123
  ];
@@ -1,4 +1,4 @@
1
- import { ExternalToolRunner } from '../../../domains/shared/modules.js';
1
+ import { type ExternalToolRunner } from '../../../domains/shared/modules.js';
2
2
  export declare class BridgeHandlers {
3
3
  private runner;
4
4
  constructor(runner: ExternalToolRunner);
@@ -8,6 +8,10 @@ export declare class BridgeHandlers {
8
8
  text: string;
9
9
  }[];
10
10
  }>;
11
+ private _handleFridaAttach;
12
+ private _handleFridaRunScript;
13
+ private _handleFridaDetach;
14
+ private _handleFridaListSessions;
11
15
  handleJadxBridge(args: Record<string, unknown>): Promise<{
12
16
  content: {
13
17
  type: "text";
@@ -1,7 +1,10 @@
1
1
  import { basename, extname, resolve } from 'node:path';
2
+ import { execFile, spawn } from 'node:child_process';
3
+ import { promisify } from 'node:util';
2
4
  import { argStringArray } from '../../../domains/shared/parse-args.js';
3
- import { ExternalToolRunner } from '../../../domains/shared/modules.js';
5
+ import {} from '../../../domains/shared/modules.js';
4
6
  import { toTextResponse, toErrorResponse, parseStringArg, resolveOutputDirectory, checkExternalCommand, } from '../../../domains/platform/handlers/platform-utils.js';
7
+ const execFileAsync = promisify(execFile);
5
8
  function generateFridaTemplate(hookType, functionName) {
6
9
  const templates = {
7
10
  intercept: [
@@ -59,6 +62,7 @@ function generateFridaTemplate(hookType, functionName) {
59
62
  };
60
63
  return templates[hookType] ?? templates.intercept;
61
64
  }
65
+ const fridaSessions = new Map();
62
66
  export class BridgeHandlers {
63
67
  runner;
64
68
  constructor(runner) {
@@ -84,6 +88,18 @@ export class BridgeHandlers {
84
88
  tip: 'Save the script to a .js file, then use the frida CLI to inject it.',
85
89
  });
86
90
  }
91
+ if (action === 'attach') {
92
+ return this._handleFridaAttach(args);
93
+ }
94
+ if (action === 'run_script') {
95
+ return this._handleFridaRunScript(args);
96
+ }
97
+ if (action === 'detach') {
98
+ return this._handleFridaDetach(args);
99
+ }
100
+ if (action === 'list_sessions') {
101
+ return this._handleFridaListSessions();
102
+ }
87
103
  return toTextResponse({
88
104
  success: true,
89
105
  guide: {
@@ -91,16 +107,189 @@ export class BridgeHandlers {
91
107
  install: ['pip install frida-tools', 'npm install frida // optional Node.js bindings'],
92
108
  workflow: [
93
109
  '1. Use process_find / process_find_chromium to locate the target process',
94
- '2. Use frida_bridge(action="generate_script") to generate a hook template',
95
- '3. Save the script and run: frida -p <PID> -l script.js',
96
- '4. Use page_evaluate or console_execute to interact with the hooked process',
97
- '5. Combine with network_enable + network_get_requests for full-chain analysis',
110
+ '2. Use frida_bridge(action="attach", pid=<PID>) to live-attach to the process',
111
+ '3. Use frida_bridge(action="run_script", sessionId=<id>, script="...") to inject hooks',
112
+ '4. Use frida_bridge(action="generate_script") to generate hook templates',
113
+ '5. Use frida_bridge(action="detach", sessionId=<id>) to clean disconnect',
114
+ '6. Combine with electron_launch_debug for main-process Frida injection',
115
+ ],
116
+ actions: [
117
+ 'check_env',
118
+ 'attach',
119
+ 'run_script',
120
+ 'detach',
121
+ 'list_sessions',
122
+ 'generate_script',
123
+ 'guide',
98
124
  ],
99
125
  links: ['https://frida.re/docs/home/', 'https://frida.re/docs/javascript-api/'],
100
126
  integration: 'Frida hooks can call back to this MCP via fetch("http://localhost:<port>/...") for real-time data exchange.',
101
127
  },
102
128
  });
103
129
  }
130
+ async _handleFridaAttach(args) {
131
+ const pid = args.pid;
132
+ const processName = parseStringArg(args, 'processName');
133
+ if (!pid && !processName) {
134
+ throw new Error('Either pid or processName is required for attach');
135
+ }
136
+ const fridaArgs = [];
137
+ if (pid) {
138
+ fridaArgs.push('-p', String(pid));
139
+ }
140
+ else if (processName) {
141
+ fridaArgs.push('-n', processName);
142
+ }
143
+ fridaArgs.push('--no-pause');
144
+ try {
145
+ await execFileAsync('frida', ['--version'], { timeout: 5000 });
146
+ }
147
+ catch {
148
+ return toTextResponse({
149
+ success: false,
150
+ tool: 'frida_bridge',
151
+ error: 'frida CLI not found. Install with: pip install frida-tools',
152
+ note: 'Frida live attach requires the frida CLI tools installed and in PATH.',
153
+ });
154
+ }
155
+ const child = spawn('frida', fridaArgs, {
156
+ stdio: ['pipe', 'pipe', 'pipe'],
157
+ });
158
+ const sessionId = `frida-${pid ?? processName}-${Date.now()}`;
159
+ const session = {
160
+ id: sessionId,
161
+ pid: pid ?? 0,
162
+ child,
163
+ output: [],
164
+ startedAt: Date.now(),
165
+ };
166
+ child.stdout?.on('data', (data) => {
167
+ session.output.push(data.toString());
168
+ if (session.output.length > 100)
169
+ session.output.shift();
170
+ });
171
+ child.stderr?.on('data', (data) => {
172
+ session.output.push(`[stderr] ${data.toString()}`);
173
+ if (session.output.length > 100)
174
+ session.output.shift();
175
+ });
176
+ child.on('exit', () => {
177
+ fridaSessions.delete(sessionId);
178
+ });
179
+ fridaSessions.set(sessionId, session);
180
+ await new Promise((r) => setTimeout(r, 2000));
181
+ return toTextResponse({
182
+ success: true,
183
+ tool: 'frida_bridge',
184
+ action: 'attach',
185
+ sessionId,
186
+ pid: pid ?? processName,
187
+ initialOutput: session.output.join('').slice(0, 2000),
188
+ usage: {
189
+ runScript: `frida_bridge(action="run_script", sessionId="${sessionId}", script="...")`,
190
+ detach: `frida_bridge(action="detach", sessionId="${sessionId}")`,
191
+ },
192
+ });
193
+ }
194
+ async _handleFridaRunScript(args) {
195
+ const sessionId = parseStringArg(args, 'sessionId', true);
196
+ const script = parseStringArg(args, 'script', true);
197
+ if (!sessionId || !script) {
198
+ throw new Error('sessionId and script are required');
199
+ }
200
+ const session = fridaSessions.get(sessionId);
201
+ if (!session) {
202
+ const pid = args.pid;
203
+ const processName = parseStringArg(args, 'processName');
204
+ if (!pid && !processName) {
205
+ return toTextResponse({
206
+ success: false,
207
+ tool: 'frida_bridge',
208
+ error: `Session ${sessionId} not found. Provide pid or processName for one-shot execution.`,
209
+ activeSessions: Array.from(fridaSessions.keys()),
210
+ });
211
+ }
212
+ const fridaArgs = [];
213
+ if (pid)
214
+ fridaArgs.push('-p', String(pid));
215
+ else if (processName)
216
+ fridaArgs.push('-n', processName);
217
+ fridaArgs.push('--no-pause', '-e', script);
218
+ try {
219
+ const { stdout, stderr } = await execFileAsync('frida', fridaArgs, {
220
+ timeout: 30_000,
221
+ maxBuffer: 5 * 1024 * 1024,
222
+ });
223
+ return toTextResponse({
224
+ success: true,
225
+ tool: 'frida_bridge',
226
+ action: 'run_script',
227
+ mode: 'one-shot',
228
+ stdout: stdout.slice(0, 10_000),
229
+ stderr: stderr.slice(0, 2000),
230
+ });
231
+ }
232
+ catch (error) {
233
+ return toErrorResponse('frida_bridge', error);
234
+ }
235
+ }
236
+ session.output.length = 0;
237
+ session.child.stdin?.write(script + '\n');
238
+ await new Promise((r) => setTimeout(r, 3000));
239
+ return toTextResponse({
240
+ success: true,
241
+ tool: 'frida_bridge',
242
+ action: 'run_script',
243
+ sessionId,
244
+ mode: 'interactive',
245
+ output: session.output.join('').slice(0, 10_000),
246
+ });
247
+ }
248
+ async _handleFridaDetach(args) {
249
+ const sessionId = parseStringArg(args, 'sessionId', true);
250
+ if (!sessionId)
251
+ throw new Error('sessionId is required');
252
+ const session = fridaSessions.get(sessionId);
253
+ if (!session) {
254
+ return toTextResponse({
255
+ success: false,
256
+ tool: 'frida_bridge',
257
+ error: `Session not found: ${sessionId}`,
258
+ activeSessions: Array.from(fridaSessions.keys()),
259
+ });
260
+ }
261
+ session.child.stdin?.write('%quit\n');
262
+ setTimeout(() => {
263
+ try {
264
+ session.child.kill();
265
+ }
266
+ catch {
267
+ }
268
+ }, 2000);
269
+ fridaSessions.delete(sessionId);
270
+ return toTextResponse({
271
+ success: true,
272
+ tool: 'frida_bridge',
273
+ action: 'detach',
274
+ sessionId,
275
+ message: 'Frida session detached.',
276
+ });
277
+ }
278
+ async _handleFridaListSessions() {
279
+ const sessions = Array.from(fridaSessions.entries()).map(([id, s]) => ({
280
+ sessionId: id,
281
+ pid: s.pid,
282
+ uptime: Math.round((Date.now() - s.startedAt) / 1000),
283
+ outputLines: s.output.length,
284
+ }));
285
+ return toTextResponse({
286
+ success: true,
287
+ tool: 'frida_bridge',
288
+ action: 'list_sessions',
289
+ sessions,
290
+ count: sessions.length,
291
+ });
292
+ }
104
293
  async handleJadxBridge(args) {
105
294
  const action = parseStringArg(args, 'action', true) ?? 'guide';
106
295
  if (action === 'check_env') {
@@ -1,5 +1,12 @@
1
1
  import { basename, extname } from 'node:path';
2
2
  import { isRecord, sanitizeArchiveRelativePath, toDisplayPath, walkDirectory, } from '../../../domains/platform/handlers/platform-utils.js';
3
+ function trimTrailingNulls(value) {
4
+ let end = value.length;
5
+ while (end > 0 && value.charCodeAt(end - 1) === 0) {
6
+ end -= 1;
7
+ }
8
+ return end === value.length ? value : value.slice(0, end);
9
+ }
3
10
  export function flattenAsarEntries(headerNode) {
4
11
  if (!isRecord(headerNode.files)) {
5
12
  return [];
@@ -63,14 +70,13 @@ export function parseAsarBuffer(asarBuffer) {
63
70
  for (const candidateLength of lengthCandidates) {
64
71
  const headerText = asarBuffer
65
72
  .subarray(headerStart, headerStart + candidateLength)
66
- .toString('utf-8')
67
- .replace(/\0+$/g, '')
68
- .trim();
69
- if (headerText.length === 0) {
73
+ .toString('utf-8');
74
+ const normalizedHeaderText = trimTrailingNulls(headerText).trim();
75
+ if (normalizedHeaderText.length === 0) {
70
76
  continue;
71
77
  }
72
78
  try {
73
- const parsed = JSON.parse(headerText);
79
+ const parsed = JSON.parse(normalizedHeaderText);
74
80
  if (isRecord(parsed)) {
75
81
  headerObject = parsed;
76
82
  headerLength = candidateLength;
@@ -78,6 +84,20 @@ export function parseAsarBuffer(asarBuffer) {
78
84
  }
79
85
  }
80
86
  catch {
87
+ const lastBrace = normalizedHeaderText.lastIndexOf('}');
88
+ if (lastBrace > 0) {
89
+ try {
90
+ const trimmed = normalizedHeaderText.substring(0, lastBrace + 1);
91
+ const parsed = JSON.parse(trimmed);
92
+ if (isRecord(parsed)) {
93
+ headerObject = parsed;
94
+ headerLength = candidateLength;
95
+ break;
96
+ }
97
+ }
98
+ catch {
99
+ }
100
+ }
81
101
  }
82
102
  }
83
103
  if (!headerObject) {
@@ -161,5 +181,5 @@ export async function findFilesystemPreloadScripts(rootDir) {
161
181
  matches.add(toDisplayPath(absolutePath));
162
182
  }
163
183
  });
164
- return Array.from(matches).sort().slice(0, 100);
184
+ return Array.from(matches).toSorted().slice(0, 100);
165
185
  }
@@ -0,0 +1,3 @@
1
+ import { toTextResponse } from '../../../domains/platform/handlers/platform-utils.js';
2
+ export declare function handleElectronLaunchDebug(args: Record<string, unknown>): Promise<ReturnType<typeof toTextResponse>>;
3
+ export declare function handleElectronDebugStatus(args: Record<string, unknown>): Promise<ReturnType<typeof toTextResponse>>;