deepspider 0.1.0

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 (261) hide show
  1. package/.claude/agents/check.md +122 -0
  2. package/.claude/agents/debug.md +106 -0
  3. package/.claude/agents/dispatch.md +214 -0
  4. package/.claude/agents/implement.md +96 -0
  5. package/.claude/agents/plan.md +396 -0
  6. package/.claude/agents/research.md +120 -0
  7. package/.claude/commands/evolve/merge.md +80 -0
  8. package/.claude/commands/trellis/before-backend-dev.md +13 -0
  9. package/.claude/commands/trellis/before-frontend-dev.md +13 -0
  10. package/.claude/commands/trellis/break-loop.md +107 -0
  11. package/.claude/commands/trellis/check-backend.md +13 -0
  12. package/.claude/commands/trellis/check-cross-layer.md +153 -0
  13. package/.claude/commands/trellis/check-frontend.md +13 -0
  14. package/.claude/commands/trellis/create-command.md +154 -0
  15. package/.claude/commands/trellis/finish-work.md +129 -0
  16. package/.claude/commands/trellis/integrate-skill.md +219 -0
  17. package/.claude/commands/trellis/onboard.md +358 -0
  18. package/.claude/commands/trellis/parallel.md +193 -0
  19. package/.claude/commands/trellis/record-session.md +62 -0
  20. package/.claude/commands/trellis/start.md +280 -0
  21. package/.claude/commands/trellis/update-spec.md +213 -0
  22. package/.claude/hooks/inject-subagent-context.py +758 -0
  23. package/.claude/hooks/ralph-loop.py +374 -0
  24. package/.claude/hooks/session-start.py +126 -0
  25. package/.claude/settings.json +41 -0
  26. package/.claude/skills/deepagents-guide/SKILL.md +428 -0
  27. package/.cursor/commands/trellis-before-backend-dev.md +13 -0
  28. package/.cursor/commands/trellis-before-frontend-dev.md +13 -0
  29. package/.cursor/commands/trellis-break-loop.md +107 -0
  30. package/.cursor/commands/trellis-check-backend.md +13 -0
  31. package/.cursor/commands/trellis-check-cross-layer.md +153 -0
  32. package/.cursor/commands/trellis-check-frontend.md +13 -0
  33. package/.cursor/commands/trellis-create-command.md +154 -0
  34. package/.cursor/commands/trellis-finish-work.md +129 -0
  35. package/.cursor/commands/trellis-integrate-skill.md +219 -0
  36. package/.cursor/commands/trellis-onboard.md +358 -0
  37. package/.cursor/commands/trellis-record-session.md +62 -0
  38. package/.cursor/commands/trellis-start.md +156 -0
  39. package/.cursor/commands/trellis-update-spec.md +213 -0
  40. package/.env.example +11 -0
  41. package/.husky/pre-commit +1 -0
  42. package/.mcp.json +8 -0
  43. package/.trellis/.template-hashes.json +65 -0
  44. package/.trellis/.version +1 -0
  45. package/.trellis/scripts/add-session.sh +384 -0
  46. package/.trellis/scripts/common/developer.sh +129 -0
  47. package/.trellis/scripts/common/git-context.sh +263 -0
  48. package/.trellis/scripts/common/paths.sh +208 -0
  49. package/.trellis/scripts/common/phase.sh +150 -0
  50. package/.trellis/scripts/common/registry.sh +247 -0
  51. package/.trellis/scripts/common/task-queue.sh +142 -0
  52. package/.trellis/scripts/common/task-utils.sh +151 -0
  53. package/.trellis/scripts/common/worktree.sh +128 -0
  54. package/.trellis/scripts/create-bootstrap.sh +299 -0
  55. package/.trellis/scripts/get-context.sh +7 -0
  56. package/.trellis/scripts/get-developer.sh +15 -0
  57. package/.trellis/scripts/init-developer.sh +34 -0
  58. package/.trellis/scripts/multi-agent/cleanup.sh +396 -0
  59. package/.trellis/scripts/multi-agent/create-pr.sh +241 -0
  60. package/.trellis/scripts/multi-agent/plan.sh +207 -0
  61. package/.trellis/scripts/multi-agent/start.sh +310 -0
  62. package/.trellis/scripts/multi-agent/status.sh +828 -0
  63. package/.trellis/scripts/task.sh +1118 -0
  64. package/.trellis/spec/backend/deepagents-guide.md +337 -0
  65. package/.trellis/spec/backend/directory-structure.md +126 -0
  66. package/.trellis/spec/backend/examples/skills/deepagents-guide/README.md +11 -0
  67. package/.trellis/spec/backend/examples/skills/deepagents-guide/agent.js.template +20 -0
  68. package/.trellis/spec/backend/examples/skills/deepagents-guide/skills-config.js.template +13 -0
  69. package/.trellis/spec/backend/examples/skills/deepagents-guide/subagent.js.template +19 -0
  70. package/.trellis/spec/backend/hook-guidelines.md +178 -0
  71. package/.trellis/spec/backend/index.md +36 -0
  72. package/.trellis/spec/backend/quality-guidelines.md +201 -0
  73. package/.trellis/spec/backend/state-management.md +76 -0
  74. package/.trellis/spec/backend/tool-guidelines.md +144 -0
  75. package/.trellis/spec/backend/type-safety.md +71 -0
  76. package/.trellis/spec/guides/code-reuse-thinking-guide.md +92 -0
  77. package/.trellis/spec/guides/cross-layer-thinking-guide.md +94 -0
  78. package/.trellis/spec/guides/index.md +79 -0
  79. package/.trellis/tasks/archive/02-02-evolving-skills/prd.md +61 -0
  80. package/.trellis/tasks/archive/02-02-evolving-skills/task.json +29 -0
  81. package/.trellis/tasks/archive/2026-02/00-bootstrap-guidelines/prd.md +86 -0
  82. package/.trellis/tasks/archive/2026-02/00-bootstrap-guidelines/task.json +27 -0
  83. package/.trellis/tasks/archive/2026-02/02-02-skills-system/check.jsonl +3 -0
  84. package/.trellis/tasks/archive/2026-02/02-02-skills-system/debug.jsonl +2 -0
  85. package/.trellis/tasks/archive/2026-02/02-02-skills-system/implement.jsonl +5 -0
  86. package/.trellis/tasks/archive/2026-02/02-02-skills-system/prd.md +33 -0
  87. package/.trellis/tasks/archive/2026-02/02-02-skills-system/task.json +41 -0
  88. package/.trellis/workflow.md +407 -0
  89. package/.trellis/workspace/index.md +123 -0
  90. package/.trellis/workspace/pony/index.md +40 -0
  91. package/.trellis/workspace/pony/journal-1.md +7 -0
  92. package/.trellis/worktree.yaml +47 -0
  93. package/AGENTS.md +18 -0
  94. package/CLAUDE.md +292 -0
  95. package/README.md +134 -0
  96. package/agents/deepspider.md +142 -0
  97. package/docs/DEBUG.md +42 -0
  98. package/docs/GUIDE.md +334 -0
  99. package/docs/PROMPT.md +60 -0
  100. package/docs/USAGE.md +226 -0
  101. package/eslint.config.js +51 -0
  102. package/package.json +78 -0
  103. package/requirements-crypto.txt +14 -0
  104. package/src/agent/index.js +97 -0
  105. package/src/agent/logger.js +164 -0
  106. package/src/agent/middleware/filterTools.js +64 -0
  107. package/src/agent/middleware/report.js +79 -0
  108. package/src/agent/prompts/system.js +315 -0
  109. package/src/agent/run.js +575 -0
  110. package/src/agent/skills/anti-detect/SKILL.md +28 -0
  111. package/src/agent/skills/anti-detect/evolved.md +12 -0
  112. package/src/agent/skills/captcha/SKILL.md +37 -0
  113. package/src/agent/skills/captcha/evolved.md +12 -0
  114. package/src/agent/skills/config.js +30 -0
  115. package/src/agent/skills/crawler/SKILL.md +9 -0
  116. package/src/agent/skills/crawler/evolved.md +16 -0
  117. package/src/agent/skills/dynamic-analysis/SKILL.md +91 -0
  118. package/src/agent/skills/dynamic-analysis/evolved.md +12 -0
  119. package/src/agent/skills/env/SKILL.md +72 -0
  120. package/src/agent/skills/env/evolved.md +12 -0
  121. package/src/agent/skills/evolve.js +79 -0
  122. package/src/agent/skills/general/SKILL.md +12 -0
  123. package/src/agent/skills/general/evolved.md +12 -0
  124. package/src/agent/skills/js2python/SKILL.md +30 -0
  125. package/src/agent/skills/js2python/evolved.md +13 -0
  126. package/src/agent/skills/report/SKILL.md +21 -0
  127. package/src/agent/skills/report/evolved.md +12 -0
  128. package/src/agent/skills/sandbox/SKILL.md +22 -0
  129. package/src/agent/skills/sandbox/evolved.md +16 -0
  130. package/src/agent/skills/static-analysis/SKILL.md +93 -0
  131. package/src/agent/skills/static-analysis/evolved.md +12 -0
  132. package/src/agent/skills/xpath/SKILL.md +119 -0
  133. package/src/agent/subagents/anti-detect.js +45 -0
  134. package/src/agent/subagents/captcha.js +51 -0
  135. package/src/agent/subagents/crawler.js +138 -0
  136. package/src/agent/subagents/dynamic.js +64 -0
  137. package/src/agent/subagents/env-agent.js +82 -0
  138. package/src/agent/subagents/index.js +37 -0
  139. package/src/agent/subagents/js2python.js +72 -0
  140. package/src/agent/subagents/sandbox.js +55 -0
  141. package/src/agent/subagents/static.js +66 -0
  142. package/src/agent/tools/analysis.js +135 -0
  143. package/src/agent/tools/analyzer.js +85 -0
  144. package/src/agent/tools/anti-detect.js +89 -0
  145. package/src/agent/tools/antidebug.js +64 -0
  146. package/src/agent/tools/async.js +43 -0
  147. package/src/agent/tools/browser.js +324 -0
  148. package/src/agent/tools/captcha.js +223 -0
  149. package/src/agent/tools/capture.js +179 -0
  150. package/src/agent/tools/correlate.js +303 -0
  151. package/src/agent/tools/crawler.js +116 -0
  152. package/src/agent/tools/cryptohook.js +80 -0
  153. package/src/agent/tools/debug.js +246 -0
  154. package/src/agent/tools/deobfuscator.js +90 -0
  155. package/src/agent/tools/env.js +83 -0
  156. package/src/agent/tools/envdump.js +92 -0
  157. package/src/agent/tools/evolve.js +164 -0
  158. package/src/agent/tools/extract.js +114 -0
  159. package/src/agent/tools/extractor.js +54 -0
  160. package/src/agent/tools/file.js +224 -0
  161. package/src/agent/tools/hook.js +84 -0
  162. package/src/agent/tools/hookManager.js +178 -0
  163. package/src/agent/tools/index.js +137 -0
  164. package/src/agent/tools/nodejs.js +101 -0
  165. package/src/agent/tools/patch.js +46 -0
  166. package/src/agent/tools/preprocess.js +71 -0
  167. package/src/agent/tools/profile.js +122 -0
  168. package/src/agent/tools/python.js +627 -0
  169. package/src/agent/tools/report.js +124 -0
  170. package/src/agent/tools/runtime.js +132 -0
  171. package/src/agent/tools/sandbox.js +79 -0
  172. package/src/agent/tools/store.js +73 -0
  173. package/src/agent/tools/trace.js +74 -0
  174. package/src/agent/tools/tracing.js +201 -0
  175. package/src/agent/tools/utils.js +51 -0
  176. package/src/agent/tools/verify.js +184 -0
  177. package/src/agent/tools/webcrack.js +109 -0
  178. package/src/analyzer/ASTAnalyzer.js +387 -0
  179. package/src/analyzer/CallStackAnalyzer.js +379 -0
  180. package/src/analyzer/Deobfuscator.js +289 -0
  181. package/src/analyzer/EncryptionAnalyzer.js +99 -0
  182. package/src/analyzer/index.js +22 -0
  183. package/src/browser/EnvBridge.js +186 -0
  184. package/src/browser/cdp.js +168 -0
  185. package/src/browser/client.js +197 -0
  186. package/src/browser/collector.js +444 -0
  187. package/src/browser/collectors/RequestCryptoLinker.js +109 -0
  188. package/src/browser/collectors/ResponseSearcher.js +107 -0
  189. package/src/browser/collectors/ScriptCollector.js +158 -0
  190. package/src/browser/collectors/index.js +26 -0
  191. package/src/browser/defaultHooks.js +932 -0
  192. package/src/browser/hooks/crypto.js +55 -0
  193. package/src/browser/hooks/index.js +64 -0
  194. package/src/browser/hooks/native.js +9 -0
  195. package/src/browser/hooks/network.js +33 -0
  196. package/src/browser/index.js +42 -0
  197. package/src/browser/interceptors/NetworkInterceptor.js +116 -0
  198. package/src/browser/interceptors/ScriptInterceptor.js +76 -0
  199. package/src/browser/interceptors/index.js +6 -0
  200. package/src/browser/ui/analysisPanel.js +1782 -0
  201. package/src/browser/ui/confirmDialog.js +158 -0
  202. package/src/browser/ui/panel.html +152 -0
  203. package/src/browser/ui/selector.js +170 -0
  204. package/src/config/index.js +5 -0
  205. package/src/config/paths.js +71 -0
  206. package/src/config/patterns/crypto.js +36 -0
  207. package/src/config/profiles/chrome.json +71 -0
  208. package/src/config/profiles/firefox.json +44 -0
  209. package/src/config/profiles/safari.json +38 -0
  210. package/src/core/EnvMonitor.js +200 -0
  211. package/src/core/PatchGenerator.js +278 -0
  212. package/src/core/Sandbox.js +181 -0
  213. package/src/env/AntiAntiDebug.js +111 -0
  214. package/src/env/AsyncHook.js +68 -0
  215. package/src/env/BrowserAPIList.js +265 -0
  216. package/src/env/CookieHook.js +48 -0
  217. package/src/env/CryptoHook.js +205 -0
  218. package/src/env/EnvCodeGenerator.js +157 -0
  219. package/src/env/EnvDumper.js +356 -0
  220. package/src/env/EnvExtractor.js +220 -0
  221. package/src/env/HookBase.js +618 -0
  222. package/src/env/NetworkHook.js +159 -0
  223. package/src/env/modules/bom/history.js +29 -0
  224. package/src/env/modules/bom/location.js +26 -0
  225. package/src/env/modules/bom/navigator.js +70 -0
  226. package/src/env/modules/bom/screen.js +26 -0
  227. package/src/env/modules/bom/storage.js +23 -0
  228. package/src/env/modules/dom/document.js +110 -0
  229. package/src/env/modules/dom/event.js +51 -0
  230. package/src/env/modules/index.js +34 -0
  231. package/src/env/modules/webapi/fetch.js +46 -0
  232. package/src/env/modules/webapi/url.js +47 -0
  233. package/src/env/modules/webapi/xhr.js +48 -0
  234. package/src/index.js +27 -0
  235. package/src/mcp/server.js +89 -0
  236. package/src/store/DataStore.js +708 -0
  237. package/src/store/Store.js +158 -0
  238. package/src/store/Validator.js +24 -0
  239. package/test/analyze.test.js +90 -0
  240. package/test/envdump.test.js +74 -0
  241. package/test/flow.test.js +90 -0
  242. package/test/hooks.test.js +138 -0
  243. package/test/plugin.test.js +35 -0
  244. package/test/refactor-full.test.js +30 -0
  245. package/test/refactor.test.js +21 -0
  246. package/test/samples/obfuscated.js +61 -0
  247. package/test/samples/original.js +66 -0
  248. package/test/samples/v10_eval_chain.js +52 -0
  249. package/test/samples/v11_bytecode_vm.js +81 -0
  250. package/test/samples/v12_polymorphic.js +69 -0
  251. package/test/samples/v1_ob_basic.js +98 -0
  252. package/test/samples/v2_ob_advanced.js +99 -0
  253. package/test/samples/v3_jjencode.js +77 -0
  254. package/test/samples/v4_aaencode.js +73 -0
  255. package/test/samples/v5_control_flow.js +86 -0
  256. package/test/samples/v6_string_encryption.js +71 -0
  257. package/test/samples/v7_jsvmp.js +83 -0
  258. package/test/samples/v8_anti_debug.js +79 -0
  259. package/test/samples/v9_proxy_trap.js +49 -0
  260. package/test/samples.test.js +96 -0
  261. package/test/webcrack.test.js +55 -0
