您的位置:首页 > 移动开发

教你怎么屏蔽掉在移动端的宽带运营商的流量劫持,屏蔽无耻的广告

2016-01-02 13:46 891 查看
自从住进了租房以来,在使用租房的宽带的时候总有个问题,已经几个月了,今天我实在无法忍受这些广告了。决定要整治这些劫持广告。
一开始想到用socks5代理,需要自己租服务器,而且很麻烦,而且我研究了下劫持的页面,并且从网上也发现了一些其它用户遇到的问题。
这里有一个链接:
http://bbs.kafan.cn/thread-1856999-1-1.html
上面这个链接详细描述了劫持的毒害。。。。

我主要遇到下面几个类型的劫持:
类型一:输入百度的时候,后面会自动被加上尾巴然后进行跳转。尤其是输入www.hao123.com的时候,会跳转到http://www.hao123.com/?tn=94150859_hao_pg

但是如果你使用https://www.baidu.com是没法跳转的,建议大家修改自己的chrome的浏览器的默认搜索引擎,加上https,还好百度开启了https,这时候我深感推广https的重要性。没有https的话,这些运营商想怎么改你的网页就怎么修改。

类型二:就是常见的右下角广告了,这个还好解决,装上adblock plus就可以一劳永逸了。

但是真正让我苦恼的是下面的类型三:

类型三:手机访问网页的时候,运营商会根据你的UA来植入广告,这个广告是和pc上浏览器的是不同的。
这个广告是类似于我们玩手游的时候,在网页中间插入一个广告悬浮窗达到目的。。。这移动端的广告还真是与时俱进啊

下面自己感受一下这个广告,我有强迫症的简直无法忍受。



点开右侧那个悬浮广告,就会出现下面这个了:



再看一下下面的声明,多么无耻,没有下限啊。。。



还无毒,你知不知道你造成了骚扰啊。
这个玩意的毒害真的太大了。
主要是使用了WebView的app,app在用webview加载网页的时候,此广告都会识别浏览器中携带的ua信息,自动植入。。。
我看的今日头条app在我租房的wifi下基本无法使用,今日头条很多h5的页面,被强行修改了页面内容。无法浏览。
同时查看微信公众号的东西,中间同样出现悬浮窗,我不理解为什么微信不尽早使用https。

后面我开始想办法解决这个毒瘤了。
既然你是通过ua识别的,首先我通过chrome的device mode,设置为nexus7设备访问,刷新几次页面之后,如愿所偿的出现了广告。
于是我修改ua(chrome在device 模式下的ua是可以修改的),将ua修改为f u c k。

果然没有移动广告了,但是右下角广告就出现了。。。
好吧我不修改ua,在ua后面加入足够多的乱码。经过一番测试,加到500多个没用字符之后,不再出现广告了。

个人理解为:这个劫持商要劫持那么多用户,肯定对http header的长度有所限制,超出这个限制之后,它就不会再劫持了,否则他自己的服务器压力也很大的。

到此,这个方案已经有效了,接下来是怎么运用到android平台上。
这时候需要用到一个android上的神器框架xposed。不了解的读者可以自行百度一下。

思路:使用xposed框架hook webView控件的loadUrl,在loadUrl之前将webView的ua修改为足够长。
我的xposed代码很简单,几行就解决了这个劫持问题了。

public static final String ua="Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2307.2 Safari/537.360123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199";
@Override
public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
// TODO Auto-generated method stub
XposedHelpers.findAndHookMethod("android.webkit.WebView", lpparam.classLoader, "loadUrl", String.class,new XC_MethodHook() {

@Override
protected void beforeHookedMethod(MethodHookParam param)
throws Throwable {
// TODO Auto-generated method stub
Object thisObj=param.thisObject;
if(thisObj instanceof WebView){
((WebView) thisObj).getSettings().setUserAgentString(ua);
}
}
});
}


上面的ua,是找到一个移动端适用的ua,然后后面加上500多个没用字符。移动端ua是一定要的,我发现如果我没用移动端ua的话,有些app是会拒绝加载的,因为他们需要ua里面的Android这个关键字。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息