Реверс-инжиниринг антиблокировщика рекламы BlockAdBlock

Original author: Hugo Elhaj-Lahsen
  • Translation
Если вы пользуетесь блокировщиками рекламы, то могли встречать BlockAdBlock. Этот скрипт обнаруживает ваш блокировщик и не пускает на сайт, пока вы его не отключите. Но мне стало интересно, как он работает. Как антиблокировщик обнаруживает блокировщики? А как на это реагируют блокировщики и как они блокируют антиблокировщики?

История реверс-инжиниринга


Первым делом я взглянул на их сайт. BlockAdBlock предлагает конфигуратор с настройками: интервал ожидания и как будет выглядеть предупреждение, генерируя разные версии скрипта.

Это натолкнуло меня на мысль о версиях. А что, если мог посмотреть не на одну версию, а на все сразу? Так я и сделал. Я вернулся назад во времени с помощью Wayback Machine. После этого скачал все версии BlockAdBlock и хэшировал их.

Список всех версий BlockAdBlock, с sha1sum


6d5eafab2ca816ccd049ad8f796358c0a7a43cf3  20151007203811.js
065b4aa813b219abbce76ad20a3216b3481b11bb  20151113115955.js
d5dec97a775b2e563f3e4359e4f8f1c3645ba0e5  20160121132336.js
8add06cbb79bc25114bd7a2083067ceea9fbb354  20160318193101.js
8add06cbb79bc25114bd7a2083067ceea9fbb354  20160319042810.js
8add06cbb79bc25114bd7a2083067ceea9fbb354  20160331051645.js
8add06cbb79bc25114bd7a2083067ceea9fbb354  20160406061855.js
8add06cbb79bc25114bd7a2083067ceea9fbb354  20160408025028.js
555637904dc9e4bfc6f08bdcae92f0ba0f443ebf  20160415083215.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20161120215354.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20170525201720.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20170606090847.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20170703211338.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20170707211652.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20170813090718.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20170915094808.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20171005180631.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20171019162109.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20171109101135.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20171127113945.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20171211042454.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20171227031408.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20180202000800.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20180412213253.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20180419060636.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20180530223228.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20180815042610.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20181029233809.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20181122190948.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20181122205748.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20190324081812.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20190420155244.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20190424200651.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20190903121933.js
d8986247cad3bbc2dd92c3a2a06ac1540da6b286  20200112084838.js

Только шесть версий отличаются друг от друга, а последняя из них относится к 2016 году, хотя некоторые сайты и сейчас используют BlockAdBlock. Это отлично, потому что нам достаточно будет провести реверс-инжиниринг единственной версии, а потом отреверсить диффы. Спойлер: мы увидим развитие идей и даже остатки отладочного кода.

Все версии я выложил на GitHub. Если хотите посмотреть на диффы, то в этом репозитории каждый коммит представляет собой новую версию.

Распаковка


Код скрипта не минифицирован, а упакован JS-упаковщиком от Дина Эдвардса с косметическими изменениями и без какой-либо модификации логики1.

eval(function(p, a, c, k, e, d) {
    e = function(c) {
        return (c < a ? '' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))
    };
    if (!''.replace(/^/, String)) {
        while (c--) {
            d[e(c)] = k[c] || e(c)
        }
        k = [function(e) {
            return d[e]
        }];
        e = function() {
            return '\\w+'
        };
        c = 1
    };
    while (c--) {
        if (k[c]) {
            p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c])
        }
    }
    return p
}('0.1("2 3 4 5 6 7 8\'d. 9, h? a b c d e f g");i j=\'a\'+\'k\'+\'e\'+\'l\'+\'n\'+\'m\'+\'e\';',24,24,
'console|log|This|code|will|get|unpacked|then|eval|Cool||||||||huh|let|you|w|s||o'.split('|'),0,{}))

К счастью, для нас это не проблема. Слабость упаковщика заключается в том, что весь код при распаковке передаётся в eval(). Если мы заменим eval() на что-то вроде console.log(), то внезапно получаем весь исходный код, и упаковщик побеждён2.

Проделав это для каждой версии, мы можем изучить каждую из них и посмотреть, какие функции туда добавлялись со временем.

v1: ? − ноябрь 2015 года: начальный скрипт


Исходный код

Начнём с изучения 20151007203811.js, опубликованного около ноября 2015 года3. Хотя эта первая версия не очень хорошо блокирует блокировщики, но позволяет оценить архитектуру BlockAdBlock без мусора, который накопился с годами.

Архитектура


В трёх предложениях:

  • BlockAdBlock — это замыкание, возвращающее объект с тремя функциями:
    • bab() выставляет приманку и вызывает проверку check
    • check() проверяет, заблокировал ли блокировщик приманку, вызывая arm
    • arm() накладывает оверлей
  • Точка входа bab() затем запускается через заданное количество времени.
  • Генерируются три функции с аргументами, которые задаются в конфигураторе BlockAdBlock.

Код строится вокруг замыкания, назначенного глобальному объекту со случайным именем.

var randomID = '',
    e = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for (var i = 0; i < 12; i++) randomID += 
    e.charAt(Math.floor(Math.random() * e.length));
var setTimeoutDelay = 7; // Delay after which to call BlockAdBlock
window['' + randomID + ''] = ...

Автор предусмотрел тщательную рандомизацию, чтобы обойти статическую блокировку.

Затем возвращается объект с тремя функциями: bab, check и arm.

window['' + randomID + ''] = (function() {
    var eid = ...
    return {
        bab: function(check, passed_eid) {},
        check: function(checkPredicate, unused) {},
        arm: function() {}
    }
})();

Это мои собственные названия. Все переменные минифицированы, а некоторые специально обфусцированы.
Точка входа bab() вызывается через setTimeout().

setTimeout('window[\'\' + randomID + \'\'] \
.bab(window[\'\' + randomID + \'\'].check, \
     window[\'\' + randomID + \'\'].bab_elementid)', setTimeoutDelay * 1000)

bab_elementid не используется ни в одной версии кода. setTimeout передаётся в виде строки.

У замыкания есть внешние переменные. Две из них служат для сохранения состояния в скрипте:

  • adblockDetected равен 1, если обнаружен блокировщик рекламы.
  • nagMode — это вариант настройки. Если он установлен, то скрипт не блокирует доступ к странице, а только поворчит на вас один раз.

Другие переменные для управления внешним видом и поведением устанавливаются в конфигураторе.

var eid = ' ad_box', // Name of the bait.
    __u1 = 1, // Unused.

    // Colors for the blockadblock prompt.
    overlayColor = '#EEEEEE',
    textColor = '#777777',
    buttonBackgroundColor = '#adb8ff',
    buttonColor = '#FFFFFF',

    __u2 = '', // Unused.

    // Text to display when the blockadblock prompt is shown.
    welcomeText = 'Sorry for the interruption...',
    primaryText = 'It looks like you\'re using an ad blocker. That\'s okay.  Who doesn\'t?',
    subtextText = 'But without advertising-income, we can\'t keep making this site awesome.',
    buttonText = 'I understand, I have disabled my ad blocker.  Let me in!',

    // If 1, adblock was detected.
    adblockDetected = 0,
    // If 1, BlockAdBlock will only nag the visitor once, rather than block access.
    nagMode = 0,

    // The blockadblock domain, reversed.
    bab_domain = 'moc.kcolbdakcolb';

bab_domain устанавливается здесь в попытке обфусцировать домен BlockAdBlock.

bab: создание баннера-приманки


Основной метод работы BlockAdBlock заключается в создании «приманки» или «наживки» из рекламных элементов, которые выглядят как настоящие баннеры. Затем он проверяет, заблокировал ли их блокировщик.

Создаётся приманка: фальшивый div, который притворяется рекламой, но скрыт из виду.

