fuckadblock插件的分析与绕过

fuckadblock插件的分析与绕过

0x01 简介

最近在访问csdn的时候,总是弹出您正在使用adblock。我日你娘,老子用插件还烦我?于是打开F12,开始分析一波


1.png

我认为吧,对于这种js,chrome动态打断点+静态分析,多锻炼自然会了。权当抛砖引玉啦,大神们看看就好

0x02 check-adblock.js

这个js的内容比较短,直接贴出代码就好

!
function() {
    var c, e;
    function t() {
        console.log("AdBlock is not enabled")
    }
    function n() {
        var c, e, t;
        console.log("Adblock is enabled"),
        c = "adblock",
        e = {
            step: "install"
        },
        t = window.location.protocol + "//statistic.csdn.net/",
        $.get(t + c, e);
        var n; !
        function() {
            var c = document.createElement("div");
            c.innerHTML = '<div class="adblock"><img src="https://g.csdnimg.cn/check-adblock/1.0.0/img/monkey@2x.png"/><span>亲爱的用户,您使用了广告屏蔽软件,广告是CSDN向您免费提供服务与产品的重要支持,希望您将csdn.net加入AdBlock Plus<a class="check_a" href="https://bbs.csdn.net/topics/392458005" target="_blank">白名单</a>,感谢支持!</span><em class="check_close"><svg t="1539053811268" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7199" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M512 438.378667L806.506667 143.893333a52.032 52.032 0 1 1 73.6 73.621334L585.621333 512l294.485334 294.485333a52.074667 52.074667 0 0 1-73.6 73.642667L512 585.621333 217.514667 880.128a52.053333 52.053333 0 1 1-73.621334-73.642667L438.378667 512 143.893333 217.514667a52.053333 52.053333 0 1 1 73.621334-73.621334L512 438.378667z" fill="#8a8a8a" p-id="7200"></path></svg></div>';
            var e = document.body.firstChild;
            document.body.insertBefore(c, e)
        } (),
        $(".check_close").length && $(".check_close").on("click",
        function(c) {
            c.stopPropagation(),
            $(this).parents(".adblock").remove(),
            "function" == typeof window.csdn.insertcallbackBlock && window.csdn.insertcallbackBlock()
        }),
        (n = new Date).setDate(n.getDate() + 7),
        document.cookie = "c_adb=1; expires=" + n.toGMTString() + "; domain=csdn.net; path=/",
        "function" == typeof window.csdn.insertcallbackBlock && window.csdn.insertcallbackBlock()
    }
    if (void 0 === window.csdn && (window.csdn = {}), c = "https://g.csdnimg.cn/check-adblock/1.0.8/css/check-adblock.css", (e = document.createElement("link")).rel = "stylesheet", e.type = "text/css", e.href = c, document.getElementsByTagName("head")[0].appendChild(e), "undefined" != typeof fuckAdBlock || "undefined" != typeof FuckAdBlock)
         n();
    else {
        var o = document.createElement("script");
        o.onload = function() {
            fuckAdBlock.onDetected(n),
            fuckAdBlock.onNotDetected(t)
        },
        o.onerror = function() {
            n()
        },
        o.type = "text/javascript",
        o.src = "https://g.csdnimg.cn/lib/fuckadblock/3.2.1/fuckadblock.min.js",
        document.head.appendChild(o)
    }
} ();

这个js会运行(废话)。函数t与函数n的作用很明显,t是未检测到adblock时运行的函数,函数n时检测到adblock时运行的函数。在函数t中,主要行为是:

  1. 访问https://statistic.csdn.net/adblock?step=install,推测是上报并统计adblock的数量
  2. 在网页最顶端创建一个div,用以提示用户,你正在使用adblock
  3. 创建一个key为c_adb的cookie

该函数首先会从第33行的if开始运行。而且,那行比较长的代码,其实都是if中判断语句。

void 0 === window.csdn && (window.csdn = {}), c = "https://g.csdnimg.cn/check-adblock/1.0.8/css/check-adblock.css", (e = document.createElement("link")).rel = "stylesheet", e.type = "text/css", e.href = c, document.getElementsByTagName("head")[0].appendChild(e), "undefined" != typeof fuckAdBlock || "undefined" != typeof FuckAdBlock

按照逗号,一个一个的执行,然后检查fuckAdBlock这个对象。
这行作用是,创建一个adblock一定会拦截的css,然后检查。如果检测到fuckAdBlock这个对象,说明存在adblock,然后提示用户。这个判断主要是在页面完全加载后,如果再有判断adblock的任务,则无需调用检测,直接就可以完成。

如果是页面刚加载的时候,是会绕过这个if的。所以,会创建一个script标签,src是fuckadblock的代码。然后创建一个onload事件,去调用fuckAdBlock。

0x03 fuckadblock.min.js

