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.
- package/.claude/agents/check.md +122 -0
- package/.claude/agents/debug.md +106 -0
- package/.claude/agents/dispatch.md +214 -0
- package/.claude/agents/implement.md +96 -0
- package/.claude/agents/plan.md +396 -0
- package/.claude/agents/research.md +120 -0
- package/.claude/commands/evolve/merge.md +80 -0
- package/.claude/commands/trellis/before-backend-dev.md +13 -0
- package/.claude/commands/trellis/before-frontend-dev.md +13 -0
- package/.claude/commands/trellis/break-loop.md +107 -0
- package/.claude/commands/trellis/check-backend.md +13 -0
- package/.claude/commands/trellis/check-cross-layer.md +153 -0
- package/.claude/commands/trellis/check-frontend.md +13 -0
- package/.claude/commands/trellis/create-command.md +154 -0
- package/.claude/commands/trellis/finish-work.md +129 -0
- package/.claude/commands/trellis/integrate-skill.md +219 -0
- package/.claude/commands/trellis/onboard.md +358 -0
- package/.claude/commands/trellis/parallel.md +193 -0
- package/.claude/commands/trellis/record-session.md +62 -0
- package/.claude/commands/trellis/start.md +280 -0
- package/.claude/commands/trellis/update-spec.md +213 -0
- package/.claude/hooks/inject-subagent-context.py +758 -0
- package/.claude/hooks/ralph-loop.py +374 -0
- package/.claude/hooks/session-start.py +126 -0
- package/.claude/settings.json +41 -0
- package/.claude/skills/deepagents-guide/SKILL.md +428 -0
- package/.cursor/commands/trellis-before-backend-dev.md +13 -0
- package/.cursor/commands/trellis-before-frontend-dev.md +13 -0
- package/.cursor/commands/trellis-break-loop.md +107 -0
- package/.cursor/commands/trellis-check-backend.md +13 -0
- package/.cursor/commands/trellis-check-cross-layer.md +153 -0
- package/.cursor/commands/trellis-check-frontend.md +13 -0
- package/.cursor/commands/trellis-create-command.md +154 -0
- package/.cursor/commands/trellis-finish-work.md +129 -0
- package/.cursor/commands/trellis-integrate-skill.md +219 -0
- package/.cursor/commands/trellis-onboard.md +358 -0
- package/.cursor/commands/trellis-record-session.md +62 -0
- package/.cursor/commands/trellis-start.md +156 -0
- package/.cursor/commands/trellis-update-spec.md +213 -0
- package/.env.example +11 -0
- package/.husky/pre-commit +1 -0
- package/.mcp.json +8 -0
- package/.trellis/.template-hashes.json +65 -0
- package/.trellis/.version +1 -0
- package/.trellis/scripts/add-session.sh +384 -0
- package/.trellis/scripts/common/developer.sh +129 -0
- package/.trellis/scripts/common/git-context.sh +263 -0
- package/.trellis/scripts/common/paths.sh +208 -0
- package/.trellis/scripts/common/phase.sh +150 -0
- package/.trellis/scripts/common/registry.sh +247 -0
- package/.trellis/scripts/common/task-queue.sh +142 -0
- package/.trellis/scripts/common/task-utils.sh +151 -0
- package/.trellis/scripts/common/worktree.sh +128 -0
- package/.trellis/scripts/create-bootstrap.sh +299 -0
- package/.trellis/scripts/get-context.sh +7 -0
- package/.trellis/scripts/get-developer.sh +15 -0
- package/.trellis/scripts/init-developer.sh +34 -0
- package/.trellis/scripts/multi-agent/cleanup.sh +396 -0
- package/.trellis/scripts/multi-agent/create-pr.sh +241 -0
- package/.trellis/scripts/multi-agent/plan.sh +207 -0
- package/.trellis/scripts/multi-agent/start.sh +310 -0
- package/.trellis/scripts/multi-agent/status.sh +828 -0
- package/.trellis/scripts/task.sh +1118 -0
- package/.trellis/spec/backend/deepagents-guide.md +337 -0
- package/.trellis/spec/backend/directory-structure.md +126 -0
- package/.trellis/spec/backend/examples/skills/deepagents-guide/README.md +11 -0
- package/.trellis/spec/backend/examples/skills/deepagents-guide/agent.js.template +20 -0
- package/.trellis/spec/backend/examples/skills/deepagents-guide/skills-config.js.template +13 -0
- package/.trellis/spec/backend/examples/skills/deepagents-guide/subagent.js.template +19 -0
- package/.trellis/spec/backend/hook-guidelines.md +178 -0
- package/.trellis/spec/backend/index.md +36 -0
- package/.trellis/spec/backend/quality-guidelines.md +201 -0
- package/.trellis/spec/backend/state-management.md +76 -0
- package/.trellis/spec/backend/tool-guidelines.md +144 -0
- package/.trellis/spec/backend/type-safety.md +71 -0
- package/.trellis/spec/guides/code-reuse-thinking-guide.md +92 -0
- package/.trellis/spec/guides/cross-layer-thinking-guide.md +94 -0
- package/.trellis/spec/guides/index.md +79 -0
- package/.trellis/tasks/archive/02-02-evolving-skills/prd.md +61 -0
- package/.trellis/tasks/archive/02-02-evolving-skills/task.json +29 -0
- package/.trellis/tasks/archive/2026-02/00-bootstrap-guidelines/prd.md +86 -0
- package/.trellis/tasks/archive/2026-02/00-bootstrap-guidelines/task.json +27 -0
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/check.jsonl +3 -0
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/debug.jsonl +2 -0
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/implement.jsonl +5 -0
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/prd.md +33 -0
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/task.json +41 -0
- package/.trellis/workflow.md +407 -0
- package/.trellis/workspace/index.md +123 -0
- package/.trellis/workspace/pony/index.md +40 -0
- package/.trellis/workspace/pony/journal-1.md +7 -0
- package/.trellis/worktree.yaml +47 -0
- package/AGENTS.md +18 -0
- package/CLAUDE.md +292 -0
- package/README.md +134 -0
- package/agents/deepspider.md +142 -0
- package/docs/DEBUG.md +42 -0
- package/docs/GUIDE.md +334 -0
- package/docs/PROMPT.md +60 -0
- package/docs/USAGE.md +226 -0
- package/eslint.config.js +51 -0
- package/package.json +78 -0
- package/requirements-crypto.txt +14 -0
- package/src/agent/index.js +97 -0
- package/src/agent/logger.js +164 -0
- package/src/agent/middleware/filterTools.js +64 -0
- package/src/agent/middleware/report.js +79 -0
- package/src/agent/prompts/system.js +315 -0
- package/src/agent/run.js +575 -0
- package/src/agent/skills/anti-detect/SKILL.md +28 -0
- package/src/agent/skills/anti-detect/evolved.md +12 -0
- package/src/agent/skills/captcha/SKILL.md +37 -0
- package/src/agent/skills/captcha/evolved.md +12 -0
- package/src/agent/skills/config.js +30 -0
- package/src/agent/skills/crawler/SKILL.md +9 -0
- package/src/agent/skills/crawler/evolved.md +16 -0
- package/src/agent/skills/dynamic-analysis/SKILL.md +91 -0
- package/src/agent/skills/dynamic-analysis/evolved.md +12 -0
- package/src/agent/skills/env/SKILL.md +72 -0
- package/src/agent/skills/env/evolved.md +12 -0
- package/src/agent/skills/evolve.js +79 -0
- package/src/agent/skills/general/SKILL.md +12 -0
- package/src/agent/skills/general/evolved.md +12 -0
- package/src/agent/skills/js2python/SKILL.md +30 -0
- package/src/agent/skills/js2python/evolved.md +13 -0
- package/src/agent/skills/report/SKILL.md +21 -0
- package/src/agent/skills/report/evolved.md +12 -0
- package/src/agent/skills/sandbox/SKILL.md +22 -0
- package/src/agent/skills/sandbox/evolved.md +16 -0
- package/src/agent/skills/static-analysis/SKILL.md +93 -0
- package/src/agent/skills/static-analysis/evolved.md +12 -0
- package/src/agent/skills/xpath/SKILL.md +119 -0
- package/src/agent/subagents/anti-detect.js +45 -0
- package/src/agent/subagents/captcha.js +51 -0
- package/src/agent/subagents/crawler.js +138 -0
- package/src/agent/subagents/dynamic.js +64 -0
- package/src/agent/subagents/env-agent.js +82 -0
- package/src/agent/subagents/index.js +37 -0
- package/src/agent/subagents/js2python.js +72 -0
- package/src/agent/subagents/sandbox.js +55 -0
- package/src/agent/subagents/static.js +66 -0
- package/src/agent/tools/analysis.js +135 -0
- package/src/agent/tools/analyzer.js +85 -0
- package/src/agent/tools/anti-detect.js +89 -0
- package/src/agent/tools/antidebug.js +64 -0
- package/src/agent/tools/async.js +43 -0
- package/src/agent/tools/browser.js +324 -0
- package/src/agent/tools/captcha.js +223 -0
- package/src/agent/tools/capture.js +179 -0
- package/src/agent/tools/correlate.js +303 -0
- package/src/agent/tools/crawler.js +116 -0
- package/src/agent/tools/cryptohook.js +80 -0
- package/src/agent/tools/debug.js +246 -0
- package/src/agent/tools/deobfuscator.js +90 -0
- package/src/agent/tools/env.js +83 -0
- package/src/agent/tools/envdump.js +92 -0
- package/src/agent/tools/evolve.js +164 -0
- package/src/agent/tools/extract.js +114 -0
- package/src/agent/tools/extractor.js +54 -0
- package/src/agent/tools/file.js +224 -0
- package/src/agent/tools/hook.js +84 -0
- package/src/agent/tools/hookManager.js +178 -0
- package/src/agent/tools/index.js +137 -0
- package/src/agent/tools/nodejs.js +101 -0
- package/src/agent/tools/patch.js +46 -0
- package/src/agent/tools/preprocess.js +71 -0
- package/src/agent/tools/profile.js +122 -0
- package/src/agent/tools/python.js +627 -0
- package/src/agent/tools/report.js +124 -0
- package/src/agent/tools/runtime.js +132 -0
- package/src/agent/tools/sandbox.js +79 -0
- package/src/agent/tools/store.js +73 -0
- package/src/agent/tools/trace.js +74 -0
- package/src/agent/tools/tracing.js +201 -0
- package/src/agent/tools/utils.js +51 -0
- package/src/agent/tools/verify.js +184 -0
- package/src/agent/tools/webcrack.js +109 -0
- package/src/analyzer/ASTAnalyzer.js +387 -0
- package/src/analyzer/CallStackAnalyzer.js +379 -0
- package/src/analyzer/Deobfuscator.js +289 -0
- package/src/analyzer/EncryptionAnalyzer.js +99 -0
- package/src/analyzer/index.js +22 -0
- package/src/browser/EnvBridge.js +186 -0
- package/src/browser/cdp.js +168 -0
- package/src/browser/client.js +197 -0
- package/src/browser/collector.js +444 -0
- package/src/browser/collectors/RequestCryptoLinker.js +109 -0
- package/src/browser/collectors/ResponseSearcher.js +107 -0
- package/src/browser/collectors/ScriptCollector.js +158 -0
- package/src/browser/collectors/index.js +26 -0
- package/src/browser/defaultHooks.js +932 -0
- package/src/browser/hooks/crypto.js +55 -0
- package/src/browser/hooks/index.js +64 -0
- package/src/browser/hooks/native.js +9 -0
- package/src/browser/hooks/network.js +33 -0
- package/src/browser/index.js +42 -0
- package/src/browser/interceptors/NetworkInterceptor.js +116 -0
- package/src/browser/interceptors/ScriptInterceptor.js +76 -0
- package/src/browser/interceptors/index.js +6 -0
- package/src/browser/ui/analysisPanel.js +1782 -0
- package/src/browser/ui/confirmDialog.js +158 -0
- package/src/browser/ui/panel.html +152 -0
- package/src/browser/ui/selector.js +170 -0
- package/src/config/index.js +5 -0
- package/src/config/paths.js +71 -0
- package/src/config/patterns/crypto.js +36 -0
- package/src/config/profiles/chrome.json +71 -0
- package/src/config/profiles/firefox.json +44 -0
- package/src/config/profiles/safari.json +38 -0
- package/src/core/EnvMonitor.js +200 -0
- package/src/core/PatchGenerator.js +278 -0
- package/src/core/Sandbox.js +181 -0
- package/src/env/AntiAntiDebug.js +111 -0
- package/src/env/AsyncHook.js +68 -0
- package/src/env/BrowserAPIList.js +265 -0
- package/src/env/CookieHook.js +48 -0
- package/src/env/CryptoHook.js +205 -0
- package/src/env/EnvCodeGenerator.js +157 -0
- package/src/env/EnvDumper.js +356 -0
- package/src/env/EnvExtractor.js +220 -0
- package/src/env/HookBase.js +618 -0
- package/src/env/NetworkHook.js +159 -0
- package/src/env/modules/bom/history.js +29 -0
- package/src/env/modules/bom/location.js +26 -0
- package/src/env/modules/bom/navigator.js +70 -0
- package/src/env/modules/bom/screen.js +26 -0
- package/src/env/modules/bom/storage.js +23 -0
- package/src/env/modules/dom/document.js +110 -0
- package/src/env/modules/dom/event.js +51 -0
- package/src/env/modules/index.js +34 -0
- package/src/env/modules/webapi/fetch.js +46 -0
- package/src/env/modules/webapi/url.js +47 -0
- package/src/env/modules/webapi/xhr.js +48 -0
- package/src/index.js +27 -0
- package/src/mcp/server.js +89 -0
- package/src/store/DataStore.js +708 -0
- package/src/store/Store.js +158 -0
- package/src/store/Validator.js +24 -0
- package/test/analyze.test.js +90 -0
- package/test/envdump.test.js +74 -0
- package/test/flow.test.js +90 -0
- package/test/hooks.test.js +138 -0
- package/test/plugin.test.js +35 -0
- package/test/refactor-full.test.js +30 -0
- package/test/refactor.test.js +21 -0
- package/test/samples/obfuscated.js +61 -0
- package/test/samples/original.js +66 -0
- package/test/samples/v10_eval_chain.js +52 -0
- package/test/samples/v11_bytecode_vm.js +81 -0
- package/test/samples/v12_polymorphic.js +69 -0
- package/test/samples/v1_ob_basic.js +98 -0
- package/test/samples/v2_ob_advanced.js +99 -0
- package/test/samples/v3_jjencode.js +77 -0
- package/test/samples/v4_aaencode.js +73 -0
- package/test/samples/v5_control_flow.js +86 -0
- package/test/samples/v6_string_encryption.js +71 -0
- package/test/samples/v7_jsvmp.js +83 -0
- package/test/samples/v8_anti_debug.js +79 -0
- package/test/samples/v9_proxy_trap.js +49 -0
- package/test/samples.test.js +96 -0
- package/test/webcrack.test.js +55 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v5: 手写控制流平坦化
|
|
3
|
+
* 技术: 将线性代码转换为状态机,打乱执行顺序
|
|
4
|
+
* 特点: 增加静态分析难度,隐藏真实执行流程
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
(function() {
|
|
8
|
+
var _0x = { s: 'deepspider_test_2024', a: 'app_12345' };
|
|
9
|
+
var _state = 0x7a3f;
|
|
10
|
+
var _vars = {};
|
|
11
|
+
var _result = null;
|
|
12
|
+
|
|
13
|
+
while (true) {
|
|
14
|
+
switch (_state) {
|
|
15
|
+
case 0x7a3f:
|
|
16
|
+
_vars.hashFn = function(str) {
|
|
17
|
+
var h = 0;
|
|
18
|
+
for (var i = 0; i < str.length; i++) {
|
|
19
|
+
h = ((h << 5) - h) + str.charCodeAt(i);
|
|
20
|
+
h = h & h;
|
|
21
|
+
}
|
|
22
|
+
return Math.abs(h).toString(16);
|
|
23
|
+
};
|
|
24
|
+
_state = 0x2b1c;
|
|
25
|
+
break;
|
|
26
|
+
|
|
27
|
+
case 0x2b1c:
|
|
28
|
+
_vars.tsFn = function() {
|
|
29
|
+
return Math.floor(Date.now() / 1000);
|
|
30
|
+
};
|
|
31
|
+
_state = 0x9d4e;
|
|
32
|
+
break;
|
|
33
|
+
|
|
34
|
+
case 0x9d4e:
|
|
35
|
+
_vars.randFn = function(len) {
|
|
36
|
+
var c = 'abcdef0123456789', r = '';
|
|
37
|
+
for (var i = 0; i < len; i++) {
|
|
38
|
+
r += c.charAt(Math.floor(Math.random() * c.length));
|
|
39
|
+
}
|
|
40
|
+
return r;
|
|
41
|
+
};
|
|
42
|
+
_state = 0x1f8a;
|
|
43
|
+
break;
|
|
44
|
+
|
|
45
|
+
case 0x1f8a:
|
|
46
|
+
_vars.ts = _vars.tsFn();
|
|
47
|
+
_state = 0x5c2d;
|
|
48
|
+
break;
|
|
49
|
+
|
|
50
|
+
case 0x5c2d:
|
|
51
|
+
_vars.nonce = _vars.randFn(8);
|
|
52
|
+
_state = 0x8e6b;
|
|
53
|
+
break;
|
|
54
|
+
|
|
55
|
+
case 0x8e6b:
|
|
56
|
+
_vars.signStr = _0x.a + _vars.ts + _vars.nonce + _0x.s;
|
|
57
|
+
_state = 0x3a9f;
|
|
58
|
+
break;
|
|
59
|
+
|
|
60
|
+
case 0x3a9f:
|
|
61
|
+
_vars.sign = _vars.hashFn(_vars.signStr);
|
|
62
|
+
_state = 0x6d1c;
|
|
63
|
+
break;
|
|
64
|
+
|
|
65
|
+
case 0x6d1c:
|
|
66
|
+
_vars.data = { user: 'test', action: 'login' };
|
|
67
|
+
_state = 0x4b8e;
|
|
68
|
+
break;
|
|
69
|
+
|
|
70
|
+
case 0x4b8e:
|
|
71
|
+
_result = Object.assign({}, _vars.data, {
|
|
72
|
+
sign: _vars.sign,
|
|
73
|
+
timestamp: _vars.ts,
|
|
74
|
+
nonce: _vars.nonce,
|
|
75
|
+
app_id: _0x.a,
|
|
76
|
+
encrypted: btoa(JSON.stringify(_vars.data))
|
|
77
|
+
});
|
|
78
|
+
_state = 0xf2a3;
|
|
79
|
+
break;
|
|
80
|
+
|
|
81
|
+
case 0xf2a3:
|
|
82
|
+
console.log('Result:', _result);
|
|
83
|
+
return _result;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
})();
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v6: 自定义字符串加密 + 数组混淆
|
|
3
|
+
* 技术: XOR加密 + 字符串分割 + 动态解密
|
|
4
|
+
* 特点: 字符串在运行时才解密,静态分析无法获取
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
(function() {
|
|
8
|
+
// XOR密钥
|
|
9
|
+
var _k = [0x5a, 0x3f, 0x7c, 0x1d, 0x9e, 0x2b, 0x8f, 0x4a];
|
|
10
|
+
|
|
11
|
+
// 加密的字符串数组
|
|
12
|
+
var _s = [
|
|
13
|
+
[0x30,0x56,0x1c,0x76,0xf3,0x4e,0xfc,0x2f,0x74,0x50,0x1a,0x71,0xab,0x55,0xbe,0x68,0x6a],
|
|
14
|
+
[0x3b,0x57,0x1f,0x51,0xdb,0x5f,0xe0,0x24,0x75],
|
|
15
|
+
[0x3b,0x41,0x1f,0x77,0xf2,0x4f,0xf9,0x68,0x6e,0x50,0x1c,0x71,0xf0],
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
// 解密函数
|
|
19
|
+
var _d = function(arr) {
|
|
20
|
+
var r = '';
|
|
21
|
+
for (var i = 0; i < arr.length; i++) {
|
|
22
|
+
r += String.fromCharCode(arr[i] ^ _k[i % _k.length]);
|
|
23
|
+
}
|
|
24
|
+
return r;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// 实际密钥(运行时解密)
|
|
28
|
+
var SECRET_KEY = 'deepspider_test_2024';
|
|
29
|
+
var APP_ID = 'app_12345';
|
|
30
|
+
|
|
31
|
+
// 哈希函数
|
|
32
|
+
var _h = function(str) {
|
|
33
|
+
var h = 0;
|
|
34
|
+
for (var i = 0; i < str.length; i++) {
|
|
35
|
+
h = ((h << 5) - h) + str.charCodeAt(i);
|
|
36
|
+
h = h & h;
|
|
37
|
+
}
|
|
38
|
+
return Math.abs(h).toString(16);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// 时间戳
|
|
42
|
+
var _t = function() {
|
|
43
|
+
return Math.floor(Date.now() / 1000);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// 随机字符串
|
|
47
|
+
var _r = function(len) {
|
|
48
|
+
var c = 'abcdef0123456789', r = '';
|
|
49
|
+
for (var i = 0; i < len; i++) {
|
|
50
|
+
r += c.charAt(Math.floor(Math.random() * c.length));
|
|
51
|
+
}
|
|
52
|
+
return r;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// 签名生成
|
|
56
|
+
var _g = function(p) {
|
|
57
|
+
var t = _t(), n = _r(8);
|
|
58
|
+
var s = APP_ID + t + n + SECRET_KEY;
|
|
59
|
+
return { sign: _h(s), timestamp: t, nonce: n, app_id: APP_ID };
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// 加密参数
|
|
63
|
+
var _e = function(d) {
|
|
64
|
+
var s = _g(d);
|
|
65
|
+
return Object.assign({}, d, s, { encrypted: btoa(JSON.stringify(d)) });
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
var result = _e({ user: 'test', action: 'login' });
|
|
69
|
+
console.log('Result:', result);
|
|
70
|
+
return result;
|
|
71
|
+
})();
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v7: 简化版JSVMP虚拟机保护
|
|
3
|
+
* 技术: 将JS代码编译为自定义字节码,由内置VM执行
|
|
4
|
+
* 特点: 极难逆向,需要先理解VM指令集
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
(function() {
|
|
8
|
+
// 虚拟机寄存器
|
|
9
|
+
var R = [0, 0, 0, 0, 0, 0, 0, 0];
|
|
10
|
+
var STACK = [];
|
|
11
|
+
var MEM = {};
|
|
12
|
+
var PC = 0;
|
|
13
|
+
|
|
14
|
+
// 操作码定义
|
|
15
|
+
var OP = {
|
|
16
|
+
PUSH: 0x01, POP: 0x02, LOAD: 0x03, STORE: 0x04,
|
|
17
|
+
ADD: 0x10, SUB: 0x11, MUL: 0x12, XOR: 0x13, SHL: 0x14, AND: 0x15,
|
|
18
|
+
CALL: 0x20, RET: 0x21, JMP: 0x30, JZ: 0x31,
|
|
19
|
+
HALT: 0xFF
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// 内置函数表
|
|
23
|
+
var FUNCS = {
|
|
24
|
+
0: function() { return Math.floor(Date.now() / 1000); },
|
|
25
|
+
1: function(len) {
|
|
26
|
+
var c = 'abcdef0123456789', r = '';
|
|
27
|
+
for (var i = 0; i < len; i++) r += c.charAt(Math.floor(Math.random() * c.length));
|
|
28
|
+
return r;
|
|
29
|
+
},
|
|
30
|
+
2: function(s) { return btoa(s); },
|
|
31
|
+
3: function(o) { return JSON.stringify(o); }
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// VM执行器
|
|
35
|
+
var exec = function(code) {
|
|
36
|
+
PC = 0;
|
|
37
|
+
while (PC < code.length) {
|
|
38
|
+
var op = code[PC++];
|
|
39
|
+
switch (op) {
|
|
40
|
+
case OP.PUSH: STACK.push(code[PC++]); break;
|
|
41
|
+
case OP.POP: R[code[PC++]] = STACK.pop(); break;
|
|
42
|
+
case OP.ADD: STACK.push(STACK.pop() + STACK.pop()); break;
|
|
43
|
+
case OP.SHL: var a = STACK.pop(), b = STACK.pop(); STACK.push(b << a); break;
|
|
44
|
+
case OP.SUB: var a = STACK.pop(), b = STACK.pop(); STACK.push(b - a); break;
|
|
45
|
+
case OP.AND: STACK.push(STACK.pop() & STACK.pop()); break;
|
|
46
|
+
case OP.CALL: var fn = code[PC++]; STACK.push(FUNCS[fn](STACK.pop())); break;
|
|
47
|
+
case OP.HALT: return STACK.pop();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// 哈希函数(原生实现,VM调用)
|
|
53
|
+
var hash = function(str) {
|
|
54
|
+
var h = 0;
|
|
55
|
+
for (var i = 0; i < str.length; i++) {
|
|
56
|
+
h = ((h << 5) - h) + str.charCodeAt(i);
|
|
57
|
+
h = h & h;
|
|
58
|
+
}
|
|
59
|
+
return Math.abs(h).toString(16);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// 常量
|
|
63
|
+
var SECRET = 'deepspider_test_2024';
|
|
64
|
+
var APPID = 'app_12345';
|
|
65
|
+
|
|
66
|
+
// 主逻辑
|
|
67
|
+
var ts = FUNCS[0]();
|
|
68
|
+
var nonce = FUNCS[1](8);
|
|
69
|
+
var signStr = APPID + ts + nonce + SECRET;
|
|
70
|
+
var sign = hash(signStr);
|
|
71
|
+
var data = { user: 'test', action: 'login' };
|
|
72
|
+
|
|
73
|
+
var result = Object.assign({}, data, {
|
|
74
|
+
sign: sign,
|
|
75
|
+
timestamp: ts,
|
|
76
|
+
nonce: nonce,
|
|
77
|
+
app_id: APPID,
|
|
78
|
+
encrypted: FUNCS[2](FUNCS[3](data))
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
console.log('Result:', result);
|
|
82
|
+
return result;
|
|
83
|
+
})();
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v8: 反调试 + 环境检测 + 代码自校验
|
|
3
|
+
* 技术: 检测调试器、控制台、代码篡改
|
|
4
|
+
* 特点: 动态检测运行环境,防止调试分析
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
(function() {
|
|
8
|
+
// 反调试检测
|
|
9
|
+
var _antiDebug = function() {
|
|
10
|
+
var start = Date.now();
|
|
11
|
+
debugger;
|
|
12
|
+
if (Date.now() - start > 100) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// 控制台检测
|
|
19
|
+
var _consoleCheck = function() {
|
|
20
|
+
var el = new Image();
|
|
21
|
+
Object.defineProperty(el, 'id', {
|
|
22
|
+
get: function() {
|
|
23
|
+
throw new Error('Console opened');
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
return false;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// 代码自校验
|
|
30
|
+
var _selfCheck = function(fn) {
|
|
31
|
+
var code = fn.toString();
|
|
32
|
+
var h = 0;
|
|
33
|
+
for (var i = 0; i < code.length; i++) {
|
|
34
|
+
h = ((h << 5) - h) + code.charCodeAt(i);
|
|
35
|
+
h = h & h;
|
|
36
|
+
}
|
|
37
|
+
return Math.abs(h).toString(16);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// 环境检测
|
|
41
|
+
var _envCheck = function() {
|
|
42
|
+
if (typeof window === 'undefined') return false;
|
|
43
|
+
if (window.outerWidth - window.innerWidth > 160) return false;
|
|
44
|
+
return true;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// 核心逻辑
|
|
48
|
+
var SECRET = 'deepspider_test_2024';
|
|
49
|
+
var APPID = 'app_12345';
|
|
50
|
+
|
|
51
|
+
var hash = function(str) {
|
|
52
|
+
var h = 0;
|
|
53
|
+
for (var i = 0; i < str.length; i++) {
|
|
54
|
+
h = ((h << 5) - h) + str.charCodeAt(i);
|
|
55
|
+
h = h & h;
|
|
56
|
+
}
|
|
57
|
+
return Math.abs(h).toString(16);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
var ts = function() { return Math.floor(Date.now() / 1000); };
|
|
61
|
+
|
|
62
|
+
var rand = function(len) {
|
|
63
|
+
var c = 'abcdef0123456789', r = '';
|
|
64
|
+
for (var i = 0; i < len; i++) r += c.charAt(Math.floor(Math.random() * c.length));
|
|
65
|
+
return r;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
var t = ts(), n = rand(8);
|
|
69
|
+
var signStr = APPID + t + n + SECRET;
|
|
70
|
+
var data = { user: 'test', action: 'login' };
|
|
71
|
+
|
|
72
|
+
var result = Object.assign({}, data, {
|
|
73
|
+
sign: hash(signStr), timestamp: t, nonce: n, app_id: APPID,
|
|
74
|
+
encrypted: btoa(JSON.stringify(data))
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
console.log('Result:', result);
|
|
78
|
+
return result;
|
|
79
|
+
})();
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v9: Proxy代理陷阱混淆
|
|
3
|
+
* 技术: 使用Proxy拦截属性访问,隐藏真实逻辑
|
|
4
|
+
* 特点: 动态属性解析,静态分析困难
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
(function() {
|
|
8
|
+
var _secret = 'deepspider_test_2024';
|
|
9
|
+
var _appid = 'app_12345';
|
|
10
|
+
|
|
11
|
+
// 混淆的函数映射
|
|
12
|
+
var _funcs = {
|
|
13
|
+
'a': function(s) {
|
|
14
|
+
var h = 0;
|
|
15
|
+
for (var i = 0; i < s.length; i++) {
|
|
16
|
+
h = ((h << 5) - h) + s.charCodeAt(i);
|
|
17
|
+
h = h & h;
|
|
18
|
+
}
|
|
19
|
+
return Math.abs(h).toString(16);
|
|
20
|
+
},
|
|
21
|
+
'b': function() { return Math.floor(Date.now() / 1000); },
|
|
22
|
+
'c': function(l) {
|
|
23
|
+
var c = 'abcdef0123456789', r = '';
|
|
24
|
+
for (var i = 0; i < l; i++) r += c.charAt(Math.floor(Math.random() * c.length));
|
|
25
|
+
return r;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// Proxy陷阱处理器
|
|
30
|
+
var handler = {
|
|
31
|
+
get: function(t, p) {
|
|
32
|
+
if (p in _funcs) return _funcs[p];
|
|
33
|
+
return t[p];
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
var _ = new Proxy({}, handler);
|
|
38
|
+
var t = _.b(), n = _.c(8);
|
|
39
|
+
var s = _appid + t + n + _secret;
|
|
40
|
+
var data = { user: 'test', action: 'login' };
|
|
41
|
+
|
|
42
|
+
var result = Object.assign({}, data, {
|
|
43
|
+
sign: _.a(s), timestamp: t, nonce: n,
|
|
44
|
+
app_id: _appid, encrypted: btoa(JSON.stringify(data))
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
console.log('Result:', result);
|
|
48
|
+
return result;
|
|
49
|
+
})();
|
|
@@ -0,0 +1,96 @@
|
|
|
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 fs from 'fs';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import { fileURLToPath } from 'url';
|
|
12
|
+
|
|
13
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
const samplesDir = path.join(__dirname, 'samples');
|
|
15
|
+
|
|
16
|
+
// 获取所有样本文件
|
|
17
|
+
const sampleFiles = fs.readdirSync(samplesDir)
|
|
18
|
+
.filter(f => f.endsWith('.js') && f.startsWith('v'))
|
|
19
|
+
.sort();
|
|
20
|
+
|
|
21
|
+
console.log('=== DeepSpider 综合测试 ===\n');
|
|
22
|
+
console.log(`发现 ${sampleFiles.length} 个测试样本\n`);
|
|
23
|
+
|
|
24
|
+
// 初始化分析器
|
|
25
|
+
const deob = new Deobfuscator();
|
|
26
|
+
const astAnalyzer = new ASTAnalyzer();
|
|
27
|
+
const encAnalyzer = new EncryptionAnalyzer();
|
|
28
|
+
|
|
29
|
+
// 导入沙箱工具
|
|
30
|
+
import { sandboxExecute, sandboxReset } from '../src/agent/tools/sandbox.js';
|
|
31
|
+
|
|
32
|
+
// 测试结果统计
|
|
33
|
+
const results = {
|
|
34
|
+
total: sampleFiles.length,
|
|
35
|
+
detected: 0,
|
|
36
|
+
executed: 0,
|
|
37
|
+
failed: []
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// 逐个测试样本
|
|
41
|
+
for (const file of sampleFiles) {
|
|
42
|
+
const filePath = path.join(samplesDir, file);
|
|
43
|
+
const code = fs.readFileSync(filePath, 'utf-8');
|
|
44
|
+
|
|
45
|
+
console.log(`\n【${file}】`);
|
|
46
|
+
console.log('-'.repeat(40));
|
|
47
|
+
|
|
48
|
+
// 1. 混淆器识别
|
|
49
|
+
const obType = deob.detectObfuscator(code);
|
|
50
|
+
const codeType = deob._detectType(code);
|
|
51
|
+
console.log(`混淆器: ${obType} | 类型: ${codeType}`);
|
|
52
|
+
if (obType !== 'unknown') results.detected++;
|
|
53
|
+
|
|
54
|
+
// 2. 函数提取
|
|
55
|
+
const funcs = astAnalyzer.extractFunctions(code);
|
|
56
|
+
console.log(`函数数: ${funcs.length}`);
|
|
57
|
+
|
|
58
|
+
// 3. 加密检测
|
|
59
|
+
const crypto = encAnalyzer.analyze(code);
|
|
60
|
+
if (crypto.detectedAlgorithms.length > 0) {
|
|
61
|
+
console.log(`加密算法: ${crypto.detectedAlgorithms.map(a => a.name).join(', ')}`);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// 4. 沙箱执行
|
|
65
|
+
const execResultStr = await sandboxExecute.invoke({ code, timeout: 3000 });
|
|
66
|
+
const execResult = JSON.parse(execResultStr);
|
|
67
|
+
if (execResult.success) {
|
|
68
|
+
console.log(`执行: ✅ 成功`);
|
|
69
|
+
results.executed++;
|
|
70
|
+
} else {
|
|
71
|
+
console.log(`执行: ❌ ${execResult.errorType || 'error'}`);
|
|
72
|
+
if (execResult.missingEnv?.length > 0) {
|
|
73
|
+
console.log(`缺失: ${execResult.missingEnv.slice(0, 3).join(', ')}...`);
|
|
74
|
+
}
|
|
75
|
+
results.failed.push({ file, error: execResult.error });
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// 重置沙箱
|
|
79
|
+
await sandboxReset.invoke({});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// 输出统计
|
|
83
|
+
console.log('\n' + '='.repeat(50));
|
|
84
|
+
console.log('【测试统计】');
|
|
85
|
+
console.log(`总样本: ${results.total}`);
|
|
86
|
+
console.log(`识别成功: ${results.detected}/${results.total}`);
|
|
87
|
+
console.log(`执行成功: ${results.executed}/${results.total}`);
|
|
88
|
+
|
|
89
|
+
if (results.failed.length > 0) {
|
|
90
|
+
console.log('\n【失败详情】');
|
|
91
|
+
results.failed.forEach(f => {
|
|
92
|
+
console.log(` ${f.file}: ${f.error?.slice(0, 50)}...`);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
console.log('\n=== 测试完成 ===');
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* webcrack 集成测试
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { unpackBundle, analyzeBundle } from '../src/agent/tools/webcrack.js';
|
|
6
|
+
|
|
7
|
+
// 模拟一个简单的 Webpack bundle
|
|
8
|
+
const sampleBundle = `
|
|
9
|
+
(function(modules) {
|
|
10
|
+
var installedModules = {};
|
|
11
|
+
function __webpack_require__(moduleId) {
|
|
12
|
+
if(installedModules[moduleId]) return installedModules[moduleId].exports;
|
|
13
|
+
var module = installedModules[moduleId] = { exports: {} };
|
|
14
|
+
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
15
|
+
return module.exports;
|
|
16
|
+
}
|
|
17
|
+
return __webpack_require__(0);
|
|
18
|
+
})([
|
|
19
|
+
function(module, exports, __webpack_require__) {
|
|
20
|
+
var utils = __webpack_require__(1);
|
|
21
|
+
console.log(utils.hello());
|
|
22
|
+
},
|
|
23
|
+
function(module, exports) {
|
|
24
|
+
module.exports = {
|
|
25
|
+
hello: function() { return "Hello World"; }
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
]);
|
|
29
|
+
`;
|
|
30
|
+
|
|
31
|
+
async function test() {
|
|
32
|
+
console.log('=== webcrack 集成测试 ===\n');
|
|
33
|
+
|
|
34
|
+
// 测试 analyze_bundle
|
|
35
|
+
console.log('1. 测试 analyze_bundle...');
|
|
36
|
+
const analysisResult = await analyzeBundle.invoke({ code: sampleBundle });
|
|
37
|
+
const analysis = JSON.parse(analysisResult);
|
|
38
|
+
console.log(' Bundle 类型:', analysis.bundleType);
|
|
39
|
+
console.log(' 模块数量:', analysis.moduleCount);
|
|
40
|
+
console.log(' 成功:', analysis.success);
|
|
41
|
+
|
|
42
|
+
// 测试 unpack_bundle
|
|
43
|
+
console.log('\n2. 测试 unpack_bundle...');
|
|
44
|
+
const unpackResult = await unpackBundle.invoke({ code: sampleBundle });
|
|
45
|
+
const unpacked = JSON.parse(unpackResult);
|
|
46
|
+
console.log(' 成功:', unpacked.success);
|
|
47
|
+
console.log(' 模块数量:', unpacked.moduleCount);
|
|
48
|
+
if (unpacked.code) {
|
|
49
|
+
console.log(' 解包后代码长度:', unpacked.code.length);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
console.log('\n=== 测试完成 ===');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
test().catch(console.error);
|