bab: function(check, passed_eid) {
    // Wait for the document to be ready.
    if (typeof document.body == 'undefined') {
        return
    };

    var delay = '0.1', 
        passed_eid = eid ? eid : 'banner_ad',
        bait = document.createElement('DIV');
        
    bait.id = passed_eid;
    bait.style.position = 'absolute';
    bait.style.left = '-999px';
    bait.appendChild(document.createTextNode(' '));
    document.body.appendChild(bait);
    ...

Видимо, passed_eid предназначен для настройки идентификатора приманки, но он не используется.

После этого проверяется, была ли наживка удалена рекламным блоком.

    ...
    setTimeout(function() {
        if (bait) {
            check((bait.clientHeight == 0), delay);
            check((bait.clientWidth == 0), delay);
            check((bait.display == 'hidden'), delay);
            check((bait.visibility == 'none'), delay);
            check((bait.opacity == 0), delay);
            check((bait.left < 1000), delay);
            check((bait.top < 1000), delay)
        } else {
            check(true, delay)
        }
    }, 125)
}

Если приманка больше не существует, то элемент удалён (и мы запускаем оверлей).

Функция check сработает, если Predicate возвращает значение true, и запускает arm.

check: function(checkPredicate, unused) {
    if ((checkPredicate) && (adblockDetected == 0)) {
        adblockDetected = 1;
        window['' + randomID + ''].arm()
    } else {}
}

Поскольку проверка check срабатывает несколько раз, как показано выше, adblockDetected настроен на первую правильную проверку, чтобы избежать многократного срабатывания arm.

Режим ворчания


В скрипте есть функция под названием «режим ворчания» (nag mode): в этом режиме BlockAdBlock только один раз скажет отключить блокировщик рекламы, но не будет блокировать вас при каждом посещении. Это делается путём установки элемента localStorage при первом посещении.

Если бы мы могли сами установить этот элемент, то могли бы мы отключить блокиратор навсегда? К сожалению, BlockAdBlock заранее проверяет, был ли скрипт настроен на режим nag, поэтому такой способ не сработает, когда он работает в режиме по умолчанию, то есть с блокировкой доступа.

