本文仅讨论内嵌页面被插入广告的处理(可控制的IWebBrowser2)
一些内嵌页面的软件往往被无耻的电信运营商加入广告弹窗,严重影响用户体验和口碑,我将在这里讨论几个现象和方法,希望可以给大家一些启发。
一、直接弹窗类
这个我定义为只要是打开你的页面,随之就会弹出一个或数个另外的IE或其他浏览器窗口,显示广告或其他推广内容。(比如广州电信的催费通知)
1.解决方法1
不管你使用的什么语言,都可以对使用的Web控件的方法做挂接,就是所谓的NewWindow3,我们可以拿到bstrUrl,也就是准备打开的新窗口的Url连接,然后可以对Cancel赋值来取消这个动作。
那就很好办了,做一个黑名单或者白名单,来过滤弹出的域名即可达到目的。
(如果处理BeforeNavigate2的话,也可以起到一定效果,如一些内嵌iframe的跳转是会跳到这里的,这样就可以阻止其显示)
2.解决方法2
你可能实验了第一种方法,然后有疑问,为什么我这样做还是会有用户被弹窗,这个问题很明显,弹出的一定不是IE的窗口,可能是360安全浏览器什么的,原因就是其对注册表修改或者使用BHO技术(OCX调用的时候其Dll也会被加载到你的程序里),直接或间接的修改了IE的NewWindow3,使你的程序说了不算,你即使取消了动作,他依然会把这个操作劫持到他的浏览器来打开。
那么这种问题怎么办!
内嵌页面跳出新窗口的浏览器,一定是由当前进程创建的,所以我们只需要Hook下自身的CreateProcessA、CreateProcessW函数并修改,从lpCommandLine可以得到启动命令行,命令行中包含网址信息,对其过滤即可,大概的格式会是这样:
C:\360\360se.exe "http://www.baidu.com"
(此方法有风险,不同浏览器的BHO等兼容性难以测试,请慎用)
二、内嵌iframe
看到右下角那个弹窗了没有,就是它没错。
它的原理是替换了百度统计的h.js文件,所有使用了百度统计的页面都会被强X。
这个是个头疼的问题,可以通过取得IWebBrowser2的Document,枚举iframe及div对象,然后填充为空的代码来实现,后续扩展可以做成黑名单,如满足DispHTMLDivElement增加id=***、src="***"的条件,符合就进行填充。
该方法亲测有效,但还没有实际应用。
我目前正在写代码测试iframe这部分...
三、通用处理
对软件自身从WinInet层面或者Socket做Hook,使用类似广告过滤插件的原理,阻断对应域名、IP的连接。
需收集非法的广告插入地址及域名,可能成本比较高,除非有通用的域名规则(或白名单)。
----------------------------------------------------------------------------------------------------------------------
看到这里,肯定有人说,你怎么不提供代码。
你如果会在意到内嵌页面被插入广告这种程度的问题,你肯定负责的不会是个小项目,相信这些代码对于你来说并不是什么难事,你可以在Git上搜一搜作为参考。
----------------------------------------------------------------------------------------------------------------------
关于运营商是如何推送这些东西的,可以搜索一下DNS劫持、Ipush(学名叫做电信什么什么增值系统)等等,说白了就是:
你>请求>运营商节点>各种路由>所请求的服务器
所请求的服务器>返回>各种路由>运营商节点(修改一下)>返回给你