// Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . package nodes import ( "net/http" ) // serveWAFLoader 提供 WAF Loader JavaScript 文件 func (this *HTTPRequest) serveWAFLoader() { loaderJS := `(function() { 'use strict'; // 全局队列与执行器 window.__WAF_Q__ = window.__WAF_Q__ || []; if (!window.__WAF_LOADER__) { window.__WAF_LOADER__ = { executing: false, execute: function() { if (this.executing) { return; } this.executing = true; var self = this; var queue = window.__WAF_Q__ || []; var runNext = function() { if (!queue.length) { self.executing = false; return; } var item = queue.shift(); executeDecryptedCode(item.p, item.m, runNext); }; runNext(); } }; } // 1. XOR 解码为字符串(不压缩,避免顺序问题) function xorDecodeToString(b64, key) { try { var bin = atob(b64); var out = new Uint8Array(bin.length); for (var i = 0; i < bin.length; i++) { out[i] = bin.charCodeAt(i) ^ key.charCodeAt(i % key.length); } if (typeof TextDecoder !== 'undefined') { return new TextDecoder().decode(out); } var s = ''; for (var j = 0; j < out.length; j++) { s += String.fromCharCode(out[j]); } return s; } catch (e) { console.error('WAF Loader: xor decode failed', e); return ''; } } // 2. XOR 解密 function decryptXOR(payload, key) { try { var binary = atob(payload); var output = []; var keyLen = key.length; if (keyLen === 0) { return ''; } for (var i = 0; i < binary.length; i++) { var charCode = binary.charCodeAt(i) ^ key.charCodeAt(i % keyLen); output.push(String.fromCharCode(charCode)); } return output.join(''); } catch (e) { console.error('WAF Loader: Decrypt failed', e); return ''; } } // 3. 执行解密后的代码 function executeDecryptedCode(cipher, meta, done) { var finish = function() { if (typeof done === 'function') { done(); } }; try { if (!cipher || !meta || !meta.key) { console.error('WAF Loader: Missing cipher or meta.key'); finish(); return; } if (meta.alg !== 'xor') { console.error('WAF Loader: Unsupported alg', meta.alg); finish(); return; } // 1. XOR 解码为字符串 var plainJS = xorDecodeToString(cipher, meta.key); if (!plainJS) { console.error('WAF Loader: XOR decode failed'); finish(); return; } // 2. 执行解密后的代码(同步) try { // 使用全局 eval,尽量保持和