arm: function() {
    if (nagMode == 1) {
        var babNag = sessionStorage.getItem('babn');
        if (babNag > 0) {
            return true // Stop the script.
        } else {
            sessionStorage.setItem('babn', (Math.random() + 1) * 1000)
        }
    };
    ...

К сожалению, nagMode устанавливается в конфигураторе, а по умолчанию равен 0.

Блокировка BlockAdBlock, версия 1


Блокировщики рекламы используют так называемые фильтры: строки кода, которые могут блокировать сетевые запросы и скрывать элементы на странице. Создавая элементы «наживки», BlockAdBlock специально запускает эти фильтры.

С помощью такой простой защиты BlockAdBlock эффективен против всех основных блокировщиков рекламы, таких как uBlock Origin, AdBlock Plus и Ghostery. Чтобы противостоять этому, мы должны написать собственный фильтр, который активизируется только на сайтах, на которых работает BlockAdBlock.

Писать фильтры для блокировщика немного сложновато. Нам нужен фильтр контента, который блокирует элементы на странице, сгенерированной после загрузки. Поскольку у наживки идентификатор banner_ad, мы создаём исключение для скрытия элементов с пометкой #@# для всех элементов # с идентификатором banner_ad и помещаем его в список пользовательских фильтров нашего блокировщика.

В итоге получается следующее:

localhost#@# #banner_ad

У меня тут localhost для демонстрации, вы можете заменить его своим URL.

Это успешно дезактивирует BlockAdBlock. Решение может показаться простым, но оно уже давно успешно работает в списке фильтров Anti-AdBlock-Killer.

Версия 2 (ноябрь 2015 − январь 2016): несколько улучшений


Исходный код
Разница v1/v2

Создание приманки: меньше багов


В первой версии создания приманки есть тонкая ошибка: у созданного div нет контента, поэтому генерируется div с высотой 0 и шириной 0. Позже код проверяет, удалён ли div, проверяя его высоту и ширину. Но поскольку у него была нулевая высота, то BlockAdBlock срабатывал всегда 4.

Исправлена ошибка пустого div.

bab: function(...) {
    bait = document.createElement('DIV');
    ...
    bait.appendChild(document.createTextNode('Â '));

Создаётся дочерний div с некоторым содержимым.

Обнаружение блокировщиков через поддельные графические баннеры


В этом методе мы создаём поддельное изображение со случайным именем на doubleclick.net. Блокировщики рекламы будут блокировать изображение, думая, что это рекламный баннер. Но это не требует никаких изменений в нашем фильтре.

bab: function(...) {
    bait = document.createElement('DIV');
    bait.innerHTML = '<img src="http://doubleclick.net/' + randomStr() + '.jpg">';
    ...

randomStr() генерирует строку произвольной длины.

Другим заметным отличием стало использование таймера setInterval вместо простой однократной проверки, установлен ли триггер. Он заново проверяет, отображается ли графический баннер и не изменён ли его атрибут src, проверяя содержимое приманки.

Новый setInterval и проверка на наличие изображения:

    ...
    checkCallback = setInterval(function() {
        if (bait) {
            check((bait.clientHeight == 0), delay);
            check((bait.clientWidth == 0), delay);
            check((bait.display == 'hidden'), delay);
            check((bait.visibility == 'none'), delay);
            check((bait.opacity == 0), delay);
            try {
                check((document.getElementById('banner_ad').innerHTML.indexOf('click') == -1), delay)
            } catch (e) {}
        } else {
            check(true, delay)
        }
    }, 1000

Почему indexof ('click')? Потому что источник изображения src="doubleclick.net/abcdefg.jpg" и мы проверяем, сохранился ли фрагмент строки click.

Версия 3 (ноябрь 2015 − март 2016): обобщённая приманка


Исходный код
Разница v2/v3

Создание приманки: рандомизированные идентификаторы


Единственное изменение в этой версии, хотя и значительное, — появление рандомизированных идентификаторов для приманки. Новый идентификатор берётся из списка идентификаторов при загрузке страницы и используется для приманки, которая теперь помещается в середине страницы.

Длинный список случайных идентификаторов демонстрирует хорошее знание предметной области.

var baitIDs = [
  "ad-left",
  "adBannerWrap",
  "ad-frame",
  "ad-header",
  "ad-img",
  "ad-inner",
  "ad-label",
  "ad-lb",
  "ad-footer",
  "ad-container",
  "ad-container-1",
  "ad-container-2",
  "Ad300x145",
  "Ad300x250",
  "Ad728x90",
  "AdArea",
  "AdFrame1",
  "AdFrame2",
  "AdFrame3",
  "AdFrame4",
  "AdLayer1",
  "AdLayer2",
  "Ads_google_01",
  "Ads_google_02",
  "Ads_google_03",
  "Ads_google_04",
  "DivAd",
  "DivAd1",
  "DivAd2",
  "DivAd3",
  "DivAdA",
  "DivAdB",
  "DivAdC",
  "AdImage",
  "AdDiv",
  "AdBox160",
  "AdContainer",
  "glinkswrapper",
  "adTeaser",
  "banner_ad",
  "adBanner",
  "adbanner",
  "adAd",
  "bannerad",
  " ad_box",
  " ad_channel",
  " adserver",
  " bannerid",
  "adslot",
  "popupad",
  "adsense",
  "google_ad",
  "outbrain-paid",
  "sponsored_link"
];

Случайная генерация идентификаторов


    randomBaitID = baitIDs[ Math.floor(Math.random() * baitIDs.length) ],
    ...
    var passed_eid = randomBaitID;
    bait = document.createElement('DIV');    
    bait.id = passed_eid;

Поскольку это cрабатывает на каждой загрузке, идентификатор будет каждый раз отличаться.

Блокировка BlockAdBlock, версии с третьей до последней


BlockAdBlock эксплуатирует слепое пятно блокировщиков рекламы: если фильтр пропустит все вышеперечисленные идентификаторы, то он также пропустит и настоящую рекламу. Таким образом, BlockAdBlock заставляет блокировщик рекламы сделать себя бесполезным.

В блокировщиках мы можем выполнить произвольные скрипты перед загрузкой страницы. Можно попытаться заранее удалить объект BlockAdBlock. Но для этого нам нужно имя объекта BlockAdBlock, которое рандомизируется при каждом запуске.

uBlock Origin применил другой подход. Поскольку код выполняется функцией eval, мы можем определить собственную функцию eval, которая будет блокировать выполнение, если мы обнаружим BlockAdBlock. В JS на такое способен объект Proxy: можно заменить любое свойство и метод в любом объекте.

Это можно обойти, не пропуская начальную полезную нагрузку BlockAdBlock через eval, а используя её напрямую, поэтому мы также проксируем точку входа: вызов setTimeout. Поскольку setTimeout передаётся строкой, а не функцией, мы проверяем эту строку.

Реализация в uBlock Origin (исходный код):

const signatures = [
    [ 'blockadblock' ],
    [ 'babasbm' ],
    [ /getItem\('babn'\)/ ],
    [
        'getElementById',
        'String.fromCharCode',
        'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',
        'charAt',
        'DOMContentLoaded',
        'AdBlock',
        'addEventListener',
        'doScroll',
        'fromCharCode',
        '<<2|r>>4',
        'sessionStorage',
        'clientWidth',
        'localStorage',
        'Math',
        'random'
    ],
];
const check = function(s) {
    // check for signature 
};

Список подписей: определение шаблонов кода. Функция check проверяет строку после eval на соответствие этим шаблонам.

Далее проксируем функции eval и setTimeout.

window.eval = new Proxy(window.eval, {
    apply: function(target, thisArg, args) {
        const a = args[0];
        if ( typeof a !== 'string' || !check(a) ) {
            return target.apply(thisArg, args);
        } 
        // BAB detected: clean up.
        if ( document.body ) {
            document.body.style.removeProperty('visibility');
        }
        let el = document.getElementById('babasbmsgx');
        if ( el ) {
            el.parentNode.removeChild(el);
        }
    }
});
window.setTimeout = new Proxy(window.setTimeout, {
    apply: function(target, thisArg, args) {
        const a = args[0];
        // Check that the passed string is not the BAB entrypoint.
        if (
            typeof a !== 'string' ||
            /\.bab_elementid.$/.test(a) === false
        ) {
            return target.apply(thisArg, args);
        }
    }
});

Поскольку мы теперь используем скриптлет, специальный пользовательский фрагмент кода, выполняемый блокировщиком, фильтр немного меняется:

localhost## +js(nobab)

Он не запускается по умолчанию на всех сайтах из соображений производительности, поэтому его нужно назначить для каждого сайта с помощью скрипта.

Версия 4 (январь 2016 − апрель 2016): экспериментальные функции


Исходный код
Разница v3/v4

Описанный метод блокировки антиблокировщика разработан в январе 2016 года, согласно истории коммитов uBlock Origin, и концептуально не изменился с момента своего создания. BlockAdBlock никогда не пытался обойти этот фильтр, изменив свою архитектуру. Вместо этого он продолжил разработку новых функций. И когда мы переходим на страницу BlockAdBlock, то видим интересную вкладку: «Вам нужна большая мощь антиблокировки?»



Хотя эти защитные методы доступны только через специальную вкладку, они включены во все скрипты и выполняются через переменные с соответствующими названиями. В четвёртой версии реализовано два метода:

  • aDefOne, «специфическая защита для сайтов AdSense»
  • aDefTwo, «особый элемент защиты»

Случайные комментарии отладки


Прежде чем попрощаться с вами, должен упомянуть ещё кое-что. В процессе реверс-инжиниринга моё внимание привлекла одна функция:

Отладочный console.log() прямо в коде!

function consolelog(e) {
    // "Dev mode" check: developpers of BAB must set window.consolelog to 1.
    if (window.consolelog == 1) {
        console.log(e)
    }
};

Это выполняется только в том случае, если установлен глобальный consolelog, например, window.consolelog = 1.

Комментарии отладки доступны только в этой версии. Если бы я не отреверсил все версии, то никогда бы их не заметил. Они дают ценную информацию о том, как работает код.

Продвинутая защита: AdSense


Все эти специальные методы защиты закодированы в check, а не в arm, как предполагает архитектура. Возможно, над продуктом начал работать новый разработчик, не знакомый с кодовой базой.

Если на странице активен AdSense, то мы проверяем наличие объявлений. Если они исчезли из-за блокировщика, то активируется BlockAdBlock.

function check() {
    ...
    var q = 'ins.adsbygoogle',
        // Selects all Google ads in the document.
        adsbygoogleQuery = document.querySelector(q);

    if ((adsbygoogleQuery) && (adblockDetected == 0)) {
        // Ads are not blocked, since the bait ad is still there,
        // and adblockDetected hasn't been set
        if (aDefOne == 'yes') {
            consolelog('case2: standard bait says ads are NOT blocked.');
            var adsbygoogle = '//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js';
            if (scriptExists(adsbygoogle)) {
                consolelog('case2: And Adsense pre-exists.');
                if (adsbygoogleQuery.innerHTML.replace(/\s/g, '').length == 0) {
                    // The ad's content was cleared, so...
                    consolelog('case2: Ads are blocked.');
                    window['' + randomID + ''].arm()
                }
            }
        };
        adblockDetected = 1
    }
    ...

scriptExists проверяет всю страницу на наличие скрипта с заданным URL. В данном случае, скрипта AdSense5.

URL-адрес скрипта сравнивается со всеми скриптами на странице. По какой-то причине URL усекается до 15 символов.

function scriptExists(href) {
    if (href) href = href.substr(href.length - 15);
    var scripts = document.getElementsByTagName('script');
    for (var i = scripts.length; i--;) {
        var src = String(scripts[i].src);
        if (src) src = src.substr(src.length - 15);
        if (src === href) return true
    };
    return false
};

Продвинутая защита: специальный элемент


В отличие от первого, этот метод сопровождается оговоркой: «Пожалуйста, протестируйте после установки, чтобы убедиться в совместимости с вашим сайтом».

Эта специальная защита срабатывает только в том случае, если не обнаружен блокировщик и на странице нет скрипта AdSense. Вот соответствующий фрагмент кода check:

check: function(checkPredicate, unused) {
    if ((checkPredicate) && (adblockDetected == 0)) {
        // Adblocker detected, arm
    } else {
        var q = 'ins.adsbygoogle',
            adsbygoogleQuery = document.querySelector(q);

        if ((adsbygoogleQuery) && (adblockDetected == 0)) {
            if (aDefOne == 'yes') {
                // Special defense one: AdSense defense (see above)
            };
        } else {
            if (adblockDetected == 0) {
                if (aDefTwo == 'yes') {
                    // Special defense two: Special element defense
                }
            }
        }
    }

Метод предполагает, что владельцы сайтов используют только AdSense: если скрипта AdSense не существует, значит, что-то не так.

Зачем было предупреждение? Этот метод пытается включить скрипт AdSense. Если он не загружается, то, скорее всего, блокировщик заблокировал сетевой запрос, поэтому срабатывает BlockAdBlock. Но это может испортить некоторые сайты, отсюда и предупреждение.

Если AdSense не загрузился, то запускается оверлей.

if (aDefTwo == 'yes') {
    /* Add Google ad code to head.
        If it errors, the adblocker must have blocked the connection. */
    var googleAdCode = '//static.doubleclick.net/instream/ad_status.js';
    consolelog('case3: standard bait says ads are NOT blocked. Maybe ???\
      No Adsense is found. Attempting to add Google ad code to head...');
    var script = document.createElement('script');
    script.setAttribute('type', 'text/javascript');
    script.setAttribute('src', googleAdCode);
    script.onerror = function() {
        window['' + randomID + ''].arm()
    };
    adblockDetected = 1;
    if (!scriptExists(googleAdCode)) {
        document.getElementsByTagName('head')[0].appendChild(script)
    };
    adsbygoogleQuery = 0;
    window['' + randomID + ''].check = function() {
        return
    }
}

При сбое на сетевом уровне срабатывает onerror, как при работе блокировщика рекламы.

И действительно, большинство блокировщиков рекламы поддаются на это и блокируют запрос. Но есть один блокировщик, который я ещё не упоминал. Поговорим о браузере Brave.

Ответ браузера Brave


До сих пор мы изучали, как детектируется антиблокировщик в uBlock Origin. И это работает, только требуется определённый фильтр для каждого сайта, где установлен BlockAdBlock. Браузер Brave впечатляет тем, что обнаруживает и обходит BlockAdBlock всех версий без каких-либо необходимых действий со стороны пользователя. Для этого он подделывает запрос непосредственно на сетевом уровне6.

Вместо блокировки запроса ad_status.js он пропускает его, но загружает поддельную рекламу Google Ads размером 0 байт. Этот хитрый трюк дурачит BlockAdBlock, потому что onerror срабатывает только в том случае, если сетевой запрос терпит неудачу.



Версия 5 (март 2016 − ноябрь 2016)


Исходный код
Разница v4/v5

Продвинутая защита: спам фавиконами


Единственное изменение в этой версии заключается в том, что вторую расширенную защиту переписали, хотя она по-прежнему придерживается того же основного принципа: проверка сетевых запросов, которые будут заблокированы блокировщиком. Но теперь вместо AdSense загружаются фавиконы.

Brave уклоняется от этой атаки прежним способом. Он не блокирует запросы, но создаёт поддельные изображения 1×1.

if (aDefTwo == 'yes') {
    if (! window['' + randomID + ''].ranAlready) {/
        var favicons = [
            "//www.google.com/adsense/start/images/favicon.ico",
            "//www.gstatic.com/adx/doubleclick.ico",
            "//advertising.yahoo.com/favicon.ico",
            "//ads.twitter.com/favicon.ico",
            "//www.doubleclickbygoogle.com/favicon.ico"
            ],
            len = favicons.length,
            img = favicons[Math.floor(Math.random() * len)],
        ...
        baitImages(Math.floor(Math.random() * 2) + 1); // creates bait images
        var m = new Image();
        m.onerror = function() {
            baitImages(Math.floor(Math.random() * 2) + 1);
            c.src = imgCopy;
            baitImages(Math.floor(Math.random() * 2) + 1)
        };
        c.onerror = function() {
            adblockDetected = 1;
            baitImages(Math.floor(Math.random() * 3) + 1);
            window['' + randomID + ''].arm()
        };
        m.src = img;
        baitImages(Math.floor(Math.random() * 3) + 1);
        window['' + randomID + ''].ranAlready = true
    };
}

Функция baitImages может вызываться часто, со случайным количеством изображений, чтобы обойти статические блокировщики.

Версия 6 (апрель 2016 − ноябрь 2016): блокировка Brave


Исходный код
Разница v5/v6

Методы BlockAdBlock, хотя и простые на первый взгляд, постепенно становились сложнее и эффективнее. Но остался последний непобеждённый враг: браузер Brave.

Продвинутая защита: определение поддельного фавикона


Почему BlockAdBlock перешёл с попытки загрузить скрипт на загрузку изображений (фавиконов)? Ответ — в коде, который добавлен в защиту через спам фавиконами, и который активируется против защиты Brave.

Проверка ответа на наличие поддельного изображения:

if (aDefTwo == 'yes') {
    baitImages(Math.floor(Math.random() * 3) + 1);
    // earlier favicon code...
    var m = new Image();
    if ((aDefThree % 3) == 0) {
        m.onload = function() {
            if ((m.width < 8) && (m.width > 0)) {
                window['' + randomID + ''].arm()
            }
        }
    };
}

Если размер фавикона меньше 8×8, то это, вероятно, подделка от браузера Brave.

С помощью этого приёма BlockAdBlock обходит маскировку Brave и других блокировщиков, которые запускают этот код (большинство, как uBlock Origin, блокируют его в первую очередь).

После этого обновления, примерно в конце ноября 2016 года, BlockAdBlock исчез из интернета. Хотя их «продвинутые методы защиты» работают, они никогда не были активированы для большинства пользователей. Это было последнее обновление. Последний пост в твиттере и на сайте опубликован где-то в конце 2017 года.

Однако наследие BlockAdBlock живёт. Хотя в наши дни его тривиально заблокировать, этот скрипт по-прежнему используют некоторые современные сайты.

Заключение


Кто победит в гонке вооружений между блокировщиками рекламы и антиблокировщиками, которые блокируют блокировщиков? Только время покажет. По мере развития гонки вооружений антиблокировщикам придётся использовать всё более изощрённые методы и специальный код, как показывает эволюция BlockAdBlock.

С другой стороны, у блокировщиков преимущество стабильных систем и мощных инструментов фильтрации через списки фильтров, а также доступ к JavaScript. С такой системой достаточно, чтобы один человек понял, как победить врага — и обновить список фильтров с новыми сайтами.

Анализируя эволюцию BlockAdBlock, а также различные ответы блокировщиков рекламы, нам удалось нарисовать картину небольшой войны между BlockAdBlock и блокировщиками. В процессе мы узнали, какие методы используются в боевых действиях.

Мой код реверс-инжиниринга опубликован на GitHub. Спасибо вам за чтение.



1. Если хотите получить представление, как это работает, попробуйте вставить приведённый ниже пример в консоль JS, а затем посмотрите на код. Если вас интересует его внутренняя работа, вот исходный код. ︎[вернуться]

2. Не верите? Попробуйте изменить eval на console.log в первой строчке.
[вернуться]

3. Метка времени говорит 201510, так что может быть октябрь. Но мы не знаем, когда изменился скрипт. Всё, что мы знаем:

  • 2015-10 была сохранена одна версия: 20151007203811.js
  • 2015-11 появилась новая версия: 20151113115955.js

Насколько нам известно, скрипт могли изменить за день до второй метки времени. Таким образом, я консервативно подхожу к датировке. ︎[вернуться]

4. Во время исправления этой ошибки были разработаны тесты для v1. ︎[вернуться]

5. Спасибо McStroyer на Reddit, который обратил на это внимание. ︎[вернуться]

6. Компонент блокировщика рекламы Brave открыт, поэтому мы можем посмотреть исходный код, чтобы получить представление о том, как он работает.


Спасибо Франсуа Марье за указание на исходный код Brave. ︎[вернуться]
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 83

    +13
    Я хоть и не js разработчик, но статью прочитал с интересом. Спасибо!
    Я не видел ни одного адекватного сайта, который бы блокировал контент из-за включённого adblock. Адекватные сайты если и детектят, то вместо банера показывают сообщения вроде — 'Здесь была реклама, но Ваш AdBlock её съел :)'(в конце смайлик) Или просят отключить на их сайте, а они покажут маленькую рекламу, при этом не блокируют свой контент.
    Бывают и забавные случаи. Заходил на сайты, на которых контент — это просто сгенерированы ключевые слова или ворованный контент. И они его с включенный adblock не показывают. Но стоит только отключить блокировщик, сразу можно наблюдать у себя на мониторе батл между баннерными сетями, кто больше банеров покажет. Так прикол в том, что одни банеры накладываются на другие стопками, вот это смешно. Только нужно быть осторожным, так как браузер от такого количества «игроков» может просто зависнуть.
      +2
      Скажем оверклокерс.ру (раньше был адекватным, что сейчас — не знаю), без JS не показывает картинки, а с JS и адблоком — ругается и не даёт смотреть статьи нормально.
        +6
        А там сейчас и адекватных статьей то и не осталось. Сайт умер, когда они начали блокировать полностью сайт, если видели блокировщик. Говорят, только форум ещё жив, да и то одной ногой в могиле.
        Большинство ушло к украинскому конкуренту.
        +1
        rp5.ru не показывает погоду с блокировками
          0
          Показывает. uBlock Origin v1.26.2

            0

            На мобильном ФФ не показывает даже с выключенным блокировщиком. Письма игнорят.

            +1
            Приходится подключать TamperMonkey: github.com/StSav012/adblockrules/blob/master/rp5adfix.user.js
              0
              TamperMonkey
              Проприетарен и содержит скрипты аналитики. Лучше подключить Greasemonkey или Violentmonkey.
              +1
              Если добавить в чёрный список
              rp5.ua/scripts/main.016.cr.js
              то их блокировка сломается, и погода будет нормально показываться.
              0
              Я на РБК на него нарывался, а с учетом того, что без адблока смотреть мастерсукю рекламу РБК невозможно, пришлось отказаться, хотя сайт их мне нравился.
                +1

                Тоже про рбк хотел написать.просто помойка из рекламы и автозапуска видео.но на нем поэтому хорошо и тестировать блокировщики

                0
                в rutube есть защита, чтобы посмотреть видео надо ответить на вопрос о чём был рекламный ролик. Т.е. блокировка контента если рекламный ролик был съеден, а юзер не сможет пройти дальше, если блокировщик не настроен на такое
                  0
                  Несколько лет назад Яху не давал юзать почту в браузере, пока не отключишь Адблок: digiday.com/marketing/yahoo-mail-blocking-ad-block-users-accessing-email
                  +18
                  те сайты которые не работают с блокировщиком(не дают просматривать их сайт с включенным у меня блокировщиком рекламы) я просто не посещаю. альтернатива всегда найдется.
                    +1
                    Поддерживаю. Некоторые противники adblock говорят, что adblock — это плохо. Ведь мы забираем «хлеб» у создателей сайта. Ведь создатели сайтов готовят контент и на этом зарабатывают. Но если копнуть глубже, можно убедится, что на таких сайтах владельцы тупо воруют сами статьи с других сайтов.
                      +5

                      Хорошо. А кто платит за создание контента на тех оригинальных, неворованных, сайтах?

                        +4
                        Намного более честный способ — прямой сбор денег. Пожертвования вместо рекламы, платная подписка, создание контента самими пользователями (как на этом же хабре).
                        Львиная доля контента создаётся на сайтах коммерческих компаний, которые зарабатывают на продаже своих продуктов, и часть полученных денег тратят на поддержание площадки. Например, когда производитель софта и железа для чпу-станков заводит форум, для пользователей, где будет общение и поддержка.

                        Приведите пример площадки, которая не может так сделать, и не была изначально создана для заработка на рекламе?
                          +5

                          Да, я согласен, что платная подписка — это альтернатива, к которой уже перешли многие новостные сайты, например New York Times. Но лично для меня мир, в котором на каждом новостном сайте нужно иметь подписку, чтобы прочитать новости — это печально. Да тот же хабр, если ввести платную подписку — как много пользователей останется? Думаю очень мало. А пока хабр все ещё использует рекламу.


                          Я не верю, что возможно иметь качественный новостной контент созданный на чисто добровольной основе людьми в свободное от работы время. Создание такого контента — это полноценная работа.

                            +4
                            Так хабр и не новостной сайт, это площадка для написания статей. И деньги зарабатывает в том числе на платных аккаунтах для компаний.
                            Если подписка на новостные проекты станет платной — это только повысит их качество! Сейчас новостным площадкам чтобы получить больше денег от рекламы выгоднее желтить, хайповать, врать и раздувать новости, так как чем больше горит у читателей, тем больше трафика. А если придётся переходить на платную подписку — то качество контента (адекватность мнений, адекватность содержимого заголовкам итд) станет более важной, так как одно дело зайти на сайт бесплатно на горячий заголовок, и другое дело дать им денег за посещение осознанно.
                            Я только за осознанное посещение, так как иллюзия бесплатности уничтожает контент. До такого засилья рекламы во главу ставилось качество, а не количество и громкость криков.
                            Но лично для меня мир, в котором на каждом новостном сайте нужно иметь подписку, чтобы прочитать новости — это печально.

                            Этот вопрос можно решить подпиской на пачки источников, например через общие платформы — купи пакет подписок, выбери чьи сайты тебе интересны, и читай. Если подача и качество новостей стало херовым — уходи, потеря дохода для издателя станет поводом задуматься.
                              +1

                              То, что вы описываете — это walled garden интернет, где за доступ к любому мало мальски качественному контенту нужно платить. Да, похоже мы к этому и идем, но это сильно отличается от текущего интернета, где мы привыкли что мы можно зайти на любой сайт и читать что хочешь. Будет ли он лучше — я не берусь судить. Не думаю, что всем нравится идея этого нового интернета, где без кредитки не посерфишь.


                              Я согласен, что пользователи должны осознанно понимать, что текущий интернет не бесплатный, а условно-бесплатный где платишь своими глазами. Но не стоит решать за других людей, что платная подписка для них лучше: если вы способны и готовы платить — это не значит что все способны.


                              Про хабр — я не смог найти данных, сколько денег они получают с рекламы, а сколько с платных аккаунтов. Платные корпоративные аккаунты по духу не отличаются от рекламы: я уверен, что есть тонна хабра пользователей, которые скажут, что они не хотят видеть проплаченные статьи в их ленте.

                                +3
                                Но не стоит решать за других людей, что платная подписка для них лучше: если вы способны и готовы платить — это не значит что все способны.

                                Здесь вопрос не в нравится или нет, а в каком случае контент будет более качественным. Получать хайповое говно, раздувание фейковых новостей, главное чтобы бесплатно?..
                                  0
                                  Получать хайповое говно, раздувание фейковых новостей, главное чтобы бесплатно?..
                                  Так оно как раз небесплатно. И в «условно-платном» интернете тоже будет. Потому что люди, разгоняющие истерии разных сортов получают деньги как раз за это, а не за рекламу или что-то ещё.
                                    0
                                    Людям нужно это «хайповое говно» и «раздувание фейковых новостей». К вашему сведению, гороскопы и новости вроде «толпа избила мужика» даже у самых крупных сми являются наиболее читаемыми типами новостей) А также, я лично знаком с людьми, которые любят просматривать рекламу с этих мигающих баннеров, типа «пугачева рассказала про это...» и такая реклама приносит больше всего трафика в современном интернете :)
                                      0
                                      А также, я лично знаком с людьми, которые любят просматривать рекламу с этих мигающих баннеров, типа «пугачева рассказала про это...» и такая реклама приносит больше всего трафика в современном интернете :)
                                      Ну то такое. В конечном итоге нужен же не траффик, а деньги. Но пока деньги, в основном, у людей, читающих новости типа «пугачева рассказала про это...» — никакая подписка ничего не изменит.

                                      Но не факт, что мир, где денег у этой «толпы идиотов» просто нет, вообще может существовать: когда 90% населения, извините, нечего жрать, они тупо 10% «слишком умных» «затопчут»… а если деньги у них будут — то вокруг них и будет вся индустрия крутится.
                                        +1
                                        Про каких умных и про каких идиотов вы говорите? Кликая по такой рекламе человек становится идиотом по вашему? :) А что, если человеку просто нечем заняться и он просто балуется? «Лишь ситхи возводят все в абсолют»
                                          0
                                          А что, если человеку просто нечем заняться и он просто балуется?
                                          Если «человеку нечем заняться и он просто балуется», то, очевидно, денег он никому платить не будет и, соотвественно, реклама со временем отомрёт.

                                          Вся эта конструкция — многоуровневая и и сложная, но откуда в системе берутся деньги? Подумате над этим.
                                            0
                                            Чего тут думать? Я лично присутствовал при обсуждении, на котором было решено ставить на сайт подобную рекламу, если у человека включен адблок. И да, она приносила по 14000 рублей в самый плохой день с одного рекламного блока, потому что там показывались трешовые новости с других агрегаторов, которые платили за показы и клики)
                                              0
                                              И да, она приносила по 14000 рублей в самый плохой день с одного рекламного блока, потому что там показывались трешовые новости с других агрегаторов, которые платили за показы и клики)
                                              Это всё прекрасно, но откуда эти деньги брались у других агрегаторов? Где изначальный источник?

                                              Очевидно что где-то, в конце цепочки, должен быть «лох, которого разводят». А это значит что:
                                              1. Его таки можно развести (то есть он таки лох).
                                              2. У него есть деньги (в противном случае разводи, не разводи, всё бесполезно).

                                              В его отсуствие все эти трешовые новости будет некому ни писать, ни читать.
                                        0
                                        это уже проблема качества населения и её ничем, кроме улучшения образования, не решить
                                          +1
                                          Воду заряжало перед телевизором население «с хорошим советским образованием».

                                          Так что нет, тут проблема сложнее.
                                            0
                                            начинается
                                            нет, воду заряжало как раз население с плохим образованием, ведь «если вам дали образование, это ещё не значит, что вы его получили»
                                            «половина смотрели кашпировского, другая — чумака» — просто часть мифологии
                                            конечно, проблема сложнее, образование — это не только школы и ВУЗы
                                              0
                                              нет, воду заряжало как раз население с плохим образованием, ведь «если вам дали образование, это ещё не значит, что вы его получили»
                                              В данном случае это непринципиально. Важно, что люди «с плохим образованием» смогли начать вот всё это показывать прямо по центральному телевидению, по одному из всего двух каналов. А значит подход «давайте дадим людям образование и они научатся различать фейки» — не сработал. От слова совсем.

                                              Мы ведь обсуждаем то, людям нужно это «хайповое говно» и «раздувание фейковых новостей», а не качество советского образования в принципе.

                                              Если вы можете создать хорошее образование, но не можете заставить людей его получить («если вам дали образование, это ещё не значит, что вы его получили»), то образование — решением проблемы не является.
                                                0
                                                Мы ведь обсуждаем то, людям нужно это «хайповое говно» и «раздувание фейковых новостей», а не качество советского образования в принципе.

                                                это вы решили обсудить качество советского образования, не знаю, зачем
                                                мой тезис был «качество населения можно улучшить образованием», вы пытаетесь его оспорить странными методами

                                                например, вот это
                                                Важно, что люди «с плохим образованием» смогли начать вот всё это показывать прямо по центральному телевидению

                                                откуда взялось?
                                                ненашев, председатель гостелерадио, говорил, что довольно быстро кашпировского сняли, по причине как раз явной бредовости затеи
                                                конечно, «у каждого свои недостатки», кто бы спорил

                                                А значит подход «давайте дадим людям образование и они научатся различать фейки» — не сработал. От слова совсем

                                                бросайте вот эту вот излишнюю категоричность, особенно в настолько очевидных случаях
                                                сколько людей смотрели кашпировского и чумака?
                                                я считаю, что процентов 10-15, не больше
                                                вы же не станете сейчас мне доказывать несущественность отрицательной корреляции между уровнем образования и религиозностью, например?

                                                Если вы можете создать хорошее образование, но не можете заставить людей его получить («если вам дали образование, это ещё не значит, что вы его получили»), то образование — решением проблемы не является.

                                                является, я вам намекнул на пробел в вашей аргументации — «образование — это не только школы и ВУЗы»
                                    0
                                    Эти вездесущие подписки хуже рекламы, задолбали. Не настраиваются и не учитывают, насколько активно я использую ресурс, плати за красивые глаза даже если месяц не пользовался.
                                    +1
                                    Но лично для меня мир, в котором на каждом новостном сайте нужно иметь подписку, чтобы прочитать новости — это печально.

                                    В доцифровые времена так и было — приходилось подписываться или покупать каждую интересную газету отдельно
                                      0

                                      И мы хотим вернуться в те времена? Отказаться от открытого интернета?

                                        0
                                        вы так говорите, как будто надо обязательно выбрать между двумя моделями
                                          0

                                          В целом да. Эти две модели — основные жизнеспособные модели на сегодняшний день. Если кто-то придумает третью модель, без недостатков рекламы и подписки — я буду только за.

                                            0
                                            я, наверное, неправильно выразился, перефразирую — вам не предлагается выбирать только между бесплатным интернетом с рекламной или только подписочным, они вполне сосуществуют прямо сейчас, причём в куче разных вариаций
                                              0

                                              Сейчас они сосуществуют. В тоже время подавляющее большинство пользователей, по крайней мере на хабре, рекламу не любят и хотят чтобы ее не существовало. И я пытаюсь представить как такой мир без рекламы будет выглядеть. Поэтому я пошел в крайность, где за любой мало мальский хороший контент надо платить подпиской.

                                                0
                                                да, об этом я и сказал — нет никакой необходимости в крайностях
                                                всегда будет хороший бесплатный контент, как он есть и сейчас
                                                количество под вопросом, да, но всегда будет достаточно, потому что в любой области есть люди, готовые просто поделиться информацией, а интернет позволяет сделать это любому
                                    0
                                    Приведите пример площадки, которая не может так сделать, и не была изначально создана для заработка на рекламе?
                                    Лучше приведите пример площадки, где вы можете найти оригинальный контент и которая бы «не была изначально создана для заработка на рекламе».

                                    Подсказка: таковые в природе существуют — но их количество ничтожно.

                                    Пожертвования вместо рекламы, платная подписка, создание контента самими пользователями (как на этом же хабре).
                                    Вот только сам по себе этот контент кусок хлеб с маслом на стол не доставит. А каков процент завсегдатев хабра захочет за его посещение платить?

                                    Например, когда производитель софта и железа для чпу-станков заводит форум, для пользователей, где будет общение и поддержка.
                                    Отлично! Давайте конструктивно — вы тут подняли пример… с вам и ссылки. На сайт — а сравним с теми 16 тысячами страниц, что находятся на тему ЧПУ на том же Хабре.

                                    Я без повоха кстати. Потому что программистов я знаю что они ищут ответы на stackoverflow.com, который, 100% относится к категории «площадки, которая была изначально создана для заработка на рекламе»… но, возможно, мы — редкое исключение? И все домохозяйки тусуются на форумах Тефаль?

                                    Мне так не кажется, но я станками с ЧПУ не интересуюсь, так что достоверно не знаю…
                                    0
                                    Хорошо, почему мне тогда не платят за сбор аналитики интересов? Куки, под их видом много всего собирается, от личного телефона при регистрации, до поиска на сайте и действий. Так что воруют именно сайты. И если это уже норма, то почему адблок не норма? Ведь ты такой регистрируешься на каком-нибудь сайте, а через день тебе уже лезет спам на почту. Или через неделю. А еще, пусть есть и ворованные статьи, что видно — ссылок на источники нигде нет!
                                    Мне вот уже несколько лет предлагают всевозможные курсы по IT, от си до python; от управления командой до 3d-моделирования. Почему? Потому что однажды где-то как-то искал инфу, 1 разок. А то, что я Frontend — этим системам пофиг на это.
                                +12
                                Периодически пытаюсь «поддержать» владельцев того или иног осайта и отключаю для их сайта adblock… и почти сразу же включаю обратно, потому что рекламы не просто чрезмерно много, так она ещё и перекрывает контент! А уж про то, как реклама пожирает ресурсы, если добавили анимационныу рекламу со скриптами… Всё реже и реже возникает желание подержать разработчиков сайтов, даже если мне интересен контент.
                                  +10
                                  Абсолютно поддерживаю! Я с пониманием отношусь к рекламе, я даже радуюсь, когда вижу стильную, не тошнотворную рекламу, которая хорошо вписывается в контекст сайта, контента и т.д. Но adblock уже перестал быть блажью, он практически необходим для комфортного серфа
                                    +7
                                    Буквально так выглядит сайты без блокировщика рекламы, когда контент занимает 20%. (тут утрированно, но случаи 20%-ого контента реальны и они в топе поисковиков)
                                    image
                                      +1
                                      Признаться, никогда этого не понимал… Вроде много серфлю в сети, ищу постоянно всякое, море вкладок открываю. Но вот, на сайты типа приведенного выше забитые рекламой под завязку попадаю редко. Соответственно, не вижу для себя смысла в каких-то adblock (а сейчас, его уже даже в роутере включить можно). Ну и раз в 100 лет, бывает, кстати, и полезная реклама :).
                                      0
                                      Поддерживаю мнение о ресурсах. Рекламные блоки начинают снимать отпечатки пальцев, чтобы пользователя идентифицировать. Если есть кулер и открыть штук десять сайтиков с рекламой, то во время загрузки можно сушить волосы.
                                      Потраченные дополнительные ресурсы пользователей никто не считает.
                                        0
                                        Контекстная реклама бесполезна для меня в 99% случаев, потому что её показывают месяцами после того, как я уже купил то, что искал.
                                      +1
                                      Я не видел ни одного адекватного сайта, который бы блокировал контент из-за включённого adblock. Адекватные сайты если и детектят, то вместо банера показывают сообщения вроде — 'Здесь была реклама, но Ваш AdBlock её съел :)'(в конце смайлик) Или просят отключить на их сайте, а они покажут маленькую рекламу, при этом не блокируют свой контент.

                                      overclockers.ru (в промежуток, когда они ещё двигались от состояния адекватного сайта к помойке пользовательских блогов «100500-й топ10 моих находок на алиэкспресс» и «очередное поливания Microsoft говном»).

                                      Если по какой-то причине (блокировщик в браузере, hosts, падение яндекса) не загружалась реклама с яндексдиректа, то контент становился недоступен.
                                        +5
                                        Кто победит в гонке вооружений между блокировщиками рекламы и антиблокировщиками, которые блокируют блокировщиков?

                                        Есть ещё один игрок — это браузер. Именно он решает, какие возможности по управлению контентом есть у сайтов и расширений. И очень печально, что самый популярный браузер разрабатывается компанией Google, которая зарабатывает на рекламе. Manifest V3 убирает мощное blocking webRequest API, заменяя его гораздо более ограниченной альтернативой, что непременно скажется на блокировщиках.


                                        Тот же uBlock Origin обновляется в Chrome Web Store с огромной задержкой и отсутствием CNAME-uncloak, нужного для блокирования некоторых техник вставки рекламы. Его разработчик уже давно говорит, что полноценная блокировка возможна только в Firefox.

                                          –2
                                          Это только приблизит повсеместное внедрение системных блокировщиков рекламы, которые работают на всю систему, а не внутри браузера.
                                            +3
                                            Ну и как вы это хотите сделать во времена повсеместного https? Плюс было такое решение раньше (и я даже за него денюжку отдал и оно у меня стояло) — admuncher, спокойно проксировал через себя весь трафик и резал рекламу, вот только с https не работал вообще. Можно конечно вставить что-то в духе mitm прокси своего, который будет сам терминировать весь https трафик на себя, а далее переподписывать его для всех приложений. Но вот только тогда пользователю можно будет без особенных затрат заменить сайт %bigbanksite% на %ourk00lphishsite%, да и пинниг сертификатов сломается напрочь.
                                              +3
                                              Как раз подменой сертификата и решается. Adguard тот же, например. Для чего-то критичного (оплаты, инетбанки итд) используются вкладки без обработки, или отдельный браузер (с повышенными политиками защиты до кучи).
                                              Вопрос подмены со стороны разработчиков софта — это вопрос вашего им доверия, или появления опенсорс решения, которое параноики смогут проверять при необходимости. Но что-то много лет работы я с таким не сталкивался.
                                              К слову, большинство антивирусных решений и так это делают, но молча и без объяснений для пользователей.
                                                0

                                                AdGuard тоже полагается на расширение и API браузера для борьбы с антиблокировщиками, порежут API, пострадает и он. Системный блокировщик не сможет помешать антиблокировщику.

                                                  0
                                                  С чего бы такие выводы? При чём тут апи браузера, если обработка трафика идёт до того, как он попадёт в браузер вообще?
                                                    0

                                                    Как системный блокировщик понимает контекст сетевого запроса? Как он обрабатывает например правила с $domain?

                                              0
                                              На андроиде и так уже давно только фаер можно юзать.
                                              Там стоит юблок и отлично решает задачи.

                                              Зачем есть кактус и ругаться, что он колется. Может сразу юзать нормальный браузер )
                                                0
                                                Ну для меня нормальный браузер — этот тот, который у меня везде, со своими закладками, паролями, и «вкладки с других устройств». А для компа (имхо) хром лучший.
                                              +1
                                              Пока компания Google не пролоббирует законы против вырезания рекламы во всех браузерах — всё еще не так страшно. Как в своё время запретили видео-рекордеры с функцией вырезания рекламы при записи с ТВ.

                                              Никто не заставляет пользоваться именно тем браузером, где блокировка рекламы поломана. Пока что.

                                              P.S.: А ещё ведь могут пропихнуть гадость наподобие DRM-модуля в стандарт, который будет запрещать любые модификации страницы. Для «защиты» пользователя конечно же.
                                                0
                                                Лоббировать придется во всех странах.
                                                Потому что opensource. Допустим Firefox официально переезжает в Европу или Россию и продолжает выпускать браузер с нужным функционалом. Или тот же Яндекс продолжает выпускать поддержку нужного функционала а на тыкание в законы отвечает что в России таких законов нет и вообще что вы наезажаете(а про то что они не Российская компания забывают).
                                                С DRM модулями — а кто сказал что стандарт обязан к выполнению? Кстати какой именно стандарт? Да, есть история с EME и проблемами с его поддержкой мелкими браузерами но оно нужно для фильмов и есть.

                                                Другая проблема: Даже если мы заставили все браузеры запретить блокировку рекламы то кто сказал что блокирует рекламу обязательно браузер? Блокировать рекламу может и антивирус (и иногда это даже оправдано — когда под видом рекламы вирусы лезут) а бороться с антивирусом бесполезно — прав на машине пользователя у него больше чем у браузера. Или не антивирус а просто отдельная программа какая то. https не спасет. certificate pinning не спасет тоже, просто усложнит работу.
                                                Да файлик hosts все еще достаточно эффективно работает. Запретить и нарушение связности с рекламными сайтами? -:)
                                                  +1
                                                  С одной стороны, Вы правы (и мне очень хочется чтобы это было так). С другой стороны, это очередное наивное мнение айтишника что политические и юридические проблемы можно решать техническими средствами. Мне кажется события последних лет должны были сбить эти розовые очки про «да у них ничего не выйдет», «да сама технология Интернета не позволит», «да они же поломают вообще всё, это нереально», «да люди просто взбунтуются и вывалят на улицы от такого», «да все научатся это обходить в два счёта». Если есть политическая воля и заинтересованность — можно всё. По крайней мере касательно того, что создано человеком.

                                                  В качестве примера, есть такое небезызвестное семейство мобильных устройств от компании Apple. На них разрешён (насколько я знаю) только один браузерный движок. И все браузеры обязаны работать поверх него. И никакой модификации hosts, никаких AdBlock'ов, никаких антивирусов и прочих штук там делать нельзя. А и зачем там антивирус, когда потребительпользователь настолько ограничен в своих действиях? Потребляй что дают. Всё ради безопасности.

                                                  И что будет, если Интернет 2.0 станет полностью проприетарным и будет доступен только через подобные устройства с полностью закрытой экосистемой? Невозможно? Ну да, ну да…
                                                    0
                                                    А я вот приведу в пример игровую консоль XBox 360. Она тоже была закрытой проприетарной системой, но её довольно быстро взломали вдоль и поперек. Можно было не просто играть в пиратские игры, а ещё и играть в них с другими людьми на официальных серверах.

                                                    Если интернет станет полностью проприетарным (т.е. общедоступными останутся только каналы связи, а доступ к сервисам будет только через специальные устройства и программы), то любое устройство после покупки будет сразу относиться к народным умельцам, которые за деньги будут взламывать защиту и устанавливать весь необходимый софт. Понятное дело, что многих устраивают ограничения смартфонов Apple, но для тех, кого не устраивает всегда есть решение.
                                                      +1
                                                      А я вот приведу в пример игровую консоль XBox 360.
                                                      А почему не Dreamcast какой-нибудь или вообще NES?

                                                      Она тоже была закрытой проприетарной системой, но её довольно быстро взломали вдоль и поперек. Можно было не просто играть в пиратские игры, а ещё и играть в них с другими людьми на официальных серверах.
                                                      Это замечательно всё, вот только вышедшую после неё XBox One толком не взломали до сих пор. А ей уже 7 лет, скоро «на пансию выйдет».

                                                      Если интернет станет полностью проприетарным (т.е. общедоступными останутся только каналы связи, а доступ к сервисам будет только через специальные устройства и программы), то любое устройство после покупки будет сразу относиться к народным умельцам, которые за деньги будут взламывать защиту и устанавливать весь необходимый софт.
                                                      Почему вы в этом так уверены?

                                                      Понятное дело, что многих устраивают ограничения смартфонов Apple, но для тех, кого не устраивает всегда есть решение.
                                                      Нет, не всегда. Время между выходом железа и его взломом растёт экпоненциально. Если после выхода очередной модели PS2 чипмейкеры выпускали новый модчип в течении недель, то для XBox360 это время уже мерялось месяцами, а для XBox One и PS4 — годами.

                                                      Понятное дело, что многих устраивают ограничения смартфонов Apple, но для тех, кого не устраивает всегда есть решение.
                                                      Ну… От того, что вы отнесёте в 2030м году вашу железяку к умельцу и получите, радостный такой, её обратно в 2050м обратно с модчипом — вам не будет ни горячо, ни холодно. Даже если вы сами и будете ещё живы, то онлайн-сервисы, к которым можно будет получить доступ будут уже давно закрыты…
                                              0
                                              А почему бы не сделать эдакий прокси-браузер — сначала готовим изображение, куда сайт загружает все, что ему хочется, а потом вытираем всю рекламу без шансов как-то узнать, что она вытерта. И только потом показываем.
                                                0
                                                Но ведь это будет статический сайт? А если это SPA?
                                                • UFO just landed and posted this here
                                                +2
                                                НаноАдблокДефендер — jspenguin2017.github.io/uBlockProtector

                                                Позволяет обходить блокадблок прямо в данную минуту, работает с юБлок и их собственным форком юБлока

                                                По крайней мере после включения, сайт блокадблока перестал показывать мне заглушку
                                                  0
                                                  Вопрос в тему — появился ли проверенный способ бороться с 'suggested for you' в фейсбуке?
                                                    0
                                                    social fixer
                                                      0
                                                      Поставил, настроил 'Hide Sponsored and Suggested Posts', всё равно 'suggested for you' вылезают.
                                                        0
                                                        На закладке «Hide Posts» в текстовом поле для ключевых слов пишем строку «Suggested for You» и отмечаем все галочки — работает.
                                                      0
                                                      F.B. Purity посмотрите. Совсем другой фэйсбук с ним.
                                                        0
                                                        Это вот этот? Описание что-то совсем кустарненько выглядит…
                                                      +3

                                                      Почему для подмены eval и setTimeout используется Proxy? Он ведь создан для решения другой проблемы, а тут можно обойтись простой функцией:


                                                      var originalEval = window.eval;
                                                      window.eval = function() {
                                                        if (check(arguments[0]) {
                                                          return originalEval.apply(this, arguments);
                                                        }
                                                      };
                                                        0
                                                        Спасибо, было интересно посмотреть, как работает блокировщик блокировщиков. А вообще, это довольно мерзкая вещь, когда её используют на сайтах с пиратским фильмом и т.п.
                                                          0
                                                          Как я понимаю, чёрный список для *.avi; *.flv; *.mpg; *.mp4; *.mp3; *.ogg; и т.д. уже бесполезен. Теперь меня интересует выпиливание аудио/видеороликов непосредственно из «частично-загружаемого гипертекста»! Одно дело, «просить» сервер «перескочить» и отправлять данные после </рекламного «div`изиона»>, другое – если это <sкрипtег/>, ведь ¾ веса (объёма данных) самой страницы, гггехх, не то, как подмечает Oplkill — даже с включенным блокировщиком, занимают сценарии внутри неё (а ещё тройные пробелы как в страницах хабрахабр)! Не мегабайты, но всё же, с каждым просмотром какой-либо страницы сайта грузить прописанные в их начале такие огромные сценарии – кому это надо?
                                                          А про стили оформления вообще отдельная тема! Ой, спойлер!
                                                          user_pref("browser.display.document_color_use", 2);
                                                          (кстати, в firefox эта настройка конфликтует с «сопротивлением цифровым отпечаткам» – фон страниц всё равно белый). Некоторые страницы хорошо обесцвечивает, и, в принципе, читать можно, но вот попадаются такие, где контраст меньше, но притемнённые участки принимают настроенный фон, а светлые (яркие) так и остаются яркими (т.е. делает ещё хуже)! Спасает только кнопка «Ночной режим» (под несовместимое расширение CustomButtons), хотя и та может закрыть своим фоном полстраницы, если там что-то плавает (напр. «предупреждения об отравлением печеньями»). А бывает, что какие-нибудь кнопки/значки показываются неправильно.
                                                          А если уж говорить о картинках, проигрывателях, то вообще нужно использовать расширение, помещающее вместо них рамку с прозрачным фоном. Когда мне интересно, что же в этой рамке – вызвать контекстное меню на ней – Загрузить (именно загрузить, а не показать, т.е. похоже на «Перезагрузить изображение»). Если же там видео – закрыть немедленно :))
                                                          То же и с аудио, открываешь сайт радио, а вместе со страницей прилетает десяток мегабайт аудио отрезков – ну и зачем мне они, когда мне нужен только один (максимум два)? Есть ли способ заставить браузер не загружать их «раньше времени»?
                                                            0
                                                            Вопрос к юридически подкованным товарищам: с какого момента можно говорить про контент «мой» и выбирать что с сайта загружать, а что нет, если берешь на себя риски, что сайт с недозагруженным не заработает?
                                                              0
                                                              с какого момента можно говорить про контент «мой»
                                                              — как только купите права на него.
                                                              и выбирать что с сайта загружать, а что нет
                                                              — это к юридическим штукам вообще никакого отношения не имеет. Никто не может заставить вас загружать все скрипты с сайта. Вы можете даже через расширение перевернуть буквы в верх ногами и отображать такие страницы у себя на компьютере, и нечего не нарушите. Все что вы делаете с сайтом у себя на пк — это личное ваше дело(если это не нарушает работу сайта на сервере).

                                                              Я например, много с каких сайтов получаю себе информацию с помощью самописных парсеров. А ведь с помощью парсера мы получаем (во многих случаях) только html(без js, картинок и баннеров). А парсинг — абсолютно легален. Законно ли парсить сайты в России?
                                                                0
                                                                как только купите права на него.
                                                                А если контент предоставляется бесплатно, без подписки и прочих плат?
                                                                  0
                                                                  Совершенно неважно. Права, по умолчанию, остаются у автора. Передача прав должна осуществляться письменным договором.
                                                                    0
                                                                    А право на использование? Я в первую очередь про него говорил, а не про авторское.
                                                                      0
                                                                      implied license? Ну, скажем, с Google серьёзно хотели денег за показ сниппетов.

                                                                      Google отбился, но в сколько миллионов адвокатам это встало — я не знаю.

                                                            Only users with full accounts can post comments. Log in, please.