deepspider 0.2.12 → 0.3.1
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/README.md +53 -27
- package/bin/cli.js +45 -0
- package/package.json +10 -4
- package/src/agent/core/PanelBridge.js +2 -2
- package/src/agent/logger.js +1 -1
- package/src/agent/middleware/report.js +1 -1
- package/src/agent/run.js +54 -63
- package/src/agent/setup.js +14 -14
- package/src/agent/skills/evolve.js +0 -3
- package/src/agent/tools/captcha.js +1 -1
- package/src/agent/tools/evolve.js +1 -1
- package/src/agent/tools/file.js +2 -2
- package/src/agent/tools/python.js +4 -4
- package/src/agent/tools/report.js +2 -2
- package/src/agent/tools/runtime.js +1 -1
- package/src/analyzer/EncryptionAnalyzer.js +2 -2
- package/src/browser/collector.js +1 -1
- package/src/browser/interceptors/NetworkInterceptor.js +1 -1
- package/src/browser/interceptors/ScriptInterceptor.js +2 -2
- package/src/cli/commands/config.js +94 -0
- package/src/cli/commands/help.js +34 -0
- package/src/cli/commands/update.js +78 -0
- package/src/cli/commands/version.js +9 -0
- package/src/cli/config.js +15 -0
- package/src/config/settings.js +102 -0
- package/src/core/PatchGenerator.js +2 -2
- package/src/env/EnvCodeGenerator.js +1 -1
- package/src/store/DataStore.js +5 -5
- package/.claude/agents/check.md +0 -122
- package/.claude/agents/debug.md +0 -106
- package/.claude/agents/dispatch.md +0 -214
- package/.claude/agents/implement.md +0 -96
- package/.claude/agents/plan.md +0 -396
- package/.claude/agents/research.md +0 -120
- package/.claude/commands/evolve/merge.md +0 -80
- package/.claude/commands/trellis/before-backend-dev.md +0 -13
- package/.claude/commands/trellis/before-frontend-dev.md +0 -13
- package/.claude/commands/trellis/break-loop.md +0 -107
- package/.claude/commands/trellis/check-backend.md +0 -13
- package/.claude/commands/trellis/check-cross-layer.md +0 -153
- package/.claude/commands/trellis/check-frontend.md +0 -13
- package/.claude/commands/trellis/create-command.md +0 -154
- package/.claude/commands/trellis/finish-work.md +0 -129
- package/.claude/commands/trellis/integrate-skill.md +0 -219
- package/.claude/commands/trellis/onboard.md +0 -358
- package/.claude/commands/trellis/parallel.md +0 -193
- package/.claude/commands/trellis/record-session.md +0 -62
- package/.claude/commands/trellis/start.md +0 -280
- package/.claude/commands/trellis/update-spec.md +0 -213
- package/.claude/hooks/inject-subagent-context.py +0 -758
- package/.claude/hooks/ralph-loop.py +0 -374
- package/.claude/hooks/session-start.py +0 -126
- package/.claude/settings.json +0 -41
- package/.claude/skills/deepagents-guide/SKILL.md +0 -428
- package/.cursor/commands/trellis-before-backend-dev.md +0 -13
- package/.cursor/commands/trellis-before-frontend-dev.md +0 -13
- package/.cursor/commands/trellis-break-loop.md +0 -107
- package/.cursor/commands/trellis-check-backend.md +0 -13
- package/.cursor/commands/trellis-check-cross-layer.md +0 -153
- package/.cursor/commands/trellis-check-frontend.md +0 -13
- package/.cursor/commands/trellis-create-command.md +0 -154
- package/.cursor/commands/trellis-finish-work.md +0 -129
- package/.cursor/commands/trellis-integrate-skill.md +0 -219
- package/.cursor/commands/trellis-onboard.md +0 -358
- package/.cursor/commands/trellis-record-session.md +0 -62
- package/.cursor/commands/trellis-start.md +0 -156
- package/.cursor/commands/trellis-update-spec.md +0 -213
- package/.github/workflows/publish.yml +0 -63
- package/.husky/pre-commit +0 -1
- package/.mcp.json +0 -8
- package/.trellis/.template-hashes.json +0 -65
- package/.trellis/.version +0 -1
- package/.trellis/scripts/add-session.sh +0 -384
- package/.trellis/scripts/common/developer.sh +0 -129
- package/.trellis/scripts/common/git-context.sh +0 -263
- package/.trellis/scripts/common/paths.sh +0 -208
- package/.trellis/scripts/common/phase.sh +0 -150
- package/.trellis/scripts/common/registry.sh +0 -247
- package/.trellis/scripts/common/task-queue.sh +0 -142
- package/.trellis/scripts/common/task-utils.sh +0 -151
- package/.trellis/scripts/common/worktree.sh +0 -128
- package/.trellis/scripts/create-bootstrap.sh +0 -299
- package/.trellis/scripts/get-context.sh +0 -7
- package/.trellis/scripts/get-developer.sh +0 -15
- package/.trellis/scripts/init-developer.sh +0 -34
- package/.trellis/scripts/multi-agent/cleanup.sh +0 -396
- package/.trellis/scripts/multi-agent/create-pr.sh +0 -241
- package/.trellis/scripts/multi-agent/plan.sh +0 -207
- package/.trellis/scripts/multi-agent/start.sh +0 -310
- package/.trellis/scripts/multi-agent/status.sh +0 -828
- package/.trellis/scripts/task.sh +0 -1118
- package/.trellis/spec/backend/ci-cd-guidelines.md +0 -73
- package/.trellis/spec/backend/deepagents-guide.md +0 -380
- package/.trellis/spec/backend/directory-structure.md +0 -145
- package/.trellis/spec/backend/examples/skills/deepagents-guide/README.md +0 -11
- package/.trellis/spec/backend/examples/skills/deepagents-guide/agent.js.template +0 -20
- package/.trellis/spec/backend/examples/skills/deepagents-guide/skills-config.js.template +0 -13
- package/.trellis/spec/backend/examples/skills/deepagents-guide/subagent.js.template +0 -19
- package/.trellis/spec/backend/hook-guidelines.md +0 -218
- package/.trellis/spec/backend/index.md +0 -37
- package/.trellis/spec/backend/quality-guidelines.md +0 -377
- package/.trellis/spec/backend/state-management.md +0 -76
- package/.trellis/spec/backend/tool-guidelines.md +0 -144
- package/.trellis/spec/backend/type-safety.md +0 -71
- package/.trellis/spec/guides/code-reuse-thinking-guide.md +0 -92
- package/.trellis/spec/guides/cross-layer-thinking-guide.md +0 -94
- package/.trellis/spec/guides/index.md +0 -79
- package/.trellis/tasks/archive/02-02-evolving-skills/prd.md +0 -61
- package/.trellis/tasks/archive/02-02-evolving-skills/task.json +0 -29
- package/.trellis/tasks/archive/2026-02/00-bootstrap-guidelines/prd.md +0 -86
- package/.trellis/tasks/archive/2026-02/00-bootstrap-guidelines/task.json +0 -27
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/check.jsonl +0 -3
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/debug.jsonl +0 -2
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/implement.jsonl +0 -5
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/prd.md +0 -33
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/task.json +0 -41
- package/.trellis/workflow.md +0 -407
- package/.trellis/workspace/index.md +0 -123
- package/.trellis/workspace/pony/index.md +0 -42
- package/.trellis/workspace/pony/journal-1.md +0 -125
- package/.trellis/worktree.yaml +0 -47
- package/AGENTS.md +0 -18
- package/CLAUDE.md +0 -315
- package/agents/deepspider.md +0 -142
- package/docs/DEBUG.md +0 -42
- package/docs/GUIDE.md +0 -338
- package/docs/PROMPT.md +0 -59
- package/docs/USAGE.md +0 -230
- package/eslint.config.js +0 -51
- package/test/analyze.test.js +0 -90
- package/test/envdump.test.js +0 -74
- package/test/flow.test.js +0 -90
- package/test/hooks.test.js +0 -138
- package/test/plugin.test.js +0 -35
- package/test/refactor-full.test.js +0 -30
- package/test/refactor.test.js +0 -21
- package/test/samples/obfuscated.js +0 -61
- package/test/samples/original.js +0 -66
- package/test/samples/v10_eval_chain.js +0 -52
- package/test/samples/v11_bytecode_vm.js +0 -81
- package/test/samples/v12_polymorphic.js +0 -69
- package/test/samples/v1_ob_basic.js +0 -98
- package/test/samples/v2_ob_advanced.js +0 -99
- package/test/samples/v3_jjencode.js +0 -77
- package/test/samples/v4_aaencode.js +0 -73
- package/test/samples/v5_control_flow.js +0 -86
- package/test/samples/v6_string_encryption.js +0 -71
- package/test/samples/v7_jsvmp.js +0 -83
- package/test/samples/v8_anti_debug.js +0 -79
- package/test/samples/v9_proxy_trap.js +0 -49
- package/test/samples.test.js +0 -96
- package/test/webcrack.test.js +0 -55
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* v11: 自定义字节码解释器
|
|
3
|
-
* 技术: 将JS编译为自定义字节码,运行时解释执行
|
|
4
|
-
* 特点: 完全隐藏原始逻辑,需逆向VM才能理解
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
(function() {
|
|
8
|
-
// 字节码指令集
|
|
9
|
-
var OP = {
|
|
10
|
-
NOP: 0x00, PUSH: 0x01, POP: 0x02,
|
|
11
|
-
ADD: 0x10, SUB: 0x11, MUL: 0x12,
|
|
12
|
-
SHL: 0x13, AND: 0x14, XOR: 0x15,
|
|
13
|
-
CALL: 0x20, RET: 0x21,
|
|
14
|
-
LOAD: 0x30, STORE: 0x31,
|
|
15
|
-
HALT: 0xFF
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
// VM状态
|
|
19
|
-
var stack = [];
|
|
20
|
-
var mem = {};
|
|
21
|
-
var pc = 0;
|
|
22
|
-
|
|
23
|
-
// 内置函数
|
|
24
|
-
var funcs = {
|
|
25
|
-
0: function() { return Date.now(); },
|
|
26
|
-
1: function() { return Math.random(); },
|
|
27
|
-
2: function(s) { return btoa(s); }
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// 执行器
|
|
31
|
-
var exec = function(code) {
|
|
32
|
-
pc = 0;
|
|
33
|
-
while (pc < code.length) {
|
|
34
|
-
var op = code[pc++];
|
|
35
|
-
switch (op) {
|
|
36
|
-
case OP.PUSH: stack.push(code[pc++]); break;
|
|
37
|
-
case OP.POP: mem[code[pc++]] = stack.pop(); break;
|
|
38
|
-
case OP.ADD: stack.push(stack.pop() + stack.pop()); break;
|
|
39
|
-
case OP.SHL: var a = stack.pop(), b = stack.pop(); stack.push(b << a); break;
|
|
40
|
-
case OP.AND: stack.push(stack.pop() & stack.pop()); break;
|
|
41
|
-
case OP.CALL: stack.push(funcs[code[pc++]](stack.pop())); break;
|
|
42
|
-
case OP.HALT: return stack.pop();
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
// 常量
|
|
48
|
-
var SECRET = 'deepspider_test_2024';
|
|
49
|
-
var APPID = 'app_12345';
|
|
50
|
-
|
|
51
|
-
// 哈希函数
|
|
52
|
-
var hash = function(s) {
|
|
53
|
-
var h = 0;
|
|
54
|
-
for (var i = 0; i < s.length; i++) {
|
|
55
|
-
h = ((h << 5) - h) + s.charCodeAt(i);
|
|
56
|
-
h = h & h;
|
|
57
|
-
}
|
|
58
|
-
return Math.abs(h).toString(16);
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
// 主逻辑
|
|
62
|
-
var ts = Math.floor(Date.now() / 1000);
|
|
63
|
-
var c = 'abcdef0123456789', nonce = '';
|
|
64
|
-
for (var i = 0; i < 8; i++) {
|
|
65
|
-
nonce += c.charAt(Math.floor(Math.random() * c.length));
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
var signStr = APPID + ts + nonce + SECRET;
|
|
69
|
-
var data = { user: 'test', action: 'login' };
|
|
70
|
-
|
|
71
|
-
var result = Object.assign({}, data, {
|
|
72
|
-
sign: hash(signStr),
|
|
73
|
-
timestamp: ts,
|
|
74
|
-
nonce: nonce,
|
|
75
|
-
app_id: APPID,
|
|
76
|
-
encrypted: btoa(JSON.stringify(data))
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
console.log('Result:', result);
|
|
80
|
-
return result;
|
|
81
|
-
})();
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* v12: 多态混淆
|
|
3
|
-
* 技术: 每次执行生成不同的代码结构
|
|
4
|
-
* 特点: 动态生成代码,难以静态分析
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
(function() {
|
|
8
|
-
// 随机选择实现方式
|
|
9
|
-
var _r = Math.random();
|
|
10
|
-
|
|
11
|
-
// 多态哈希实现
|
|
12
|
-
var hash;
|
|
13
|
-
if (_r < 0.33) {
|
|
14
|
-
hash = function(s) {
|
|
15
|
-
var h = 0;
|
|
16
|
-
for (var i = 0; i < s.length; i++) {
|
|
17
|
-
h = ((h << 5) - h) + s.charCodeAt(i);
|
|
18
|
-
h = h & h;
|
|
19
|
-
}
|
|
20
|
-
return Math.abs(h).toString(16);
|
|
21
|
-
};
|
|
22
|
-
} else if (_r < 0.66) {
|
|
23
|
-
hash = function(s) {
|
|
24
|
-
var h = 5381;
|
|
25
|
-
for (var i = 0; i < s.length; i++) {
|
|
26
|
-
h = ((h << 5) + h) ^ s.charCodeAt(i);
|
|
27
|
-
}
|
|
28
|
-
return Math.abs(h).toString(16);
|
|
29
|
-
};
|
|
30
|
-
} else {
|
|
31
|
-
hash = function(s) {
|
|
32
|
-
var h = 0, g;
|
|
33
|
-
for (var i = 0; i < s.length; i++) {
|
|
34
|
-
h = (h << 4) + s.charCodeAt(i);
|
|
35
|
-
g = h & 0xF0000000;
|
|
36
|
-
if (g) h ^= g >> 24;
|
|
37
|
-
h &= ~g;
|
|
38
|
-
}
|
|
39
|
-
return Math.abs(h).toString(16);
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// 常量
|
|
44
|
-
var SECRET = 'deepspider_test_2024';
|
|
45
|
-
var APPID = 'app_12345';
|
|
46
|
-
|
|
47
|
-
// 时间戳
|
|
48
|
-
var ts = Math.floor(Date.now() / 1000);
|
|
49
|
-
|
|
50
|
-
// 随机字符串
|
|
51
|
-
var c = 'abcdef0123456789', nonce = '';
|
|
52
|
-
for (var i = 0; i < 8; i++) {
|
|
53
|
-
nonce += c.charAt(Math.floor(Math.random() * c.length));
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
var signStr = APPID + ts + nonce + SECRET;
|
|
57
|
-
var data = { user: 'test', action: 'login' };
|
|
58
|
-
|
|
59
|
-
var result = Object.assign({}, data, {
|
|
60
|
-
sign: hash(signStr),
|
|
61
|
-
timestamp: ts,
|
|
62
|
-
nonce: nonce,
|
|
63
|
-
app_id: APPID,
|
|
64
|
-
encrypted: btoa(JSON.stringify(data))
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
console.log('Result:', result);
|
|
68
|
-
return result;
|
|
69
|
-
})();
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* v1: JavaScript Obfuscator 基础混淆
|
|
3
|
-
* 技术: 变量重命名、字符串数组、十六进制编码
|
|
4
|
-
* 参考: https://obfuscator.io
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
var _0x4a2c = [
|
|
8
|
-
'\x6a\x73\x66\x6f\x72\x67\x65\x5f\x74\x65\x73\x74\x5f\x32\x30\x32\x34',
|
|
9
|
-
'\x61\x70\x70\x5f\x31\x32\x33\x34\x35',
|
|
10
|
-
'\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74',
|
|
11
|
-
'\x74\x6f\x53\x74\x72\x69\x6e\x67',
|
|
12
|
-
'\x66\x6c\x6f\x6f\x72',
|
|
13
|
-
'\x6e\x6f\x77',
|
|
14
|
-
'\x61\x62\x63\x64\x65\x66\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39',
|
|
15
|
-
'\x63\x68\x61\x72\x41\x74',
|
|
16
|
-
'\x72\x61\x6e\x64\x6f\x6d',
|
|
17
|
-
'\x6c\x65\x6e\x67\x74\x68',
|
|
18
|
-
'\x73\x69\x67\x6e',
|
|
19
|
-
'\x74\x69\x6d\x65\x73\x74\x61\x6d\x70',
|
|
20
|
-
'\x6e\x6f\x6e\x63\x65',
|
|
21
|
-
'\x61\x70\x70\x5f\x69\x64',
|
|
22
|
-
'\x65\x6e\x63\x72\x79\x70\x74\x65\x64',
|
|
23
|
-
'\x73\x74\x72\x69\x6e\x67\x69\x66\x79',
|
|
24
|
-
'\x75\x73\x65\x72',
|
|
25
|
-
'\x74\x65\x73\x74',
|
|
26
|
-
'\x61\x63\x74\x69\x6f\x6e',
|
|
27
|
-
'\x6c\x6f\x67\x69\x6e',
|
|
28
|
-
'\x6c\x6f\x67',
|
|
29
|
-
'\x52\x65\x73\x75\x6c\x74\x3a'
|
|
30
|
-
];
|
|
31
|
-
|
|
32
|
-
(function(_0x2d8f05, _0x4a2c9a) {
|
|
33
|
-
var _0x4b5b24 = function(_0x2d5f0a) {
|
|
34
|
-
while (--_0x2d5f0a) {
|
|
35
|
-
_0x2d8f05['push'](_0x2d8f05['shift']());
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
_0x4b5b24(++_0x4a2c9a);
|
|
39
|
-
}(_0x4a2c, 0x1b8));
|
|
40
|
-
|
|
41
|
-
var _0x4b5b = function(_0x2d8f05, _0x4a2c9a) {
|
|
42
|
-
_0x2d8f05 = _0x2d8f05 - 0x0;
|
|
43
|
-
var _0x4b5b24 = _0x4a2c[_0x2d8f05];
|
|
44
|
-
return _0x4b5b24;
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
var _0x2d5f0a = _0x4b5b('0x0');
|
|
48
|
-
var _0x3c7e1b = _0x4b5b('0x1');
|
|
49
|
-
|
|
50
|
-
function _0x1a2b3c(_0x5d6e7f) {
|
|
51
|
-
var _0x8a9b0c = 0x0;
|
|
52
|
-
for (var _0xd1e2f3 = 0x0; _0xd1e2f3 < _0x5d6e7f[_0x4b5b('0x9')]; _0xd1e2f3++) {
|
|
53
|
-
var _0x4g5h6i = _0x5d6e7f[_0x4b5b('0x2')](_0xd1e2f3);
|
|
54
|
-
_0x8a9b0c = ((_0x8a9b0c << 0x5) - _0x8a9b0c) + _0x4g5h6i;
|
|
55
|
-
_0x8a9b0c = _0x8a9b0c & _0x8a9b0c;
|
|
56
|
-
}
|
|
57
|
-
return Math['abs'](_0x8a9b0c)[_0x4b5b('0x3')](0x10);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function _0x7j8k9l() {
|
|
61
|
-
return Math[_0x4b5b('0x4')](Date[_0x4b5b('0x5')]() / 0x3e8);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function _0xm1n2o3(_0xp4q5r6) {
|
|
65
|
-
var _0xs7t8u9 = _0x4b5b('0x6');
|
|
66
|
-
var _0xv0w1x2 = '';
|
|
67
|
-
for (var _0xy3z4a5 = 0x0; _0xy3z4a5 < _0xp4q5r6; _0xy3z4a5++) {
|
|
68
|
-
_0xv0w1x2 += _0xs7t8u9[_0x4b5b('0x7')](Math[_0x4b5b('0x4')](Math[_0x4b5b('0x8')]() * _0xs7t8u9[_0x4b5b('0x9')]));
|
|
69
|
-
}
|
|
70
|
-
return _0xv0w1x2;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function _0xb6c7d8(_0xe9f0g1) {
|
|
74
|
-
var _0xh2i3j4 = _0x7j8k9l();
|
|
75
|
-
var _0xk5l6m7 = _0xm1n2o3(0x8);
|
|
76
|
-
var _0xn8o9p0 = _0x3c7e1b + _0xh2i3j4 + _0xk5l6m7 + _0x2d5f0a;
|
|
77
|
-
var _0xq1r2s3 = _0x1a2b3c(_0xn8o9p0);
|
|
78
|
-
var _0xt4u5v6 = {};
|
|
79
|
-
_0xt4u5v6[_0x4b5b('0xa')] = _0xq1r2s3;
|
|
80
|
-
_0xt4u5v6[_0x4b5b('0xb')] = _0xh2i3j4;
|
|
81
|
-
_0xt4u5v6[_0x4b5b('0xc')] = _0xk5l6m7;
|
|
82
|
-
_0xt4u5v6[_0x4b5b('0xd')] = _0x3c7e1b;
|
|
83
|
-
return _0xt4u5v6;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function _0xw7x8y9(_0xz0a1b2) {
|
|
87
|
-
var _0xc3d4e5 = _0xb6c7d8(_0xz0a1b2);
|
|
88
|
-
return Object['assign']({}, _0xz0a1b2, _0xc3d4e5, {
|
|
89
|
-
[_0x4b5b('0xe')]: btoa(JSON[_0x4b5b('0xf')](_0xz0a1b2))
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
var _0xf6g7h8 = {};
|
|
94
|
-
_0xf6g7h8[_0x4b5b('0x10')] = _0x4b5b('0x11');
|
|
95
|
-
_0xf6g7h8[_0x4b5b('0x12')] = _0x4b5b('0x13');
|
|
96
|
-
var _0xi9j0k1 = _0xw7x8y9(_0xf6g7h8);
|
|
97
|
-
console[_0x4b5b('0x14')](_0x4b5b('0x15'), _0xi9j0k1);
|
|
98
|
-
_0xi9j0k1;
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* v2: JavaScript Obfuscator 高级混淆
|
|
3
|
-
* 技术: RC4字符串加密 + 控制流平坦化 + 死代码注入 + 自我防御
|
|
4
|
-
* 参考: https://obfuscator.io
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// RC4 解密函数
|
|
8
|
-
function _0xrc4(_0xkey, _0xstr) {
|
|
9
|
-
var _0xs = [], _0xj = 0, _0xx, _0xres = '';
|
|
10
|
-
for (var _0xi = 0; _0xi < 256; _0xi++) { _0xs[_0xi] = _0xi; }
|
|
11
|
-
for (_0xi = 0; _0xi < 256; _0xi++) {
|
|
12
|
-
_0xj = (_0xj + _0xs[_0xi] + _0xkey.charCodeAt(_0xi % _0xkey.length)) % 256;
|
|
13
|
-
_0xx = _0xs[_0xi]; _0xs[_0xi] = _0xs[_0xj]; _0xs[_0xj] = _0xx;
|
|
14
|
-
}
|
|
15
|
-
_0xi = 0; _0xj = 0;
|
|
16
|
-
for (var _0xy = 0; _0xy < _0xstr.length; _0xy++) {
|
|
17
|
-
_0xi = (_0xi + 1) % 256;
|
|
18
|
-
_0xj = (_0xj + _0xs[_0xi]) % 256;
|
|
19
|
-
_0xx = _0xs[_0xi]; _0xs[_0xi] = _0xs[_0xj]; _0xs[_0xj] = _0xx;
|
|
20
|
-
_0xres += String.fromCharCode(_0xstr.charCodeAt(_0xy) ^ _0xs[(_0xs[_0xi] + _0xs[_0xj]) % 256]);
|
|
21
|
-
}
|
|
22
|
-
return _0xres;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// 加密的字符串数组
|
|
26
|
-
var _0x4f3a = [
|
|
27
|
-
'\x57\x46\x4a\x76\x63\x6d\x64\x6c', '\x58\x33\x52\x6c\x63\x33\x52\x66',
|
|
28
|
-
'\x4d\x6a\x41\x79\x4e\x41\x3d\x3d', '\x59\x58\x42\x77\x58\x7a\x45\x79'
|
|
29
|
-
];
|
|
30
|
-
|
|
31
|
-
// 控制流平坦化的主函数
|
|
32
|
-
(function() {
|
|
33
|
-
var _0xstate = '0';
|
|
34
|
-
var _0xSECRET = '', _0xAPPID = '';
|
|
35
|
-
var _0xresult = null;
|
|
36
|
-
|
|
37
|
-
while (true) {
|
|
38
|
-
switch (_0xstate) {
|
|
39
|
-
case '0':
|
|
40
|
-
_0xSECRET = atob('anNmb3JnZV90ZXN0XzIwMjQ=');
|
|
41
|
-
_0xstate = '1';
|
|
42
|
-
break;
|
|
43
|
-
case '1':
|
|
44
|
-
_0xAPPID = atob('YXBwXzEyMzQ1');
|
|
45
|
-
_0xstate = '2';
|
|
46
|
-
break;
|
|
47
|
-
case '2':
|
|
48
|
-
var _0xhash = function(_0xstr) {
|
|
49
|
-
var _0xh = 0;
|
|
50
|
-
for (var _0xi = 0; _0xi < _0xstr.length; _0xi++) {
|
|
51
|
-
_0xh = ((_0xh << 5) - _0xh) + _0xstr.charCodeAt(_0xi);
|
|
52
|
-
_0xh = _0xh & _0xh;
|
|
53
|
-
}
|
|
54
|
-
return Math.abs(_0xh).toString(16);
|
|
55
|
-
};
|
|
56
|
-
_0xstate = '3';
|
|
57
|
-
break;
|
|
58
|
-
case '3':
|
|
59
|
-
var _0xts = function() { return Math.floor(Date.now() / 1000); };
|
|
60
|
-
_0xstate = '4';
|
|
61
|
-
break;
|
|
62
|
-
case '4':
|
|
63
|
-
var _0xrand = function(_0xlen) {
|
|
64
|
-
var _0xc = 'abcdef0123456789', _0xr = '';
|
|
65
|
-
for (var _0xi = 0; _0xi < _0xlen; _0xi++) {
|
|
66
|
-
_0xr += _0xc.charAt(Math.floor(Math.random() * _0xc.length));
|
|
67
|
-
}
|
|
68
|
-
return _0xr;
|
|
69
|
-
};
|
|
70
|
-
_0xstate = '5';
|
|
71
|
-
break;
|
|
72
|
-
case '5':
|
|
73
|
-
var _0xgenSign = function(_0xp) {
|
|
74
|
-
var _0xt = _0xts(), _0xn = _0xrand(8);
|
|
75
|
-
var _0xsStr = _0xAPPID + _0xt + _0xn + _0xSECRET;
|
|
76
|
-
return { sign: _0xhash(_0xsStr), timestamp: _0xt, nonce: _0xn, app_id: _0xAPPID };
|
|
77
|
-
};
|
|
78
|
-
_0xstate = '6';
|
|
79
|
-
break;
|
|
80
|
-
case '6':
|
|
81
|
-
var _0xencrypt = function(_0xd) {
|
|
82
|
-
var _0xs = _0xgenSign(_0xd);
|
|
83
|
-
return Object.assign({}, _0xd, _0xs, { encrypted: btoa(JSON.stringify(_0xd)) });
|
|
84
|
-
};
|
|
85
|
-
_0xstate = '7';
|
|
86
|
-
break;
|
|
87
|
-
case '7':
|
|
88
|
-
_0xresult = _0xencrypt({ user: 'test', action: 'login' });
|
|
89
|
-
_0xstate = '8';
|
|
90
|
-
break;
|
|
91
|
-
case '8':
|
|
92
|
-
console.log('Result:', _0xresult);
|
|
93
|
-
_0xstate = '9';
|
|
94
|
-
break;
|
|
95
|
-
case '9':
|
|
96
|
-
return _0xresult;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
})();
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* v3: JJEncode 颜文字混淆
|
|
3
|
-
* 技术: 使用日式颜文字字符进行编码,利用JS类型转换特性
|
|
4
|
-
* 特点: 代码看起来像颜文字表情,但实际可执行
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// JJEncode 核心解码器
|
|
8
|
-
var $ = ~[];
|
|
9
|
-
$ = {
|
|
10
|
-
___: ++$,
|
|
11
|
-
$$$$: (![]+"")[$],
|
|
12
|
-
__$: ++$,
|
|
13
|
-
$_$_: (![]+"")[$],
|
|
14
|
-
_$_: ++$,
|
|
15
|
-
$_$$: ({}+"")[$],
|
|
16
|
-
$$_$: ($[$]+"")[$],
|
|
17
|
-
_$$: ++$,
|
|
18
|
-
$$$_: (!""+"" )[$],
|
|
19
|
-
$__: ++$,
|
|
20
|
-
$_$: ++$,
|
|
21
|
-
$$__: ({}+"")[$],
|
|
22
|
-
$$_: ++$,
|
|
23
|
-
$$$: ++$,
|
|
24
|
-
$___: ++$,
|
|
25
|
-
$__$: ++$
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
$.$_ = ($.$_ = $ + "")[$.$_$] +
|
|
29
|
-
($._$ = $.$_[$.__$]) +
|
|
30
|
-
($.$$ = ($.$ + "")[$.__$]) +
|
|
31
|
-
((!$) + "")[$._$$] +
|
|
32
|
-
($.__ = $.$_[$.$$_]) +
|
|
33
|
-
($.$ = (!"" + "")[$.__$]) +
|
|
34
|
-
($._ = (!"" + "")[$._$_]) +
|
|
35
|
-
$.$_[$.$_$] + $.__ + $._$ + $.$;
|
|
36
|
-
|
|
37
|
-
$.$$ = $.$ + (!"" + "")[$._$$] + $.__ + $._ + $.$ + $.$$;
|
|
38
|
-
$.$ = ($.___)[$.$_][$.$_];
|
|
39
|
-
|
|
40
|
-
// 编码后的核心逻辑 - 通过字符拼接构建代码
|
|
41
|
-
var _$$ = "constructor";
|
|
42
|
-
var __$ = ([][[]] + "")[5] + ([][[]] + "")[1]; // "un" + "d"
|
|
43
|
-
var ___ = Function;
|
|
44
|
-
|
|
45
|
-
// 构建执行字符串
|
|
46
|
-
var encoded = [];
|
|
47
|
-
encoded[0] = 118; encoded[1] = 97; encoded[2] = 114; // "var"
|
|
48
|
-
encoded[3] = 32; // space
|
|
49
|
-
encoded[4] = 83; encoded[5] = 69; encoded[6] = 67; // "SEC"
|
|
50
|
-
|
|
51
|
-
// 解码执行
|
|
52
|
-
var decode = function(arr) {
|
|
53
|
-
return arr.map(function(c) { return String.fromCharCode(c); }).join('');
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
// 核心代码(编码形式)
|
|
57
|
-
var coreCode = [
|
|
58
|
-
99,111,110,115,116,32,83,69,67,82,69,84,95,75,69,89,32,61,32,
|
|
59
|
-
39,106,115,102,111,114,103,101,95,116,101,115,116,95,50,48,50,52,39,59
|
|
60
|
-
];
|
|
61
|
-
|
|
62
|
-
var coreCode2 = [
|
|
63
|
-
99,111,110,115,116,32,65,80,80,95,73,68,32,61,32,39,97,112,112,
|
|
64
|
-
95,49,50,51,52,53,39,59
|
|
65
|
-
];
|
|
66
|
-
|
|
67
|
-
// 函数体编码
|
|
68
|
-
var funcBody = [
|
|
69
|
-
102,117,110,99,116,105,111,110,32,115,105,109,112,108,101,72,97,115,104,40,115,116,114,41,123,
|
|
70
|
-
108,101,116,32,104,61,48,59,102,111,114,40,108,101,116,32,105,61,48,59,105,60,115,116,114,46,
|
|
71
|
-
108,101,110,103,116,104,59,105,43,43,41,123,104,61,40,40,104,60,60,53,41,45,104,41,43,115,116,
|
|
72
|
-
114,46,99,104,97,114,67,111,100,101,65,116,40,105,41,59,104,61,104,38,104,125,114,101,116,117,
|
|
73
|
-
114,110,32,77,97,116,104,46,97,98,115,40,104,41,46,116,111,83,116,114,105,110,103,40,49,54,41,125
|
|
74
|
-
];
|
|
75
|
-
|
|
76
|
-
// 执行解码后的代码
|
|
77
|
-
___(decode(coreCode) + decode(coreCode2) + decode(funcBody))();
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* v4: AAEncode 颜文字混淆
|
|
3
|
-
* 技术: 使用日式颜文字(゚ω゚)ノ进行编码
|
|
4
|
-
* 特点: 全部由颜文字组成,极具迷惑性
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_'];
|
|
8
|
-
o=(゚ー゚) =_=3;
|
|
9
|
-
c=(゚Θ゚) =(゚ー゚)-(゚ー゚);
|
|
10
|
-
(゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);
|
|
11
|
-
(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] };
|
|
12
|
-
(゚Д゚) .゚ー゚ノ=((゚Д゚)+'_') [o^_^o -(゚Θ゚)];
|
|
13
|
-
(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];
|
|
14
|
-
(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];
|
|
15
|
-
(o゚ー゚o)=(゚Д゚) ['c']+(゚Д゚) ['o'];
|
|
16
|
-
(゚Д゚) ['゚Θ゚']= (゚Д゚) ['c']+(゚Д゚) ['o']+(゚Д゚) ['c'];
|
|
17
|
-
(゚Д゚) ['゚ω゚ノ']= (゚Д゚) ['c']+(゚Д゚) ['o']+(゚Д゚) ['c'];
|
|
18
|
-
(゚Д゚) [゚Θ゚]= (゚ω゚ノ) [゚Θ゚];
|
|
19
|
-
(゚Д゚) ['c']=((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)+(゚Θ゚)];
|
|
20
|
-
(゚Д゚) ['o']=((゚Д゚)+'_') [(゚ー゚)];
|
|
21
|
-
(゚ー゚)=(゚ー゚)+(゚Θ゚);
|
|
22
|
-
(゚Д゚)[゚ー゚]='\\';
|
|
23
|
-
|
|
24
|
-
// 简化版AAEncode - 实际可执行的混淆代码
|
|
25
|
-
(function() {
|
|
26
|
-
var ω = 'constructor';
|
|
27
|
-
var Д = []['filter'][ω](ω);
|
|
28
|
-
var ゚ = {
|
|
29
|
-
ー: 'a]b[c'.split(']')[0],
|
|
30
|
-
Θ: (![]+[])[+!![]]
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
// 核心逻辑的编码表示
|
|
34
|
-
var _ωω_ = function(゚ω゚) {
|
|
35
|
-
var ゚Д゚ = 0;
|
|
36
|
-
for (var ゚Θ゚ = 0; ゚Θ゚ < ゚ω゚.length; ゚Θ゚++) {
|
|
37
|
-
var o゚ー゚o = ゚ω゚.charCodeAt(゚Θ゚);
|
|
38
|
-
゚Д゚ = ((゚Д゚ << 5) - ゚Д゚) + o゚ー゚o;
|
|
39
|
-
゚Д゚ = ゚Д゚ & ゚Д゚;
|
|
40
|
-
}
|
|
41
|
-
return Math.abs(゚Д゚).toString(16);
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
var _゚ω゚_ = function() {
|
|
45
|
-
return Math.floor(Date.now() / 1000);
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
var _゚Д゚_ = function(゚ー゚) {
|
|
49
|
-
var c = 'abcdef0123456789', r = '';
|
|
50
|
-
for (var i = 0; i < ゚ー゚; i++) {
|
|
51
|
-
r += c.charAt(Math.floor(Math.random() * c.length));
|
|
52
|
-
}
|
|
53
|
-
return r;
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
var ゚Θ゚ノ = 'deepspider_test_2024';
|
|
57
|
-
var ゚ω゚ノノ = 'app_12345';
|
|
58
|
-
|
|
59
|
-
var _genSign_ = function(p) {
|
|
60
|
-
var t = _゚ω゚_(), n = _゚Д゚_(8);
|
|
61
|
-
var s = ゚ω゚ノノ + t + n + ゚Θ゚ノ;
|
|
62
|
-
return { sign: _ωω_(s), timestamp: t, nonce: n, app_id: ゚ω゚ノノ };
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
var _encrypt_ = function(d) {
|
|
66
|
-
var s = _genSign_(d);
|
|
67
|
-
return Object.assign({}, d, s, { encrypted: btoa(JSON.stringify(d)) });
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
var result = _encrypt_({ user: 'test', action: 'login' });
|
|
71
|
-
console.log('Result:', result);
|
|
72
|
-
return result;
|
|
73
|
-
})();
|
|
@@ -1,86 +0,0 @@
|
|
|
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
|
-
})();
|
|
@@ -1,71 +0,0 @@
|
|
|
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
|
-
})();
|