ryanbr / fanboy-adblock

334 stars 57 forks source link

[porn] theboys.be/ unblock? NeverBlock script #436

Closed shlipp closed 6 years ago

shlipp commented 6 years ago

List the website(s) you're having issues:

every video page

What happens?

an unblockable image is shown leaving CSS hiding

this script is revealed by web inspector


/**
 * NeverBlock
 *
 * Version 2.14
 * Copyright (C) 2016 EXADS
 */

var ExoLoader = (function () {
    var version = '2.14';

    var setCookie = function (name, value, minutes_ttl) {
        var exdate = new Date();
        exdate.setMinutes(exdate.getMinutes() + minutes_ttl);
        var c_value = encodeURI(value) + "; expires=" + exdate.toUTCString() + "; path=/";
        document.cookie = name + "=" + c_value;
    };

    var URLToArray = function(url) {
        var request = {};
        var pairs = url.substring(url.indexOf('?') + 1).split('&');
        for (var i = 0; i < pairs.length; i++) {
            if(!pairs[i])
                continue;
            var pair = pairs[i].split('=');
            request[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
        }
        return request;
    };

    var openLink = function (event, dest) {
        if ( typeof(event) != "undefined" ) {
            event.returnValue = false;
            if ( event.preventDefault ) {
                event.preventDefault();
            }
            event.stopPropagation();
        }
        var url_parts = dest.split('?', 2);
        var parameters = URLToArray(url_parts[1]);
        var f = document.createElement("form");
        f.setAttribute("action", url_parts[0]);
        f.setAttribute("method", "post");
        f.setAttribute("target", "_blank");
        document.getElementsByTagName("body").item(0).appendChild(f);
        for (var i in parameters) {
            var input = document.createElement("input");
            input.setAttribute("type", "hidden");
            input.setAttribute("name", i);
            input.setAttribute("value", parameters[i]);
            f.appendChild(input);
        }
        f.submit();
        document.getElementsByTagName("body").item(0).removeChild(f);
        return false;
    };

    var stylesheet = "{ border: 0px solid #000000; width: %width%px; height: %height%px; display: inline-block; background-color: rgba(0, 0, 0, 0); margin: 0px 0px; padding: 0px 0px; }";
    var ad_types = ['banner', 'popunder'];
    var zone_params = {};
    var dom = {};
    var debug_messages = [];
    var error_messages = [];

    var addDebugMessage = function (message) {
        var date = new Date();
        debug_messages.push(date.toISOString() + ": " + message);
    };
    var addErrorMessage = function (message) {
        var date = new Date();
        error_messages.push(date.toISOString() + ": " + message);
        console.error(message);
    };

    var stringify = function (value) {
        var reassign_when_finished = false;
        if (typeof Array.prototype.toJSON !== 'undefined') {
            reassign_when_finished = true;
            var array_to_json = Array.prototype.toJSON;
            delete Array.prototype.toJSON;
        }
        var val = JSON.stringify(value);
        if (reassign_when_finished) {
            Array.prototype.toJSON = array_to_json;
        }
        return val;
    };

    var randStr = function (length, possibleChars)
    {
        var text = "";
        var possible = possibleChars || "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

        for( var i=0; i < length; i++ )
            text += possible.charAt(Math.floor(Math.random() * possible.length));

        return text;
    };

    var createStyle = function (doc, dom_anchor, style_text)
    {
        var class_name = randStr(1,"abcdefghijklmnopqrstuvwxyz") + randStr(7);
        style_text = "." + class_name + " " + style_text;
        var style = doc.createElement('style');
        style.setAttribute('type', 'text/css');
        style.innerHTML = style_text;
        dom_anchor.parentNode.insertBefore(style, dom_anchor);
        return class_name;
    };

    var loader = {
        cookie_name: "exo_zones",
        addZone: function(params) {
            if (typeof exo99HL3903jjdxtrnLoad != "undefined" && exo99HL3903jjdxtrnLoad) {
                return false;
            }
            if (typeof params != 'object'
                || typeof params.type == 'undefined'
                || ad_types.indexOf(params.type) == -1
            ) {
                addErrorMessage("addZone() invalid params");
                return false;
            }
            var doc = params.doc || document;
            var scripts = doc.getElementsByTagName('script');
            // The current <script> tag where the method is called
            var here = scripts[ scripts.length - 1 ];

            var type = params.type;
            delete params.type;
            if (typeof zone_params[type] == 'undefined') {
                dom[type] = [];
                zone_params[type] = [];
            }

            zone_params[type].push(params);

            if (type == 'banner') {
                var style_text = stylesheet.replace('%width%', params.width)
                    .replace('%height%', params.height);
                var class_name = createStyle(doc, here, style_text);

                var placeholder = doc.createElement('div');
                placeholder.setAttribute('class', class_name);
                here.parentNode.insertBefore(placeholder, here);
                dom[type].push({'placeholder': placeholder, 'doc_reference': doc});
            }

            addDebugMessage("addZone() " + type + " " + params.idzone + " added");
            return true;
        },
        renderBannerZone: function (id, img_data, dest) {
            var idzone = zone_params['banner'][id]['idzone'];
            addDebugMessage("renderBannerZone() #" + id + " called for zone " + idzone);
            if (typeof dom['banner'][id] == 'undefined'
                || typeof img_data != 'object'
                || typeof img_data.img == 'undefined'
                || typeof img_data.content_type == 'undefined'
                || typeof dest == 'undefined'
            ) {
                addErrorMessage("renderBannerZone() #" + id + " corrupt params for zone " + idzone);
                return false;
            }
            if (
                typeof dom['banner'][id]["doc_reference"] == 'undefined' ||
                typeof dom['banner'][id]["doc_reference"].body == 'undefined' ||
                !dom['banner'][id]["doc_reference"].body.contains(dom['banner'][id]['placeholder'])
            ) {
                addErrorMessage("renderBannerZone() #" + id + " dom placeholder is not present for zone " + idzone);
                return false;
            }
            var style_text = "{ background-image: url('data:" + img_data.content_type + ";base64," + img_data.img + "'); background-repeat: no-repeat; cursor: pointer; }";
            var class_name = createStyle(dom['banner'][id]["doc_reference"], dom['banner'][id]['placeholder'], style_text);
            var current_class = dom['banner'][id]['placeholder'].getAttribute('class');
            dom['banner'][id]['placeholder'].setAttribute('class', current_class + " " + class_name);
            dom['banner'][id]['placeholder'].onclick = (function(dest) {
                return function(event) {
                    openLink(event, dest);
                };
            })(dest);
        },
        renderBannerZones: function (response) {
            addDebugMessage("renderBannerZones() called");
            if (typeof response != 'object'
                || typeof response.zones != 'object'
                || typeof response.images != 'object'
            ) {
                addDebugMessage("renderBannerZones() empty zones or images");
                return;
            }
            for (var i = 0; i < response.zones.length; i++) {
                if (typeof zone_params['banner'][i] == 'undefined' ||
                    typeof zone_params['banner'][i]['idzone'] == 'undefined'
                ) {
                    addErrorMessage("renderBannerZones() zone info missing");
                }
                var idzone = zone_params['banner'][i]['idzone'];
                if (response.zones[i] == false) {
                    addDebugMessage("renderBannerZones() nothing to show for zone " + idzone);
                    continue;
                }
                var img_key = response.zones[i].img_key;
                this.renderBannerZone(i, response.images[img_key], response.zones[i].dest);
            }
        },
        serve: function(params) {
            if (typeof exo99HL3903jjdxtrnLoad != "undefined" && exo99HL3903jjdxtrnLoad) {
                addDebugMessage("serve() ad blocker not enabled");
                return false;
            }
            var zones_added = false;
            for (var type_index = 0; type_index < ad_types.length; type_index++) {
                if (typeof zone_params[ad_types[type_index]] !== 'undefined' && zone_params[ad_types[type_index]].length > 0) {
                    zones_added = true;
                    break;
                }
            }
            if (!zones_added) {
                addErrorMessage("serve() called but no zones added");
                return false;
            }
            window.exoNoExternalUI38djdkjDDJsio96 = true;
            addDebugMessage("serve() called");
            setCookie(this.cookie_name, stringify(zone_params), 5);
            var loadDataScript = function () {
                var dataScript = document.createElement("script");
                dataScript.async = true;
                dataScript.setAttribute('type', 'text/javascript');
                dataScript.setAttribute('src', params.script_url);
                dataScript.onload = function(){
                    addDebugMessage("serve() hosted script loaded");
                };
                document.getElementsByTagName("body").item(0).appendChild(dataScript);
            };
            if (!params.force) {
                if (window.addEventListener) {
                    window.addEventListener("load", loadDataScript, false);
                } else if (window.attachEvent) {
                    window.attachEvent("onload", loadDataScript);
                } else {
                    window.onload = loadDataScript;
                }
            } else {
                loadDataScript();
            }
            return true;
        },
        getDebug: function() {
            for (var i = 0; i < debug_messages.length; i++) {
                console.log(debug_messages[i]);
            }
        },
        getVersion: function() {
            return version;
        }
    };

    return loader;
})();

List Subscriptions you're using:

default s set test firefox profile

Other details:

shlipp commented 6 years ago

<script async="" type="text/javascript" src="/nvrbl/bcknd_tblder.php"></script>

but the divs are random kode

This mostly works ||theboys.be/nvrbl/frtnd_tbldr.js$script,first-party

how do I block data uri on specific sties?

smed79 commented 6 years ago

@ryanbr You can add it as a generic /nvrbl/* to exads filters .