@@ -0,0 +1,158 @@
1
+ /**
2
+ * DeepSpider - 知识库存储
3
+ * 文件系统持久化,支持分类索引
4
+ * 统一存储到 ~/.deepspider/store/
5
+ */
6
+
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import { PATHS, ensureDir } from '../config/paths.js';
10
+
11
+ export class Store {
12
+ constructor(options = {}) {
13
+ this.baseDir = options.baseDir || PATHS.STORE_DIR;
14
+ this.cache = new Map();
15
+ this.indexFile = path.join(this.baseDir, 'index.json');
16
+ this.index = { types: {} };
17
+ this._ensureDir();
18
+ this._loadIndex();
19
+ }
20
+
21
+ _ensureDir() {
22
+ ensureDir(this.baseDir);
23
+ }
24
+
25
+ _loadIndex() {
26
+ try {
27
+ if (fs.existsSync(this.indexFile)) {
28
+ this.index = JSON.parse(fs.readFileSync(this.indexFile, 'utf-8'));
29
+ }
30
+ } catch {
31
+ this.index = { types: {} };
32
+ }
33
+ }
34
+
35
+ _saveIndex() {
36
+ fs.writeFileSync(this.indexFile, JSON.stringify(this.index, null, 2));
37
+ }
38
+
39
+ _getFilePath(type, name) {
40
+ const typeDir = path.join(this.baseDir, type);
41
+ if (!fs.existsSync(typeDir)) {
42
+ fs.mkdirSync(typeDir, { recursive: true });
43
+ }
44
+ const safeName = name.replace(/[^a-zA-Z0-9_.-]/g, '_');
45
+ return path.join(typeDir, `${safeName}.json`);
46
+ }
47
+
48
+ save(type, name, entry) {
49
+ const key = `${type}:${name}`;
50
+ const data = { ...entry, type, name, updatedAt: Date.now() };
51
+
52
+ // 写入文件
53
+ const filePath = this._getFilePath(type, name);
54
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
55
+
56
+ // 更新索引
57
+ if (!this.index.types[type]) {
58
+ this.index.types[type] = [];
59
+ }
60
+ if (!this.index.types[type].includes(name)) {
61
+ this.index.types[type].push(name);
62
+ }
63
+ this._saveIndex();
64
+
65
+ // 更新缓存
66
+ this.cache.set(key, data);
67
+
68
+ return { success: true, path: filePath };
69
+ }
70
+
71
+ get(type, name) {
72
+ const key = `${type}:${name}`;
73
+
74
+ // 检查缓存
75
+ if (this.cache.has(key)) {
76
+ return this.cache.get(key);
77
+ }
78
+
79
+ // 从文件读取
80
+ const filePath = this._getFilePath(type, name);
81
+ if (fs.existsSync(filePath)) {
82
+ const data = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
83
+ this.cache.set(key, data);
84
+ return data;
85
+ }
86
+
87
+ return null;
88
+ }
89
+
90
+ query(type, keyword) {
91
+ const results = [];
92
+ const names = this.index.types[type] || [];
93
+
94
+ for (const name of names) {
95
+ if (name.includes(keyword)) {
96
+ const entry = this.get(type, name);
97
+ if (entry) results.push(entry);
98
+ }
99
+ }
100
+
101
+ // 也搜索内容
102
+ if (results.length === 0) {
103
+ for (const name of names) {
104
+ const entry = this.get(type, name);
105
+ if (entry?.code?.includes(keyword)) {
106
+ results.push(entry);
107
+ }
108
+ }
109
+ }
110
+
111
+ return results;
112
+ }
113
+
114
+ // 列出某类型下所有条目
115
+ list(type) {
116
+ return this.index.types[type] || [];
117
+ }
118
+
119
+ // 删除条目
120
+ delete(type, name) {
121
+ const key = `${type}:${name}`;
122
+ const filePath = this._getFilePath(type, name);
123
+
124
+ if (fs.existsSync(filePath)) {
125
+ fs.unlinkSync(filePath);
126
+ }
127
+
128
+ this.cache.delete(key);
129
+
130
+ if (this.index.types[type]) {
131
+ this.index.types[type] = this.index.types[type].filter(n => n !== name);
132
+ this._saveIndex();
133
+ }
134
+ }
135
+
136
+ // 导出所有数据
137
+ exportAll() {
138
+ const all = {};
139
+ for (const [type, names] of Object.entries(this.index.types)) {
140
+ all[type] = names.map(name => this.get(type, name));
141
+ }
142
+ return all;
143
+ }
144
+
145
+ // 导入数据
146
+ import(data) {
147
+ let count = 0;
148
+ for (const [type, entries] of Object.entries(data)) {
149
+ for (const entry of entries) {
150
+ this.save(type, entry.name, entry);
151
+ count++;
152
+ }
153
+ }
154
+ return { imported: count };
155
+ }
156
+ }
157
+
158
+ export default Store;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * DeepSpider - 补丁验证器
3
+ */
4
+
5
+ export class Validator {
6
+ constructor(sandbox) {
7
+ this.sandbox = sandbox;
8
+ }
9
+
10
+ async validate(patch, testCode) {
11
+ try {
12
+ await this.sandbox.inject(patch.code);
13
+ const result = await this.sandbox.execute(testCode);
14
+ return {
15
+ valid: result.success,
16
+ error: result.error
17
+ };
18
+ } catch (e) {
19
+ return { valid: false, error: e.message };
20
+ }
21
+ }
22
+ }
23
+
24
+ export default Validator;
@@ -0,0 +1,90 @@
1
+ /**
2
+ * DeepSpider 分析能力测试
3
+ */
4
+
5
+ import { ASTAnalyzer } from '../src/analyzer/ASTAnalyzer.js';
6
+ import { CallStackAnalyzer } from '../src/analyzer/CallStackAnalyzer.js';
7
+ import { EncryptionAnalyzer } from '../src/analyzer/EncryptionAnalyzer.js';
8
+ import { Deobfuscator } from '../src/analyzer/Deobfuscator.js';
9
+ import { Sandbox } from '../src/core/Sandbox.js';
10
+ import fs from 'fs';
11
+ import path from 'path';
12
+ import { fileURLToPath } from 'url';
13
+
14
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
+
16
+ // 读取测试样本
17
+ const originalCode = fs.readFileSync(path.join(__dirname, 'samples/original.js'), 'utf-8');
18
+ const obfuscatedCode = fs.readFileSync(path.join(__dirname, 'samples/obfuscated.js'), 'utf-8');
19
+
20
+ console.log('=== DeepSpider 分析能力测试 ===\n');
21
+
22
+ // 测试 1: 混淆器识别
23
+ console.log('【测试1】混淆器识别');
24
+ const deob = new Deobfuscator();
25
+ const obfuscatorType = deob.detectObfuscator(obfuscatedCode);
26
+ console.log('识别结果:', obfuscatorType);
27
+ console.log('混淆类型:', deob._detectType(obfuscatedCode));
28
+ console.log('');
29
+
30
+ // 测试 2: 反混淆流水线
31
+ console.log('【测试2】反混淆流水线');
32
+ const pipelineResult = deob.runPipeline(obfuscatedCode);
33
+ console.log('应用的步骤:', pipelineResult.applied);
34
+ console.log('代码长度变化:', obfuscatedCode.length, '->', pipelineResult.code.length);
35
+ console.log('');
36
+
37
+ // 测试 3: AST 分析
38
+ console.log('【测试3】AST 分析');
39
+ const astAnalyzer = new ASTAnalyzer();
40
+ const functions = astAnalyzer.extractFunctions(obfuscatedCode);
41
+ console.log('提取到函数数量:', functions.length);
42
+ functions.forEach(f => console.log(' -', f.name, `(${f.params.join(', ')})`));
43
+ console.log('');
44
+
45
+ // 测试 4: 调用链分析
46
+ console.log('【测试4】调用链分析');
47
+ const callAnalyzer = new CallStackAnalyzer();
48
+ const entryPoints = callAnalyzer.findEntryPoints(obfuscatedCode);
49
+ console.log('入口点:', entryPoints.length);
50
+ entryPoints.forEach(e => console.log(' -', e.type, e.name || ''));
51
+
52
+ const callGraph = callAnalyzer.buildCallGraph(obfuscatedCode);
53
+ console.log('调用图节点数:', callGraph.size);
54
+ console.log('');
55
+
56
+ // 测试 5: 加密分析
57
+ console.log('【测试5】加密分析');
58
+ const encAnalyzer = new EncryptionAnalyzer();
59
+ const cryptoResult = encAnalyzer.analyze(obfuscatedCode);
60
+ console.log('检测到算法:', cryptoResult.detectedAlgorithms.map(a => a.name));
61
+ console.log('可疑函数:', cryptoResult.suspiciousFunctions.length);
62
+ console.log('');
63
+
64
+ // 测试 6: 字符串提取
65
+ console.log('【测试6】字符串提取');
66
+ const strings = astAnalyzer.extractStrings(obfuscatedCode);
67
+ console.log('字符串数量:', strings.length);
68
+ const keyStrings = strings.filter(s =>
69
+ s.value.includes('key') ||
70
+ s.value.includes('sign') ||
71
+ s.value.includes('app')
72
+ );
73
+ console.log('关键字符串:', keyStrings.map(s => s.value));
74
+ console.log('');
75
+
76
+ // 测试 7: 沙箱执行
77
+ console.log('【测试7】沙箱执行');
78
+ const sandbox = new Sandbox();
79
+
80
+ const execResult = await sandbox.execute(obfuscatedCode);
81
+ console.log('执行成功:', execResult.success);
82
+ if (execResult.success) {
83
+ console.log('执行结果:', execResult.result);
84
+ } else {
85
+ console.log('错误:', execResult.error);
86
+ console.log('错误类型:', execResult.errorType);
87
+ console.log('缺失环境:', execResult.missingEnv);
88
+ }
89
+
90
+ console.log('\n=== 测试完成 ===');
@@ -0,0 +1,74 @@
1
+ /**
2
+ * 环境自吐功能测试
3
+ */
4
+
5
+ import { generateEnvDumpCode, generateBaseEnvCode } from '../src/agent/tools/envdump.js';
6
+ import { sandboxExecute, sandboxInject, sandboxReset } from '../src/agent/tools/sandbox.js';
7
+
8
+ async function test() {
9
+ console.log('=== 环境自吐测试 ===\n');
10
+
11
+ // 1. 生成基础环境代码
12
+ console.log('【Step 1】生成基础环境');
13
+ const baseResult = JSON.parse(await generateBaseEnvCode.invoke({}));
14
+ console.log('基础环境代码长度:', baseResult.code.length, '字符\n');
15
+
16
+ // 2. 生成环境自吐代码
17
+ console.log('【Step 2】生成环境自吐代码');
18
+ const dumpResult = JSON.parse(await generateEnvDumpCode.invoke({
19
+ targets: ['window', 'document', 'navigator'],
20
+ enableCallStack: false,
21
+ maxValueLength: 50,
22
+ }));
23
+ console.log('自吐代码长度:', dumpResult.code.length, '字符\n');
24
+
25
+ // 3. 注入基础环境
26
+ console.log('【Step 3】注入基础环境');
27
+ await sandboxReset.invoke({});
28
+ const injectBase = JSON.parse(await sandboxInject.invoke({ code: baseResult.code }));
29
+ console.log('注入结果:', injectBase.success ? '✅' : '❌', '\n');
30
+
31
+ // 4. 注入自吐代码
32
+ console.log('【Step 4】注入自吐代码');
33
+ const injectDump = JSON.parse(await sandboxInject.invoke({ code: dumpResult.code }));
34
+ console.log('注入结果:', injectDump.success ? '✅' : '❌', '\n');
35
+
36
+ // 5. 执行测试代码
37
+ console.log('【Step 5】执行测试代码');
38
+ const testCode = `
39
+ // 模拟目标代码访问环境
40
+ var ua = navigator.userAgent;
41
+ var platform = navigator.platform;
42
+ var cookie = document.cookie;
43
+ document.createElement('div');
44
+ window.innerWidth;
45
+
46
+ // 获取日志
47
+ __deepspider__.getLogs('env');
48
+ `;
49
+
50
+ const execResult = JSON.parse(await sandboxExecute.invoke({ code: testCode, timeout: 3000 }));
51
+ console.log('执行结果:', execResult.success ? '✅' : '❌');
52
+
53
+ if (execResult.success && execResult.result) {
54
+ console.log('\n【环境访问日志】');
55
+ try {
56
+ const logs = JSON.parse(execResult.result);
57
+ console.log('记录条数:', logs.length);
58
+ logs.slice(0, 10).forEach((log, i) => {
59
+ console.log(` ${i + 1}. [${log.type}] ${log.path}`);
60
+ });
61
+ if (logs.length > 10) {
62
+ console.log(` ... 还有 ${logs.length - 10} 条`);
63
+ }
64
+ } catch (e) {
65
+ console.log('日志解析失败:', e.message);
66
+ }
67
+ } else {
68
+ console.log('错误:', execResult.error);
69
+ }
70
+
71
+ console.log('\n=== 测试完成 ===');
72
+ }
73
+
74
+ test().catch(console.error);
@@ -0,0 +1,90 @@
1
+ /**
2
+ * DeepSpider 完整流程测试 - 单样本深度分析
3
+ */
4
+
5
+ import { ASTAnalyzer } from '../src/analyzer/ASTAnalyzer.js';
6
+ import { CallStackAnalyzer } from '../src/analyzer/CallStackAnalyzer.js';
7
+ import { EncryptionAnalyzer } from '../src/analyzer/EncryptionAnalyzer.js';
8
+ import { Deobfuscator } from '../src/analyzer/Deobfuscator.js';
9
+ import { Sandbox } from '../src/core/Sandbox.js';
10
+ import { Store } from '../src/store/Store.js';
11
+ import fs from 'fs';
12
+ import path from 'path';
13
+ import { fileURLToPath } from 'url';
14
+
15
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
16
+
17
+ // 选择 v2_ob_advanced.js 进行深度分析
18
+ const code = fs.readFileSync(
19
+ path.join(__dirname, 'samples/v2_ob_advanced.js'),
20
+ 'utf-8'
21
+ );
22
+
23
+ console.log('=== DeepSpider 完整流程测试 ===\n');
24
+ console.log('目标: v2_ob_advanced.js\n');
25
+
26
+ // Step 1: 混淆识别
27
+ console.log('【Step 1】混淆识别');
28
+ const deob = new Deobfuscator();
29
+ console.log(' 混淆器:', deob.detectObfuscator(code));
30
+ console.log(' 类型:', deob._detectType(code));
31
+
32
+ // Step 2: 反混淆
33
+ console.log('\n【Step 2】反混淆流水线');
34
+ const deobResult = deob.runPipeline(code);
35
+ console.log(' 应用步骤:', deobResult.applied.join(' → '));
36
+ console.log(' 代码压缩:', code.length, '→', deobResult.code.length);
37
+
38
+ // Step 3: AST 分析
39
+ console.log('\n【Step 3】AST 分析');
40
+ const ast = new ASTAnalyzer();
41
+ const funcs = ast.extractFunctions(code);
42
+ console.log(' 函数列表:');
43
+ funcs.forEach(f => console.log(` - ${f.name}(${f.params.join(', ')})`));
44
+
45
+ // Step 4: 调用链分析
46
+ console.log('\n【Step 4】调用链分析');
47
+ const call = new CallStackAnalyzer();
48
+ const graph = call.buildCallGraph(code);
49
+ console.log(' 调用图:');
50
+ for (const [func, calls] of graph) {
51
+ if (calls.length > 0) {
52
+ console.log(` ${func} → ${calls.map(c => c.callee).join(', ')}`);
53
+ }
54
+ }
55
+
56
+ // Step 5: 加密分析
57
+ console.log('\n【Step 5】加密分析');
58
+ const enc = new EncryptionAnalyzer();
59
+ const crypto = enc.analyze(code);
60
+ console.log(' 检测算法:', crypto.detectedAlgorithms.map(a => a.name).join(', ') || '无');
61
+ console.log(' 可疑函数:', crypto.suspiciousFunctions.length);
62
+
63
+ // Step 6: 字符串提取
64
+ console.log('\n【Step 6】字符串提取');
65
+ const strings = ast.extractStrings(code);
66
+ const keywords = strings.filter(s =>
67
+ /sign|key|secret|app|encrypt/i.test(s.value)
68
+ );
69
+ console.log(' 总字符串:', strings.length);
70
+ console.log(' 关键字符串:', keywords.map(s => `"${s.value}"`).join(', '));
71
+
72
+ // Step 7: 沙箱执行
73
+ console.log('\n【Step 7】沙箱执行');
74
+ const sandbox = new Sandbox();
75
+ const result = await sandbox.execute(code, { timeout: 5000 });
76
+ console.log(' 执行状态:', result.success ? '✅ 成功' : '❌ 失败');
77
+ console.log(' 结果:', result.result);
78
+
79
+ // Step 8: 存储结果
80
+ console.log('\n【Step 8】存储分析结果');
81
+ const store = new Store();
82
+ store.save('analysis', 'v2_ob_advanced', {
83
+ obfuscator: deob.detectObfuscator(code),
84
+ functions: funcs.length,
85
+ crypto: crypto.detectedAlgorithms.map(a => a.name),
86
+ executed: result.success
87
+ });
88
+ console.log(' 已保存到 Store');
89
+
90
+ console.log('\n=== 流程测试完成 ===');
@@ -0,0 +1,138 @@
1
+ /**
2
+ * DeepSpider Hook 系统测试
3
+ */
4
+
5
+ import { HookBase } from '../src/env/HookBase.js';
6
+ import { getDefaultHookScript } from '../src/browser/defaultHooks.js';
7
+
8
+ console.log('=== DeepSpider Hook 系统测试 ===\n');
9
+
10
+ // 测试 1: HookBase 代码生成
11
+ console.log('【测试1】HookBase 代码生成');
12
+ const baseCode = HookBase.getBaseCode();
13
+ console.log('基础代码长度:', baseCode.length);
14
+ console.log('包含 __deepspider__:', baseCode.includes('window.__deepspider__'));
15
+ console.log('包含日志限制:', baseCode.includes('LOG_LIMIT'));
16
+ console.log('包含配置管理:', baseCode.includes('getConfig'));
17
+ console.log('');
18
+
19
+ // 测试 2: 完整 Hook 脚本生成
20
+ console.log('【测试2】完整 Hook 脚本生成');
21
+ const fullScript = getDefaultHookScript();
22
+ console.log('完整脚本长度:', fullScript.length);
23
+ console.log('包含 XHR Hook:', fullScript.includes('XHR Hook'));
24
+ console.log('包含 Fetch Hook:', fullScript.includes('Fetch Hook'));
25
+ console.log('包含 Cookie Hook:', fullScript.includes('Cookie Hook'));
26
+ console.log('包含 JSON Hook:', fullScript.includes('JSON Hook'));
27
+ console.log('包含 Eval Hook:', fullScript.includes('Eval/Function Hook'));
28
+ console.log('包含 Crypto Hook:', fullScript.includes('Crypto Hook'));
29
+ console.log('包含 DOM Hook:', fullScript.includes('DOM Hook'));
30
+ console.log('包含 Debugger Bypass:', fullScript.includes('debugger bypassed'));
31
+ console.log('包含 Encoding Hook:', fullScript.includes('Encoding Hook'));
32
+ console.log('包含 Storage Hook:', fullScript.includes('Storage Hook'));
33
+ console.log('包含 WebSocket Hook:', fullScript.includes('WebSocket Hook'));
34
+ console.log('包含 Web Crypto API:', fullScript.includes('WebCrypto'));
35
+ console.log('包含 Canvas Hook:', fullScript.includes('Canvas Hook'));
36
+ console.log('包含 Navigator Hook:', fullScript.includes('Navigator Hook'));
37
+ console.log('包含 Webpack Hook:', fullScript.includes('Webpack Hook'));
38
+ console.log('包含 Forge Hook:', fullScript.includes('Forge Hook'));
39
+ console.log('包含 jsrsasign Hook:', fullScript.includes('jsrsasign Hook'));
40
+ console.log('包含 Proxy Hook:', fullScript.includes('Proxy Hook'));
41
+ console.log('包含 Error Stack Hook:', fullScript.includes('Error Stack Hook'));
42
+ console.log('');
43
+
44
+ // 测试 6: 验证新增 API
45
+ console.log('【测试6】验证新增 API');
46
+ const newAPIs = [
47
+ 'searchLogs',
48
+ 'traceValue',
49
+ 'correlateParams',
50
+ 'getRecentCrypto',
51
+ 'getRecentRequests',
52
+ 'exportLogs',
53
+ 'recordPerf',
54
+ 'getPerf',
55
+ 'getCaller'
56
+ ];
57
+ newAPIs.forEach(api => {
58
+ const found = fullScript.includes(api);
59
+ console.log(` ${found ? '✓' : '✗'} ${api}`);
60
+ });
61
+ console.log('');
62
+
63
+ // 测试 3: 验证 Hook 代码语法
64
+ console.log('【测试3】验证 Hook 代码语法');
65
+ try {
66
+ new Function(fullScript);
67
+ console.log('语法检查: 通过');
68
+ } catch (e) {
69
+ console.error('语法检查: 失败 -', e.message);
70
+ }
71
+ console.log('');
72
+
73
+ // 测试 4: 验证关键功能存在
74
+ console.log('【测试4】验证关键功能');
75
+ const features = [
76
+ { name: 'JSON.parse Hook', pattern: /JSON\.parse\s*=\s*deepspider\.native/ },
77
+ { name: 'JSON.stringify Hook', pattern: /JSON\.stringify\s*=\s*deepspider\.native/ },
78
+ { name: 'eval Hook', pattern: /window\.eval\s*=\s*deepspider\.native/ },
79
+ { name: 'Function Hook', pattern: /window\.Function\s*=\s*deepspider\.native/ },
80
+ { name: 'setTimeout 字符串检测', pattern: /typeof handler === 'string'/ },
81
+ { name: 'CryptoJS 即时 Hook', pattern: /watchGlobal\('CryptoJS'/ },
82
+ { name: 'DOM querySelector Hook', pattern: /m\.obj\[m\.name\]\s*=\s*deepspider\.native/ },
83
+ { name: 'debugger 绕过', pattern: /debugger bypassed/ },
84
+ { name: '日志限制', pattern: /logCounts\[countKey\].*config\.logLimit/ },
85
+ ];
86
+
87
+ features.forEach(f => {
88
+ const found = f.pattern.test(fullScript);
89
+ console.log(` ${found ? '✓' : '✗'} ${f.name}`);
90
+ });
91
+ console.log('');
92
+
93
+ // 测试 5: 验证配置项
94
+ console.log('【测试5】验证配置项');
95
+ const configItems = [
96
+ 'json', 'eval', 'crypto', 'cookie', 'xhr', 'fetch', 'dom', 'logLimit',
97
+ 'captureStack', 'stackDepth', 'protectDescriptor', 'protectKeys',
98
+ 'silent', 'logToConsole'
99
+ ];
100
+ configItems.forEach(item => {
101
+ const found = fullScript.includes(`${item}:`);
102
+ console.log(` ${found ? '✓' : '✗'} config.${item}`);
103
+ });
104
+ console.log('');
105
+
106
+ // 测试 7: 验证反检测功能
107
+ console.log('【测试7】验证反检测功能');
108
+ const antiDetectFeatures = [
109
+ { name: 'toString 伪装', pattern: /hookedFns\.has\(this\)/ },
110
+ { name: 'getOwnPropertyDescriptor 保护', pattern: /Object\.getOwnPropertyDescriptor\s*=\s*function/ },
111
+ { name: 'Object.keys 保护', pattern: /Object\.keys\s*=\s*function/ },
112
+ { name: 'getOwnPropertyNames 保护', pattern: /Object\.getOwnPropertyNames\s*=\s*function/ },
113
+ { name: 'Error.stack 过滤', pattern: /__deepspider__|DeepSpider|deepspider\\.native/ },
114
+ { name: 'Proxy 监控', pattern: /Proxy\.create/ },
115
+ ];
116
+ antiDetectFeatures.forEach(f => {
117
+ const found = f.pattern.test(fullScript);
118
+ console.log(` ${found ? '✓' : '✗'} ${f.name}`);
119
+ });
120
+ console.log('');
121
+
122
+ // 测试 8: 验证 Hook 管理 API
123
+ console.log('【测试8】验证 Hook 管理 API');
124
+ const hookMgmtAPIs = [
125
+ 'registerHook',
126
+ 'enableHook',
127
+ 'disableHook',
128
+ 'listHooks',
129
+ 'injectHook',
130
+ 'setHooks'
131
+ ];
132
+ hookMgmtAPIs.forEach(api => {
133
+ const found = fullScript.includes(api);
134
+ console.log(` ${found ? '✓' : '✗'} ${api}`);
135
+ });
136
+ console.log('');
137
+
138
+ console.log('=== Hook 系统测试完成 ===');
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Plugin 可用性测试
3
+ */
4
+
5
+ import { allTools } from '../src/agent/tools/index.js';
6
+
7
+ console.log('=== Plugin 工具验证 ===\n');
8
+
9
+ console.log('【工具数量】', allTools.length, '个\n');
10
+
11
+ // 验证每个工具
12
+ let valid = 0;
13
+ let invalid = 0;
14
+
15
+ for (const tool of allTools) {
16
+ const hasName = !!tool.name;
17
+ const hasDesc = !!tool.description;
18
+ const hasSchema = !!tool.schema;
19
+
20
+ if (hasName && hasDesc && hasSchema) {
21
+ valid++;
22
+ } else {
23
+ invalid++;
24
+ console.log('❌', tool.name || 'unknown', '- 缺少必要属性');
25
+ }
26
+ }
27
+
28
+ console.log(`\n验证结果: ${valid} 个有效, ${invalid} 个无效`);
29
+
30
+ if (invalid === 0) {
31
+ console.log('\n✅ 所有工具验证通过!');
32
+ } else {
33
+ console.log('\n❌ 存在无效工具');
34
+ process.exit(1);
35
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * DeepSpider 完整重构测试
3
+ */
4
+
5
+ import { allTools } from '../src/agent/tools/index.js';
6
+ import { allSubagents } from '../src/agent/subagents/index.js';
7
+
8
+ async function testTools() {
9
+ console.log('=== 测试工具导入 ===');
10
+ console.log('工具数量:', allTools.length);
11
+ console.log('工具列表:', allTools.map(t => t.name).join(', '));
12
+ console.log('');
13
+ }
14
+
15
+ async function testSubagents() {
16
+ console.log('=== 测试子代理 ===');
17
+ console.log('子代理数量:', allSubagents.length);
18
+ allSubagents.forEach(s => {
19
+ console.log(`- ${s.name}: ${s.tools?.length || 0} 个工具`);
20
+ });
21
+ console.log('');
22
+ }
23
+
24
+ async function main() {
25
+ await testTools();
26
+ await testSubagents();
27
+ console.log('完整重构测试通过!');
28
+ }
29
+
30
+ main().catch(console.error);
@@ -0,0 +1,21 @@
1
+ /**
2
+ * DeepSpider 重构测试
3
+ */
4
+
5
+ import { Store } from '../src/store/Store.js';
6
+
7
+ async function testStore() {
8
+ console.log('=== 测试知识库 ===');
9
+ const store = new Store();
10
+ store.save('env', 'navigator', { code: 'test' });
11
+ const result = store.get('env', 'navigator');
12
+ console.log('存储成功:', result !== undefined);
13
+ console.log('知识库测试通过!\n');
14
+ }
15
+
16
+ async function main() {
17
+ await testStore();
18
+ console.log('重构基础测试通过!');
19
+ }
20
+
21
+ main().catch(console.error);