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,16 @@
1
+ ---
2
+ total: 1
3
+ last_merged: null
4
+ ---
5
+
6
+ ## 核心经验
7
+
8
+ <!-- 经过验证的高价值经验 -->
9
+
10
+ ### [2026-02-02] AES-CFB 加密爬虫实现模式
11
+ **场景**: 招标采购网站使用 AES-CFB 加密请求参数,Key和IV为 "jinrun2024secret",需要实现 Python 加密模块并集成到爬虫中
12
+ **经验**: AES-CFB 加密网站爬虫开发时,使用 pycryptodome 的 AES.MODE_CFB 模式,segment_size=128,密钥和IV需要截取16字节。加密后Base64编码,请求体直接发送密文字符串。
13
+
14
+ ## 近期发现
15
+
16
+ <!-- 最近发现,FIFO 滚动,最多保留 10 条 -->
@@ -0,0 +1,91 @@
1
+ ---
2
+ name: dynamic-analysis
3
+ description: |
4
+ JS 动态调试经验。断点技巧、Hook 策略、反调试绕过。
5
+ 触发:运行时调试、拦截加密调用、绕过反调试。
6
+ ---
7
+
8
+ # 动态分析经验
9
+
10
+ ## 定位技巧
11
+
12
+ **XHR 断点法(最高效):**
13
+ 1. 在目标请求 URL 设断点
14
+ 2. 触发请求,断住后看调用栈
15
+ 3. 从下往上找 encrypt/sign 相关函数
16
+
17
+ **Hook 观察法:**
18
+ 1. 注入通用加密 Hook
19
+ 2. 触发操作,观察日志
20
+ 3. 根据日志定位具体函数
21
+
22
+ ## 反调试绕过
23
+
24
+ **无限 debugger:**
25
+ - 原理:`Function("debugger")()` 或 `eval("debugger")`
26
+ - 绕过:重写 Function.prototype.constructor
27
+
28
+ **控制台检测:**
29
+ - 原理:检测 `console.log` 执行时间或 `devtools` 对象
30
+ - 绕过:Hook console 方法,固定返回值
31
+
32
+ **时间检测:**
33
+ - 原理:`Date.now()` 前后差值判断是否被调试
34
+ - 绕过:Hook Date.now(),返回递增固定值
35
+
36
+ ## 调用追踪
37
+
38
+ ### 追踪方法
39
+
40
+ 1. 搜索目标参数名
41
+ 2. 定位赋值位置
42
+ 3. 向上追溯来源
43
+ 4. 找到生成函数
44
+
45
+ ### Hook 模板
46
+
47
+ ```javascript
48
+ // 函数 Hook
49
+ const _orig = obj.func;
50
+ obj.func = function(...args) {
51
+ console.log('args:', args);
52
+ const r = _orig.apply(this, args);
53
+ console.log('return:', r);
54
+ return r;
55
+ };
56
+ ```
57
+
58
+ ## Hook 策略经验
59
+
60
+ ### 何时调整 Hook
61
+
62
+ **日志刷屏时**:
63
+ - 现象:控制台被 DOM 查询日志淹没
64
+ - 原因:网站频繁操作 DOM(如虚拟滚动、实时更新)
65
+ - 经验:关闭 dom Hook,专注于 crypto/xhr 日志
66
+
67
+ **定位 Canvas 指纹时**:
68
+ - 现象:需要追踪指纹生成逻辑
69
+ - 经验:启用 env Hook,观察 toDataURL/getImageData 调用
70
+
71
+ **自定义加密函数**:
72
+ - 现象:crypto 日志没有捕获到加密调用
73
+ - 原因:网站用了自定义函数名(如 `window.encrypt`、`utils.sign`)
74
+ - 经验:注入针对性 Hook,监控特定函数
75
+
76
+ ### 常见陷阱
77
+
78
+ **Hook 被检测**:
79
+ - 现象:网站检测到 Hook 后行为异常
80
+ - 原因:检查了 `Function.prototype.toString`
81
+ - 经验:DeepSpider 已内置 toString 伪装,一般不会触发
82
+
83
+ **日志丢失**:
84
+ - 现象:明明有加密调用,但日志里没有
85
+ - 原因:加密库在 Hook 注入前就加载了
86
+ - 经验:使用 `add_init_script` 确保 Hook 最先执行
87
+
88
+ **性能问题**:
89
+ - 现象:页面变卡
90
+ - 原因:调用栈记录开销大
91
+ - 经验:关闭 `captureStack` 或启用 `silent` 模式
@@ -0,0 +1,12 @@
1
+ ---
2
+ total: 0
3
+ last_merged: null
4
+ ---
5
+
6
+ ## 核心经验
7
+
8
+ <!-- 经过验证的高价值经验 -->
9
+
10
+ ## 近期发现
11
+
12
+ <!-- 最近发现,FIFO 滚动,最多保留 10 条 -->
@@ -0,0 +1,72 @@
1
+ ---
2
+ name: env
3
+ description: |
4
+ 浏览器环境补全经验。检测点、指纹伪造、绕过技巧。
5
+ 触发:环境检测绕过、补环境、指纹伪造。
6
+ ---
7
+
8
+ # 补环境经验
9
+
10
+ ## 高频检测点
11
+
12
+ **必补:**
13
+ - `navigator.webdriver` → `undefined`
14
+ - `window.chrome` → 完整对象
15
+ - `navigator.plugins` → 非空数组
16
+ - `navigator.languages` → `['zh-CN', 'zh']`
17
+
18
+ **指纹类:**
19
+ - Canvas 指纹:`toDataURL()` 返回固定值
20
+ - WebGL 指纹:`getParameter()` 返回固定值
21
+ - 音频指纹:`AudioContext` 返回固定值
22
+
23
+ ## 绕过技巧
24
+
25
+ **不要用 Proxy:** 很多网站检测 Proxy,用 `Object.defineProperty` 代替。
26
+
27
+ **原型链完整性:** `toString.call(obj)` 要返回正确类型。
28
+
29
+ **native code 伪装:** 函数的 `toString()` 要返回 `function xxx() { [native code] }`。
30
+
31
+ ## 环境自吐
32
+
33
+ 代码报错时,错误信息会暴露缺失的属性路径,按路径补全即可。
34
+
35
+ ## 常见错误与补丁
36
+
37
+ | 错误 | 缺失环境 |
38
+ |------|----------|
39
+ | `window is not defined` | window |
40
+ | `document is not defined` | document |
41
+ | `navigator is not defined` | navigator |
42
+ | `localStorage is not defined` | localStorage |
43
+
44
+ ## 补丁模板
45
+
46
+ **window:**
47
+ ```javascript
48
+ var window = global;
49
+ window.location = {
50
+ href: 'https://example.com/',
51
+ hostname: 'example.com',
52
+ protocol: 'https:'
53
+ };
54
+ ```
55
+
56
+ **document:**
57
+ ```javascript
58
+ var document = {
59
+ cookie: '',
60
+ createElement: (t) => ({tagName: t, style: {}}),
61
+ getElementById: () => null
62
+ };
63
+ ```
64
+
65
+ ## 指纹检测绕过
66
+
67
+ | 检测项 | 代码特征 |
68
+ |--------|----------|
69
+ | webdriver | `navigator.webdriver` |
70
+ | headless | `navigator.plugins.length` |
71
+ | canvas | `toDataURL()` |
72
+ | WebGL | `getParameter()` |
@@ -0,0 +1,12 @@
1
+ ---
2
+ total: 0
3
+ last_merged: null
4
+ ---
5
+
6
+ ## 核心经验
7
+
8
+ <!-- 经过验证的高价值经验 -->
9
+
10
+ ## 近期发现
11
+
12
+ <!-- 最近发现,FIFO 滚动,最多保留 10 条 -->
@@ -0,0 +1,79 @@
1
+ /**
2
+ * DeepSpider - 自我进化 Skills 中间件
3
+ * 合并静态 SKILL.md + 动态 evolved.md
4
+ */
5
+
6
+ import fs from 'fs';
7
+ import path from 'path';
8
+
9
+ // 配置
10
+ const MAX_RECENT_ITEMS = 10;
11
+ const MERGE_THRESHOLD = 20;
12
+
13
+ /**
14
+ * 解析 evolved.md 文件
15
+ */
16
+ function parseEvolvedMd(content) {
17
+ const result = {
18
+ total: 0,
19
+ lastMerged: null,
20
+ core: '',
21
+ recent: [],
22
+ };
23
+
24
+ if (!content) return result;
25
+
26
+ // 解析 frontmatter
27
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
28
+ if (frontmatterMatch) {
29
+ const fm = frontmatterMatch[1];
30
+ const totalMatch = fm.match(/total:\s*(\d+)/);
31
+ const mergedMatch = fm.match(/last_merged:\s*(.+)/);
32
+ if (totalMatch) result.total = parseInt(totalMatch[1], 10);
33
+ if (mergedMatch && mergedMatch[1] !== 'null') {
34
+ result.lastMerged = mergedMatch[1].trim();
35
+ }
36
+ }
37
+
38
+ // 解析核心经验
39
+ const coreMatch = content.match(/## 核心经验\n([\s\S]*?)(?=## 近期发现|$)/);
40
+ if (coreMatch) {
41
+ result.core = coreMatch[1].trim();
42
+ }
43
+
44
+ // 解析近期发现
45
+ const recentMatch = content.match(/## 近期发现\n([\s\S]*?)$/);
46
+ if (recentMatch) {
47
+ const recentContent = recentMatch[1].trim();
48
+ // 按 ### 分割
49
+ const items = recentContent.split(/(?=### \[)/);
50
+ result.recent = items.filter(item => item.trim()).slice(-MAX_RECENT_ITEMS);
51
+ }
52
+
53
+ return result;
54
+ }
55
+
56
+ /**
57
+ * 生成 evolved.md 内容
58
+ */
59
+ function generateEvolvedMd(data) {
60
+ const { total, lastMerged, core, recent } = data;
61
+
62
+ let content = `---
63
+ total: ${total}
64
+ last_merged: ${lastMerged || 'null'}
65
+ ---
66
+
67
+ ## 核心经验
68
+
69
+ ${core || '<!-- 经过验证的高价值经验 -->'}
70
+
71
+ ## 近期发现
72
+
73
+ ${recent.length > 0 ? recent.join('\n\n') : '<!-- 最近发现,FIFO 滚动,最多保留 10 条 -->'}
74
+ `;
75
+
76
+ return content;
77
+ }
78
+
79
+ export { parseEvolvedMd, generateEvolvedMd, MAX_RECENT_ITEMS, MERGE_THRESHOLD };
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: general
3
+ description: |
4
+ 通用经验。存放跨领域或未分类的经验。
5
+ 触发:不属于特定分析方向的通用技巧。
6
+ ---
7
+
8
+ # 通用经验
9
+
10
+ 存放跨领域或暂时无法分类的经验。
11
+
12
+ 当某类经验积累较多时,考虑拆分为独立 skill。
@@ -0,0 +1,12 @@
1
+ ---
2
+ total: 0
3
+ last_merged: null
4
+ ---
5
+
6
+ ## 核心经验
7
+
8
+ <!-- 经过验证的高价值经验 -->
9
+
10
+ ## 近期发现
11
+
12
+ <!-- 最近发现,FIFO 滚动,最多保留 10 条 -->
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: js2python
3
+ description: |
4
+ JS 转 Python 经验。加密算法转换、库对照、常见陷阱。
5
+ 触发:将 JS 加密转为 Python、爬虫需要 Python 实现。
6
+ ---
7
+
8
+ # JS 转 Python 经验
9
+
10
+ ## 库对照表
11
+
12
+ | JS | Python | 用途 |
13
+ |----|--------|------|
14
+ | CryptoJS | pycryptodome | AES/DES/MD5/SHA |
15
+ | JSEncrypt | rsa/pycryptodome | RSA |
16
+ | sm-crypto | gmssl | 国密 |
17
+
18
+ ## 常见陷阱
19
+
20
+ **CryptoJS 字符串密钥:** 会自动用 OpenSSL KDF 派生,Python 需手动实现。
21
+
22
+ **编码差异:** JS 自动 UTF-8,Python 需显式 `.encode('utf-8')`。
23
+
24
+ **填充方式:** 确认 PKCS7/PKCS5 是否一致。
25
+
26
+ **CFB 模式 segment_size:** CryptoJS AES-CFB 默认 CFB128,PyCryptodome 默认 CFB8。必须指定 `segment_size=128`。
27
+
28
+ ## 降级策略
29
+
30
+ 纯 Python 失败 3 次 → 改用 execjs 直接执行 JS。
@@ -0,0 +1,13 @@
1
+ ---
2
+ total: 0
3
+ last_merged: 2026-02-02
4
+ ---
5
+
6
+ ## 核心经验
7
+
8
+ <!-- 经过验证的高价值经验 -->
9
+ <!-- [已合并] CFB segment_size 差异 → SKILL.md -->
10
+
11
+ ## 近期发现
12
+
13
+ <!-- 最近发现,FIFO 滚动,最多保留 10 条 -->
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: report
3
+ description: |
4
+ 分析结果输出。保存代码、记录发现。
5
+ 触发:保存分析结果、导出脚本。
6
+ ---
7
+
8
+ # 输出规范
9
+
10
+ ## 代码输出
11
+
12
+ 提取的代码应包含:
13
+ - 完整的依赖函数
14
+ - 必要的环境补丁
15
+ - 调用示例
16
+
17
+ ## 命名建议
18
+
19
+ - `encrypt.js` - 加密函数
20
+ - `env.js` - 环境补丁
21
+ - `crypto.py` - Python 实现
@@ -0,0 +1,12 @@
1
+ ---
2
+ total: 0
3
+ last_merged: null
4
+ ---
5
+
6
+ ## 核心经验
7
+
8
+ <!-- 经过验证的高价值经验 -->
9
+
10
+ ## 近期发现
11
+
12
+ <!-- 最近发现,FIFO 滚动,最多保留 10 条 -->
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: sandbox
3
+ description: |
4
+ 沙箱执行经验。代码验证、常见问题处理。
5
+ 触发:验证加密算法、测试代码能否运行。
6
+ ---
7
+
8
+ # 沙箱执行经验
9
+
10
+ ## 常见问题
11
+
12
+ **异步代码:** 加密函数可能返回 Promise,需要 await。
13
+
14
+ **随机值不一致:** Hook `Math.random()` 返回固定值。
15
+
16
+ **时间戳不一致:** Hook `Date.now()` 返回固定时间。
17
+
18
+ **模块依赖:** 提取代码时要包含依赖的工具函数。
19
+
20
+ ## 验证技巧
21
+
22
+ 用浏览器控制台的输入输出作为测试用例,对比沙箱执行结果。
@@ -0,0 +1,16 @@
1
+ ---
2
+ total: 1
3
+ last_merged: null
4
+ ---
5
+
6
+ ## 核心经验
7
+
8
+ <!-- 经过验证的高价值经验 -->
9
+
10
+ ## 近期发现
11
+
12
+ <!-- 最近发现,FIFO 滚动,最多保留 10 条 -->
13
+
14
+ ### [2026-02-02] Python 加密代码验证流程
15
+ **场景**: 验证 zbcg_zg_encrypt.py 的 AES-CFB 加密实现
16
+ **经验**: 验证 Python 加密代码时,先分析算法参数(密钥长度、IV、模式),然后用 JavaScript Web Crypto API 进行交叉验证,最后创建完整的测试用例覆盖边界情况(空字符串、特殊字符、中文等)。AES-CFB 模式不需要填充,pycryptodome 的默认 segment_size=128 与 Web Crypto API 兼容。
@@ -0,0 +1,93 @@
1
+ ---
2
+ name: static-analysis
3
+ description: |
4
+ JS 静态代码分析经验。混淆识别、加密定位、代码还原技巧。
5
+ 触发:分析混淆代码、定位加密函数、还原算法逻辑。
6
+ ---
7
+
8
+ # 静态分析经验
9
+
10
+ ## 加密入口定位
11
+
12
+ **高频关键词:**
13
+ - 加密相关:encrypt, decrypt, sign, verify, hash
14
+ - 参数相关:token, signature, timestamp, nonce
15
+ - 算法名:MD5, SHA, AES, RSA, HMAC, SM2, SM3, SM4
16
+
17
+ **从请求参数反推:** 找到加密参数名(如 `sign`),全局搜索赋值位置。
18
+
19
+ ## 混淆器识别
20
+
21
+ | 特征 | 类型 | 难度 |
22
+ |------|------|------|
23
+ | `_0x` 开头变量 + 大数组 | obfuscator.io | 中 |
24
+ | `eval(function(p,a,c,k,e,d)` | Packer | 低 |
25
+ | 大量 switch-case 嵌套 | 控制流平坦化 | 高 |
26
+ | 字符串全是 `\x` 转义 | 字符串混淆 | 低 |
27
+ | 所有函数名是随机字符 | 标识符混淆 | 中 |
28
+
29
+ **控制流平坦化:** 静态难还原,建议配合动态分析。
30
+
31
+ ## 加密库特征
32
+
33
+ **CryptoJS:**
34
+ - 关键词:`WordArray`, `enc.Utf8`, `enc.Hex`, `enc.Base64`
35
+ - 调用模式:`CryptoJS.AES.encrypt(data, key)`
36
+
37
+ **JSEncrypt (RSA):**
38
+ - 关键词:`setPublicKey`, `setPrivateKey`, `encrypt`, `decrypt`
39
+ - 通常有 PEM 格式公钥字符串
40
+
41
+ **国密:**
42
+ - 关键词:`sm2.doEncrypt`, `sm3`, `sm4.encrypt`
43
+ - 注意 C1C3C2 和 C1C2C3 模式区别
44
+
45
+ ## Webpack 解包要点
46
+
47
+ - 入口模块:找 `__webpack_require__.s` 或数组最后一个元素
48
+ - 异步加载:搜索 `webpackJsonp` 或 `__webpack_require__.e`
49
+ - 模块 ID:可能是数字或哈希字符串
50
+
51
+ ## 加密算法特征速查
52
+
53
+ ### 哈希算法
54
+
55
+ | 算法 | 特征 | 输出长度 |
56
+ |------|------|----------|
57
+ | MD5 | `md5(`, `CryptoJS.MD5` | 32位hex |
58
+ | SHA1 | `sha1`, `CryptoJS.SHA1` | 40位hex |
59
+ | SHA256 | `sha256`, `CryptoJS.SHA256` | 64位hex |
60
+ | SM3 | `sm3(`, `SM3` | 64位hex |
61
+
62
+ ### 对称加密
63
+
64
+ | 算法 | 特征 | 模式 |
65
+ |------|------|------|
66
+ | AES | `AES.encrypt`, `CryptoJS.AES` | CBC/ECB/CTR/GCM |
67
+ | DES | `DES.encrypt`, `CryptoJS.DES` | CBC/ECB |
68
+ | SM4 | `sm4(`, `SM4.encrypt` | CBC/ECB |
69
+
70
+ ### 非对称加密
71
+
72
+ | 算法 | 特征 | 用途 |
73
+ |------|------|------|
74
+ | RSA | `RSAKey`, `JSEncrypt`, `KEYUTIL` | 加密/签名 |
75
+ | SM2 | `sm2(`, `SM2.encrypt`, `sm2.doEncrypt` | 加密/签名 |
76
+
77
+ ## 反混淆处理
78
+
79
+ ### 混淆类型识别
80
+
81
+ | 类型 | 特征 |
82
+ |------|------|
83
+ | eval | `eval(` 包装 |
84
+ | 字符串数组 | `_0x` 变量 |
85
+ | 控制流 | switch-case 嵌套 |
86
+ | Unicode | `\u0061` 编码 |
87
+
88
+ ### 处理步骤
89
+
90
+ 1. 识别混淆类型
91
+ 2. 解码字符串
92
+ 3. 简化控制流
93
+ 4. 重命名变量
@@ -0,0 +1,12 @@
1
+ ---
2
+ total: 0
3
+ last_merged: null
4
+ ---
5
+
6
+ ## 核心经验
7
+
8
+ <!-- 经过验证的高价值经验 -->
9
+
10
+ ## 近期发现
11
+
12
+ <!-- 最近发现,FIFO 滚动,最多保留 10 条 -->
@@ -0,0 +1,119 @@
1
+ ---
2
+ name: xpath
3
+ description: |
4
+ XPath 表达式编写最佳实践。生成通用、健壮的 XPath,避免脆弱的路径。
5
+ ---
6
+
7
+ # XPath 最佳实践
8
+
9
+ ## 核心原则
10
+
11
+ 1. **使用唯一特征** - 优先用 id、class、data-* 属性
12
+ 2. **避免过于具体** - 不要写死完整路径
13
+ 3. **使用属性匹配** - 比位置索引更稳定
14
+ 4. **考虑页面变化** - 结构变化时仍能工作
15
+
16
+ ## 基础语法
17
+
18
+ ### 节点选择
19
+ ```
20
+ //* # 所有节点
21
+ //li # 所有 li 节点
22
+ //li/a # li 的直接子节点 a
23
+ //li//a # li 的所有子孙节点 a
24
+ //a/.. # a 的父节点
25
+ ```
26
+
27
+ ### 文本和属性
28
+ ```
29
+ //a/text() # 获取文本
30
+ //a/@href # 获取属性值
31
+ //a[@href='link.html'] # 属性匹配
32
+ ```
33
+
34
+ ## 推荐写法 vs 不推荐写法
35
+
36
+ ### 列表项选择
37
+ ```
38
+ # 推荐 - 使用 class 属性
39
+ //li[@class="item"]
40
+ //li[contains(@class, "item")]
41
+
42
+ # 不推荐 - 使用完整路径
43
+ /html/body/div/ul/li
44
+ ```
45
+
46
+ ### 下一页按钮
47
+ ```
48
+ # 推荐 - 使用文本或位置
49
+ //a[contains(text(), "下一页")]
50
+ //ul[@class="pagination"]/li[last()-1]/a
51
+
52
+ # 不推荐 - 硬编码索引
53
+ //ul/li[7]/a
54
+ ```
55
+
56
+ ## 高级技巧
57
+
58
+ ### 多属性匹配
59
+ ```
60
+ //li[contains(@class, "item") and @data-type="link"]
61
+ //li[@class="item" or @class="active"]
62
+ ```
63
+
64
+ ### 属性多值匹配
65
+ ```
66
+ # class="li li-first" 的情况
67
+ //li[contains(@class, "li-first")]
68
+ ```
69
+
70
+ ### 位置选择
71
+ ```
72
+ //li[1] # 第一个
73
+ //li[last()] # 最后一个
74
+ //li[position()<=3] # 前三个
75
+ //li[position()>1] # 除第一个外
76
+ ```
77
+
78
+ ### 兄弟节点
79
+ ```
80
+ //li[@class="current"]/following-sibling::li[1] # 下一个兄弟
81
+ //li[@class="current"]/preceding-sibling::li[1] # 上一个兄弟
82
+ ```
83
+
84
+ ## 常见场景
85
+
86
+ ### 列表页标题
87
+ ```
88
+ //ul[@class="list"]//a/text()
89
+ //div[contains(@class, "item")]//h3/text()
90
+ ```
91
+
92
+ ### 列表页链接
93
+ ```
94
+ //ul[@class="list"]//a/@href
95
+ //div[contains(@class, "item")]//a/@href
96
+ ```
97
+
98
+ ### 分页-下一页
99
+ ```
100
+ //a[contains(text(), "下一页")]
101
+ //a[contains(text(), "下页")]
102
+ //li[last()-1]/a
103
+ //a[@class="next"]
104
+ ```
105
+
106
+ ### 分页-无下一页按钮
107
+ ```
108
+ //a[@class="current"]/following-sibling::a[1]
109
+ ```
110
+
111
+ ## 常用方法
112
+
113
+ | 方法 | 说明 | 示例 |
114
+ |------|------|------|
115
+ | contains() | 包含匹配 | `//li[contains(@class, "item")]` |
116
+ | text() | 获取文本 | `//a/text()` |
117
+ | last() | 最后位置 | `//li[last()]` |
118
+ | position() | 当前位置 | `//li[position()<3]` |
119
+ | normalize-space() | 去空白 | `normalize-space(text())` |