mirror of
https://github.com/violettoolssite/CFspider.git
synced 2026-04-04 18:59:02 +08:00
310 lines
9.9 KiB
JavaScript
310 lines
9.9 KiB
JavaScript
const Terser = require('terser');
|
|
const fs = require('fs');
|
|
|
|
async function obfuscate() {
|
|
let code = fs.readFileSync('workers.js', 'utf8');
|
|
|
|
// 第一步:将所有中文变量名替换为英文
|
|
const replacements = [
|
|
// 变量名替换
|
|
['config_JSON', 'cfgData'],
|
|
['反代IP', 'proxyIp'],
|
|
['启用SOCKS5反代', 'enableSocks5'],
|
|
['启用SOCKS5全局反代', 'globalSocks5'],
|
|
['我的SOCKS5账号', 'socks5Account'],
|
|
['parsedSocks5Address', 'parsedS5Addr'],
|
|
['缓存反代IP', 'cachedProxyIp'],
|
|
['缓存反代解析数组', 'cachedProxyArr'],
|
|
['缓存反代数组索引', 'cachedProxyIdx'],
|
|
['启用反代兜底', 'enableFallback'],
|
|
['ECH_DOH', 'echDoh'],
|
|
['SOCKS5白名单', 'socks5Whitelist'],
|
|
['Pages静态页面', 'staticPages'],
|
|
['管理员密码', 'adminPass'],
|
|
['加密秘钥', 'encKey'],
|
|
['userIDMD5', 'uidMd5'],
|
|
['uuidRegex', 'uidRegex'],
|
|
['envUUID', 'envUid'],
|
|
['userID', 'uid'],
|
|
['访问IP', 'clientIp'],
|
|
['upgradeHeader', 'upHeader'],
|
|
|
|
// 函数名替换
|
|
['整理成数组', 'toArray'],
|
|
['MD5MD5', 'hashMd5'],
|
|
['解析SOCKS5地址', 'parseSocks5'],
|
|
['获取配置', 'getConfig'],
|
|
['获取随机IP', 'getRandIp'],
|
|
['解析订阅地址', 'parseSub'],
|
|
['记录日志', 'logRecord'],
|
|
['脱敏', 'maskStr'],
|
|
['获取CF用量', 'getCfUsage'],
|
|
['检测SOCKS5', 'checkSocks5'],
|
|
['处理websocket', 'handleWs'],
|
|
['处理TCP出站', 'handleTcp'],
|
|
['处理UDP', 'handleUdp'],
|
|
['关闭ws连接', 'closeWs'],
|
|
['写入ws流', 'writeToWs'],
|
|
['是否禁止地址', 'isBlocked'],
|
|
['SOCKS5出站', 'socks5Out'],
|
|
['HTTP代理出站', 'httpProxyOut'],
|
|
|
|
// 其他变量
|
|
['双层代理', 'twoProxy'],
|
|
['地址', 'addr'],
|
|
['端口', 'port'],
|
|
['主机名', 'hostname'],
|
|
['用户名', 'username'],
|
|
['密码', 'password'],
|
|
['协议', 'protocol'],
|
|
['路径', 'path'],
|
|
['域名', 'domain'],
|
|
['响应', 'response'],
|
|
['请求', 'request'],
|
|
['链接', 'link'],
|
|
['配置', 'config'],
|
|
['错误', 'error'],
|
|
['成功', 'success'],
|
|
['失败', 'failed'],
|
|
['开始', 'start'],
|
|
['结束', 'end'],
|
|
['时间', 'time'],
|
|
['日期', 'date'],
|
|
['消息', 'message'],
|
|
['数据', 'data'],
|
|
['结果', 'result'],
|
|
['状态', 'status'],
|
|
['类型', 'type'],
|
|
['长度', 'length'],
|
|
['索引', 'index'],
|
|
['数组', 'array'],
|
|
['对象', 'object'],
|
|
['字符串', 'string'],
|
|
['数字', 'number'],
|
|
['布尔', 'boolean'],
|
|
['函数', 'func'],
|
|
['方法', 'method'],
|
|
['属性', 'prop'],
|
|
['参数', 'param'],
|
|
['返回', 'ret'],
|
|
['继续', 'cont'],
|
|
['跳过', 'skip'],
|
|
['等待', 'wait'],
|
|
['加载', 'load'],
|
|
['保存', 'save'],
|
|
['删除', 'del'],
|
|
['更新', 'update'],
|
|
['读取', 'read'],
|
|
['写入', 'write'],
|
|
['发送', 'send'],
|
|
['接收', 'recv'],
|
|
['连接', 'connect'],
|
|
['断开', 'disconnect'],
|
|
['启动', 'launch'],
|
|
['停止', 'stop'],
|
|
['初始化', 'init'],
|
|
['销毁', 'destroy'],
|
|
['创建', 'create'],
|
|
['获取', 'get'],
|
|
['设置', 'set'],
|
|
['检查', 'check'],
|
|
['验证', 'verify'],
|
|
['解析', 'parse'],
|
|
['格式化', 'format'],
|
|
['转换', 'convert'],
|
|
['编码', 'encode'],
|
|
['解码', 'decode'],
|
|
['加密', 'encrypt'],
|
|
['解密', 'decrypt'],
|
|
['压缩', 'compress'],
|
|
['解压', 'decompress'],
|
|
['排序', 'sort'],
|
|
['过滤', 'filter'],
|
|
['映射', 'map'],
|
|
['查找', 'find'],
|
|
['替换', 'replace'],
|
|
['分割', 'split'],
|
|
['合并', 'merge'],
|
|
['复制', 'copy'],
|
|
['移动', 'move'],
|
|
['交换', 'swap'],
|
|
['比较', 'compare'],
|
|
['计算', 'calc'],
|
|
['统计', 'stat'],
|
|
['生成', 'gen'],
|
|
['随机', 'rand'],
|
|
['默认', 'def'],
|
|
['自定义', 'custom'],
|
|
['系统', 'system'],
|
|
['用户', 'user'],
|
|
['管理', 'manage'],
|
|
['权限', 'permission'],
|
|
['角色', 'role'],
|
|
['组', 'group'],
|
|
['文件', 'file'],
|
|
['目录', 'dir'],
|
|
['网络', 'network'],
|
|
['服务', 'service'],
|
|
['客户端', 'client'],
|
|
['服务器', 'server'],
|
|
['代理', 'proxy'],
|
|
['转发', 'forward'],
|
|
['重定向', 'redirect'],
|
|
['缓存', 'cache'],
|
|
['存储', 'storage'],
|
|
['数据库', 'database'],
|
|
['表', 'table'],
|
|
['记录', 'record'],
|
|
['字段', 'field'],
|
|
['键', 'key'],
|
|
['值', 'value'],
|
|
['选项', 'option'],
|
|
['设定', 'setting'],
|
|
['模式', 'mode'],
|
|
['版本', 'version'],
|
|
['环境', 'env'],
|
|
['调试', 'debug'],
|
|
['测试', 'test'],
|
|
['生产', 'prod'],
|
|
['开发', 'dev'],
|
|
['正式', 'release'],
|
|
['草稿', 'draft'],
|
|
['发布', 'publish'],
|
|
['订阅', 'subscribe'],
|
|
['取消', 'cancel'],
|
|
['确认', 'confirm'],
|
|
['提交', 'submit'],
|
|
['重置', 'reset'],
|
|
['刷新', 'refresh'],
|
|
['同步', 'sync'],
|
|
['异步', 'async'],
|
|
['超时', 'timeout'],
|
|
['重试', 'retry'],
|
|
['限制', 'limit'],
|
|
['最大', 'max'],
|
|
['最小', 'min'],
|
|
['平均', 'avg'],
|
|
['总计', 'total'],
|
|
['当前', 'current'],
|
|
['上一个', 'prev'],
|
|
['下一个', 'next'],
|
|
['第一个', 'first'],
|
|
['最后一个', 'last'],
|
|
['全部', 'all'],
|
|
['部分', 'part'],
|
|
['其他', 'other'],
|
|
['未知', 'unknown'],
|
|
['空', 'empty'],
|
|
['非空', 'notEmpty'],
|
|
['有效', 'valid'],
|
|
['无效', 'invalid'],
|
|
['启用', 'enabled'],
|
|
['禁用', 'disabled'],
|
|
['是', 'yes'],
|
|
['否', 'no'],
|
|
['真', 'trueVal'],
|
|
['假', 'falseVal'],
|
|
['输入', 'input'],
|
|
['输出', 'output'],
|
|
['来源', 'source'],
|
|
['目标', 'target'],
|
|
['原始', 'raw'],
|
|
['处理后', 'processed'],
|
|
['临时', 'temp'],
|
|
['永久', 'permanent'],
|
|
['公开', 'pub'],
|
|
['私有', 'priv'],
|
|
['共享', 'shared'],
|
|
['独占', 'exclusive'],
|
|
['只读', 'readOnly'],
|
|
['可写', 'writable'],
|
|
['可执行', 'executable'],
|
|
['隐藏', 'hidden'],
|
|
['显示', 'visible'],
|
|
['激活', 'active'],
|
|
['不活动', 'inactive'],
|
|
['在线', 'online'],
|
|
['离线', 'offline'],
|
|
['忙碌', 'busy'],
|
|
['空闲', 'idle'],
|
|
['等待中', 'waiting'],
|
|
['运行中', 'running'],
|
|
['已完成', 'completed'],
|
|
['已取消', 'cancelled'],
|
|
['已失败', 'failedStatus'],
|
|
['已暂停', 'paused'],
|
|
['已恢复', 'resumed'],
|
|
['公开模式', 'publicMode'],
|
|
['荷兰节点', 'nlNode'],
|
|
['香港节点', 'hkNode'],
|
|
['联通优选', 'cuOptimal'],
|
|
['移动优选', 'cmccOptimal'],
|
|
['电信优选', 'ctOptimal'],
|
|
['官方优选', 'cfOptimal'],
|
|
['请求次数', 'reqCount'],
|
|
['流量', 'traffic'],
|
|
['位置', 'location'],
|
|
['地区', 'region'],
|
|
['国家', 'country'],
|
|
['城市', 'city'],
|
|
['速度', 'speed'],
|
|
['延迟', 'latency'],
|
|
['节点', 'node'],
|
|
['订阅链接', 'subLink'],
|
|
['配置文件', 'configFile'],
|
|
['日志', 'log'],
|
|
['通知', 'notify'],
|
|
['告警', 'alert'],
|
|
['警告', 'warn'],
|
|
['信息', 'info'],
|
|
];
|
|
|
|
// 按长度排序(长的先替换,避免部分匹配问题)
|
|
replacements.sort((a, b) => b[0].length - a[0].length);
|
|
|
|
for (const [cn, en] of replacements) {
|
|
// 使用正则匹配完整词,避免部分替换
|
|
const regex = new RegExp(cn.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g');
|
|
code = code.replace(regex, en);
|
|
}
|
|
|
|
// 第二步:使用 Terser 进行混淆和压缩
|
|
const result = await Terser.minify(code, {
|
|
compress: {
|
|
dead_code: true,
|
|
drop_console: false, // 保留 console.log 便于调试
|
|
drop_debugger: true,
|
|
passes: 2,
|
|
},
|
|
mangle: {
|
|
toplevel: true,
|
|
reserved: ['fetch', 'Request', 'Response', 'Headers', 'URL', 'WebSocket', 'WebSocketPair', 'crypto', 'atob', 'btoa', 'TextEncoder', 'TextDecoder', 'ReadableStream', 'WritableStream', 'DataView', 'Uint8Array', 'ArrayBuffer', 'JSON', 'Math', 'Date', 'Promise', 'Error', 'console', 'performance', 'globalThis', 'AbortController'],
|
|
},
|
|
format: {
|
|
comments: false,
|
|
},
|
|
module: true,
|
|
});
|
|
|
|
if (result.error) {
|
|
console.error('Terser error:', result.error);
|
|
process.exit(1);
|
|
}
|
|
|
|
// 写入输出文件
|
|
fs.writeFileSync('破皮版workers.js', result.code, 'utf8');
|
|
|
|
const originalSize = Buffer.byteLength(fs.readFileSync('workers.js', 'utf8'), 'utf8');
|
|
const outputSize = Buffer.byteLength(result.code, 'utf8');
|
|
|
|
console.log(`Original size: ${(originalSize / 1024).toFixed(1)} KB`);
|
|
console.log(`Obfuscated size: ${(outputSize / 1024).toFixed(1)} KB`);
|
|
console.log(`Compression ratio: ${((1 - outputSize / originalSize) * 100).toFixed(1)}%`);
|
|
console.log('Done! Output: 破皮版workers.js');
|
|
}
|
|
|
|
obfuscate().catch(err => {
|
|
console.error('Error:', err);
|
|
process.exit(1);
|
|
});
|