这个代码有点长,直接截图分析吧。。。

这个代码会创建一个FuckAdBlock的类,也就是图中的e。首先会执行构造函数(深受java荼毒,不太会描述)。设置window的onload事件,也就是等待页面加载完之后再执行check函数。在onload的o函数中,再延迟1秒钟执行check函数,推测是为了更准确的检测adblock,防止出现页面未加载完而导致的判断失效。


2.png

然后开始分析check函数。check函数混淆的比较严重,我精简了一下。该函数的主要作用是:

  1. 调用_checkBait创建一个页面上不可见,但是一定会被adblock拦截的div
  2. 调用setTimeout,设置1秒钟后调用_checkBai函数,检测刚才创建的div对象是否还存在。

我们可以通过动态调试的方式,看一下_checkBait所创建的div是什么样子的。


3.png
1. _checkBai函数
4.png

这个嘛,先通过getComputedStyle获取刚才创建的div的css,然后对比一下。然后调用emitEvent返回结果。
可以看一下if语句中的内容

null !== t.document.body.getAttribute("abp") || null === this._var.bait.offsetParent || 0 == this._var.bait.offsetHeight || 0 == this._var.bait.offsetLeft || 0 == this._var.bait.offsetTop || 0 == this._var.bait.offsetWidth || 0 == this._var.bait.clientHeight || 0 == this._var.bait.clientWidth) && (i = !0), void 0 !== t.getComputedStyle

如果找到创建的这个div对象,说明没有adblock。设置变量i为false。否则,就是已经被adblock拦截。设置i为true。在最后一行代码,判断i,并调用emitEvent。

2. emitEvent函数
    e.prototype.emitEvent = function (t) {
        this._options.debug === !0 && this._log("emitEvent", "An event with a " + (t === !0 ? "positive" : "negative") + " detection was called");
        var e = this._var.event[t === true ? "detected" : "notDetected"];
        for (var i in e) this._options.debug === !0 && this._log("emitEvent", "Call function " + (parseInt(i) + 1) + "/" + e.length),
            e.hasOwnProperty(i) && e[i]();
        return this._options.resetOnEnd === !0 && this.clearEvent(),
            this
    }

该函数作用根据上一步的结果,调用相应的函数。可以看一下this._var.event里面的内容。如图


5.png

可以明了哇,如果detected有多个函数的话,则分别调用。有点像观察者模式了。那么现在有个疑问,detected是啥时候设置的呢?我们要回到开头check-adblock.js中创建script时设置的onload时间

fuckAdBlock.onDetected(n),
fuckAdBlock.onNotDetected(t)

然后看一下fuckAdBlock.onDetected函数

    e.prototype.on = function(t, e) {
        return this._var.event[t === !0 ? "detected": "notDetected"].push(e),
        this._options.debug === !0 && this._log("on", 'A type of event "' + (t === !0 ? "detected": "notDetected") + '" was added'),
        this
    },
    e.prototype.onDetected = function(t) {
        return this.on(!0, t)
    },
    e.prototype.onNotDetected = function(t) {
        return this.on(!1, t)
    },

主要是根据相应的事件,添加到对应的数组里,其中,e.prototype.on的第一行代码this._var.event[t === !0 ? "detected": "notDetected"].push(e)中的push是关键,其中,e是对应事件的处理函数。

至此,就分析完流程了。下面讲一下如何bypass

0x04 tampermonky插件

tampermonky插件可以通过安装各类脚本对网站进行定制。我们只需要写一个脚本就行啦。

  1. 右键添加新脚本


    6.png
  2. 在弹出的界面中输入以下代码

        
        // ==UserScript==
    // @name         Fuck FuckAdblock
    // @namespace    http://tampermonkey.net/
    // @version      0.1
    // @description  try to take over the world!
    // @author       Potatso
    // @match        *://blog.csdn.net/*
    // match 是设置该脚本适用的网站
    // @grant        none
    // ==/UserScript==
    
    (function() {
        'use strict';
        // 等待window加载完,将FuckAdBlock的check函数替换为我们自己的函数
        window.addEventListener('load', function() {
            FuckAdBlock.prototype.check = function(t) {}
        }, false);
    })();
    
  3. 然后点击文件,保存即可


    7.png

检查一下,完成

8.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,421评论 1 45
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,093评论 0 3
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,321评论 0 2
  • 多伦多有种树,它的叶子一到秋天,不似枫叶般红的鲜,红的灿,它是一种黄,那种闪亮的黄。金黄的树叶也铺满了大街小巷的每...
    薄凉默如初阅读 248评论 0 0
  • 本节重点学习的是关于员工出现不当的行为,影响团队整个工作的开展。 这中间就需要好好与员工进行交流、反馈。及时疏通员...
    生活是一种感觉阅读 1,508评论 1 1