mirror of
https://github.com/violettoolssite/CFspider.git
synced 2026-04-05 03:09:01 +08:00
添加混淆版本workers
This commit is contained in:
@@ -528,32 +528,32 @@ def request(method, url, cf_proxies=None, uuid=None, http2=False, impersonate=No
|
|||||||
httpx = _get_httpx()
|
httpx = _get_httpx()
|
||||||
with httpx.Client(http2=True, timeout=timeout) as client:
|
with httpx.Client(http2=True, timeout=timeout) as client:
|
||||||
response = client.request(
|
response = client.request(
|
||||||
method,
|
method,
|
||||||
url,
|
url,
|
||||||
params=params,
|
params=params,
|
||||||
headers=headers,
|
headers=headers,
|
||||||
data=data,
|
data=data,
|
||||||
json=json_data,
|
json=json_data,
|
||||||
cookies=cookies,
|
cookies=cookies,
|
||||||
**kwargs
|
**kwargs
|
||||||
)
|
)
|
||||||
resp = CFSpiderResponse(response)
|
resp = CFSpiderResponse(response)
|
||||||
_handle_map_output(resp, url, start_time, map_output, map_file)
|
_handle_map_output(resp, url, start_time, map_output, map_file)
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
# 默认使用 requests
|
# 默认使用 requests
|
||||||
resp = requests.request(
|
resp = requests.request(
|
||||||
method,
|
method,
|
||||||
url,
|
url,
|
||||||
params=params,
|
params=params,
|
||||||
headers=headers,
|
headers=headers,
|
||||||
data=data,
|
data=data,
|
||||||
json=json_data,
|
json=json_data,
|
||||||
cookies=cookies,
|
cookies=cookies,
|
||||||
timeout=timeout,
|
timeout=timeout,
|
||||||
**kwargs
|
**kwargs
|
||||||
)
|
)
|
||||||
response = CFSpiderResponse(resp)
|
response = CFSpiderResponse(resp)
|
||||||
_handle_map_output(response, url, start_time, map_output, map_file)
|
_handle_map_output(response, url, start_time, map_output, map_file)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@@ -782,18 +782,18 @@ def _request_vless(method, url, cf_proxies, uuid=None,
|
|||||||
if impersonate:
|
if impersonate:
|
||||||
curl_requests = _get_curl_cffi()
|
curl_requests = _get_curl_cffi()
|
||||||
response = curl_requests.request(
|
response = curl_requests.request(
|
||||||
method,
|
method,
|
||||||
url,
|
url,
|
||||||
params=params,
|
params=params,
|
||||||
headers=headers,
|
headers=headers,
|
||||||
data=data,
|
data=data,
|
||||||
json=json_data,
|
json=json_data,
|
||||||
cookies=cookies,
|
cookies=cookies,
|
||||||
timeout=timeout,
|
timeout=timeout,
|
||||||
impersonate=impersonate,
|
impersonate=impersonate,
|
||||||
proxies=proxies,
|
proxies=proxies,
|
||||||
**kwargs
|
**kwargs
|
||||||
)
|
)
|
||||||
resp = CFSpiderResponse(response)
|
resp = CFSpiderResponse(response)
|
||||||
_handle_map_output(resp, url, start_time, map_output, map_file)
|
_handle_map_output(resp, url, start_time, map_output, map_file)
|
||||||
return resp
|
return resp
|
||||||
@@ -822,13 +822,13 @@ def _request_vless(method, url, cf_proxies, uuid=None,
|
|||||||
url,
|
url,
|
||||||
params=params,
|
params=params,
|
||||||
headers=headers,
|
headers=headers,
|
||||||
data=data,
|
data=data,
|
||||||
json=json_data,
|
json=json_data,
|
||||||
cookies=cookies,
|
cookies=cookies,
|
||||||
timeout=timeout,
|
timeout=timeout,
|
||||||
proxies=proxies,
|
proxies=proxies,
|
||||||
**kwargs
|
**kwargs
|
||||||
)
|
)
|
||||||
response = CFSpiderResponse(resp)
|
response = CFSpiderResponse(resp)
|
||||||
_handle_map_output(response, url, start_time, map_output, map_file)
|
_handle_map_output(response, url, start_time, map_output, map_file)
|
||||||
return response
|
return response
|
||||||
@@ -950,7 +950,7 @@ def put(url, cf_proxies=None, uuid=None, http2=False, impersonate=None,
|
|||||||
|
|
||||||
|
|
||||||
def delete(url, cf_proxies=None, uuid=None, http2=False, impersonate=None,
|
def delete(url, cf_proxies=None, uuid=None, http2=False, impersonate=None,
|
||||||
map_output=False, map_file="cfspider_map.html",
|
map_output=False, map_file="cfspider_map.html",
|
||||||
stealth=False, stealth_browser='chrome', delay=None,
|
stealth=False, stealth_browser='chrome', delay=None,
|
||||||
static_ip=False, two_proxy=None, **kwargs):
|
static_ip=False, two_proxy=None, **kwargs):
|
||||||
"""发送 DELETE 请求 / Send DELETE request"""
|
"""发送 DELETE 请求 / Send DELETE request"""
|
||||||
@@ -974,7 +974,7 @@ def head(url, cf_proxies=None, uuid=None, http2=False, impersonate=None,
|
|||||||
|
|
||||||
|
|
||||||
def options(url, cf_proxies=None, uuid=None, http2=False, impersonate=None,
|
def options(url, cf_proxies=None, uuid=None, http2=False, impersonate=None,
|
||||||
map_output=False, map_file="cfspider_map.html",
|
map_output=False, map_file="cfspider_map.html",
|
||||||
stealth=False, stealth_browser='chrome', delay=None,
|
stealth=False, stealth_browser='chrome', delay=None,
|
||||||
static_ip=False, two_proxy=None, **kwargs):
|
static_ip=False, two_proxy=None, **kwargs):
|
||||||
"""发送 OPTIONS 请求 / Send OPTIONS request"""
|
"""发送 OPTIONS 请求 / Send OPTIONS request"""
|
||||||
|
|||||||
180
cfspider_obfuscate.js
Normal file
180
cfspider_obfuscate.js
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
/**
|
||||||
|
* CFspider 独创代码混淆算法
|
||||||
|
* 特点:
|
||||||
|
* 1. 字符串加密 - 使用自定义的 XOR + Base64 变体
|
||||||
|
* 2. 变量名混淆 - 使用中文 Unicode 字符
|
||||||
|
* 3. 控制流混淆 - 插入虚假分支
|
||||||
|
* 4. 数字混淆 - 将数字转换为表达式
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
// CFspider 加密密钥(可自定义)
|
||||||
|
const ENCRYPTION_KEY = 'CFspider-2026-Encrypt';
|
||||||
|
|
||||||
|
// 生成混淆后的变量名(使用中文 Unicode)
|
||||||
|
function generateObfuscatedName(index) {
|
||||||
|
const baseChars = '蛛网络代理加速器安全隐私数据流量请求响应连接传输协议';
|
||||||
|
const result = [];
|
||||||
|
let n = index;
|
||||||
|
do {
|
||||||
|
result.unshift(baseChars[n % baseChars.length]);
|
||||||
|
n = Math.floor(n / baseChars.length);
|
||||||
|
} while (n > 0);
|
||||||
|
return '_' + result.join('') + '_';
|
||||||
|
}
|
||||||
|
|
||||||
|
// XOR 加密字符串
|
||||||
|
function xorEncrypt(str, key) {
|
||||||
|
let result = '';
|
||||||
|
for (let i = 0; i < str.length; i++) {
|
||||||
|
result += String.fromCharCode(str.charCodeAt(i) ^ key.charCodeAt(i % key.length));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 自定义 Base64 变体编码(打乱字符表)
|
||||||
|
function customBase64Encode(str) {
|
||||||
|
// 打乱的 Base64 字符表
|
||||||
|
const chars = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0123456789+/';
|
||||||
|
const standardChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
||||||
|
|
||||||
|
// 先做标准 Base64
|
||||||
|
let base64 = Buffer.from(str).toString('base64');
|
||||||
|
|
||||||
|
// 替换为自定义字符表
|
||||||
|
let result = '';
|
||||||
|
for (let c of base64) {
|
||||||
|
if (c === '=') {
|
||||||
|
result += '=';
|
||||||
|
} else {
|
||||||
|
const idx = standardChars.indexOf(c);
|
||||||
|
result += idx >= 0 ? chars[idx] : c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加密字符串
|
||||||
|
function encryptString(str) {
|
||||||
|
const xored = xorEncrypt(str, ENCRYPTION_KEY);
|
||||||
|
return customBase64Encode(xored);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成解密函数代码
|
||||||
|
function generateDecryptFunction() {
|
||||||
|
return `
|
||||||
|
const _蛛_ = '${ENCRYPTION_KEY}';
|
||||||
|
const _网_ = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0123456789+/';
|
||||||
|
const _络_ = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
||||||
|
function _代_(s){let r='';for(let c of s){if(c==='=')r+='=';else{const i=_网_.indexOf(c);r+=i>=0?_络_[i]:c;}}return r;}
|
||||||
|
function _理_(e){const d=atob(_代_(e));let r='';for(let i=0;i<d.length;i++)r+=String.fromCharCode(d.charCodeAt(i)^_蛛_.charCodeAt(i%_蛛_.length));return r;}
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 数字混淆 - 将数字转换为表达式
|
||||||
|
function obfuscateNumber(num) {
|
||||||
|
const operations = [
|
||||||
|
(n) => `(${n + 1} - 1)`,
|
||||||
|
(n) => `(${n * 2} / 2)`,
|
||||||
|
(n) => `(${n + 10} - 10)`,
|
||||||
|
(n) => `(${Math.floor(n / 2)} * 2 + ${n % 2})`,
|
||||||
|
(n) => `(0x${n.toString(16)})`,
|
||||||
|
];
|
||||||
|
return operations[Math.floor(Math.random() * operations.length)](num);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 混淆代码
|
||||||
|
function obfuscateCode(code) {
|
||||||
|
let result = code;
|
||||||
|
let stringMap = new Map();
|
||||||
|
let stringCounter = 0;
|
||||||
|
|
||||||
|
// 保护 import/export 语句 - 先替换为占位符
|
||||||
|
const importExportRegex = /^(import|export)\s+.*?['"](.*?)['"];?$/gm;
|
||||||
|
const protectedStrings = [];
|
||||||
|
result = result.replace(importExportRegex, (match) => {
|
||||||
|
const placeholder = `__PROTECTED_${protectedStrings.length}__`;
|
||||||
|
protectedStrings.push(match);
|
||||||
|
return placeholder;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 1. 提取并加密字符串
|
||||||
|
const stringRegex = /'([^'\\]|\\.)*'|"([^"\\]|\\.)*"/g;
|
||||||
|
result = result.replace(stringRegex, (match) => {
|
||||||
|
// 跳过短字符串、特殊字符串、和模块路径
|
||||||
|
const str = match.slice(1, -1);
|
||||||
|
if (str.length < 5 ||
|
||||||
|
str.includes('\\') ||
|
||||||
|
/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(str) ||
|
||||||
|
str.startsWith('cloudflare:') ||
|
||||||
|
str.startsWith('http') ||
|
||||||
|
str.includes('/') ||
|
||||||
|
str.includes(':')) {
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
|
||||||
|
const varName = `_s${stringCounter++}_`;
|
||||||
|
const encrypted = encryptString(str);
|
||||||
|
stringMap.set(varName, encrypted);
|
||||||
|
return `_理_('${encrypted}')`;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 恢复 import/export 语句
|
||||||
|
protectedStrings.forEach((original, index) => {
|
||||||
|
result = result.replace(`__PROTECTED_${index}__`, original);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 2. 添加解密函数到开头
|
||||||
|
result = generateDecryptFunction() + result;
|
||||||
|
|
||||||
|
// 3. 添加反调试代码
|
||||||
|
const antiDebug = `
|
||||||
|
(function(){
|
||||||
|
const _检测_ = function(){
|
||||||
|
const start = Date.now();
|
||||||
|
debugger;
|
||||||
|
if(Date.now() - start > 100){
|
||||||
|
window.location.href = 'about:blank';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
setInterval(_检测_, 1000);
|
||||||
|
})();
|
||||||
|
`;
|
||||||
|
|
||||||
|
// 4. 添加自我保护代码
|
||||||
|
const selfProtect = `
|
||||||
|
(function(){
|
||||||
|
const _原始_ = Function.prototype.toString;
|
||||||
|
Function.prototype.toString = function(){
|
||||||
|
if(this === _理_ || this === _代_) return 'function(){}';
|
||||||
|
return _原始_.call(this);
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
`;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 主函数
|
||||||
|
function main() {
|
||||||
|
const inputFile = process.argv[2] || 'workers.js';
|
||||||
|
const outputFile = process.argv[3] || 'workers_cfspider_obfuscated.js';
|
||||||
|
|
||||||
|
console.log(`CFspider 代码混淆器`);
|
||||||
|
console.log(`输入: ${inputFile}`);
|
||||||
|
console.log(`输出: ${outputFile}`);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const code = fs.readFileSync(inputFile, 'utf-8');
|
||||||
|
const obfuscated = obfuscateCode(code);
|
||||||
|
fs.writeFileSync(outputFile, obfuscated);
|
||||||
|
console.log(`混淆完成!输出文件: ${outputFile}`);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`错误: ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
|
|
||||||
20
obfuscate.js
Normal file
20
obfuscate.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
const JavaScriptObfuscator = require('javascript-obfuscator');
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
const code = fs.readFileSync('workers.js', 'utf8');
|
||||||
|
|
||||||
|
const result = JavaScriptObfuscator.obfuscate(code, {
|
||||||
|
compact: true,
|
||||||
|
controlFlowFlattening: false,
|
||||||
|
deadCodeInjection: false,
|
||||||
|
stringArray: false,
|
||||||
|
identifierNamesGenerator: 'hexadecimal',
|
||||||
|
renameGlobals: false,
|
||||||
|
selfDefending: false,
|
||||||
|
unicodeEscapeSequence: true // 将所有字符转为 Unicode 转义
|
||||||
|
});
|
||||||
|
|
||||||
|
fs.writeFileSync('workers_obf.js', result.getObfuscatedCode(), 'utf8');
|
||||||
|
console.log('混淆完成: workers_obf.js');
|
||||||
|
|
||||||
|
|
||||||
1456
package-lock.json
generated
1456
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,8 @@
|
|||||||
{
|
{
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@neondatabase/serverless": "^1.0.2"
|
"@neondatabase/serverless": "^1.0.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"javascript-obfuscator": "^5.1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
export default {
|
export default {
|
||||||
async fetch(request, env) {
|
async fetch(request) {
|
||||||
return new Response('Hello World!', {
|
return new Response("Hello from CFspider test!", {
|
||||||
headers: { 'Content-Type': 'text/plain' }
|
headers: { "Content-Type": "text/plain" }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
6
wrangler-test.toml
Normal file
6
wrangler-test.toml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
name = "cfspider-test"
|
||||||
|
main = "workers.js"
|
||||||
|
compatibility_date = "2024-01-01"
|
||||||
|
compatibility_flags = ["nodejs_compat"]
|
||||||
|
workers_dev = true
|
||||||
|
|
||||||
1
破皮版workers.js
Normal file
1
破皮版workers.js
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user