为何“浏览器劫持”可以如此猖狂呢?放眼众多论坛的求助贴,咱们不时能够看到诸如“个人IE被主页被改了,我用杀毒工具扫了一遍都没发现病毒,我把主页改回本身的地址,但是一重启它又回来了!”、“个人系统一开机就跳出一个广告,我明明用了最新版的杀毒软件的啊!”等这类关于IE异常问题的求助,80%的提问者都表示纳闷,他们已经安装了杀毒软件,但是IE仍然被“黑”了,这又是为何?
其实这些都是典型的“浏览器劫持”现象,可是受害者不是已经安装了杀毒软件吗?为何浏览器依然躲不过这只黑手?许多用户对这个领域都存在一种误区心理:浏览器劫持?我有最新的杀毒软件,我不怕!
因而,当他们遭遇“浏览器劫持”时,惊讶了。程序员
要知道,杀毒软件自身也只是一种辅助工具,它不可能彻底保护系统的安全,更况且,杀毒软件用户必须知道一个事实:“浏览器劫持”的攻击手段是能够经过被系统承认的“合法途径”来进行的!杀毒软件只能经过“特征码”的形式来判断程序是否合法,但这是创建在人为定义之后的,而实施“浏览器劫持”的程序能够有不少,防不胜防。编程
为何说“浏览器劫持”能够说是合法的呢?由于大部分浏览器劫持的发起者,都是经过一种被称为“BHO”(Browser Helper Object,浏览器辅助对象)的技术手段植入系统的。
BHO是微软早在1999年推出的做为浏览器对第三方程序员开放交互接口的业界标准,它是一种可让程序员使用简单代码进入浏览器领域的“交互接口”(INTERACTIVED Interface)。经过BHO接口,第三方程序员能够本身编写代码获取浏览器的一些行为(Action)和事件通知(Event),如“后退”、“前进”、“当前页面”等,甚至能够获取浏览器的各个组件信息,像菜单、工具栏、坐标等。因为BHO的交互特性,程序员还可使用代码去控制浏览器的行为,好比常见的修改替换浏览器工具栏、在浏览器界面上添加本身的程序按钮等操做,而这些操做都被视为“合法”的,这就是一切罪恶根源的开始。浏览器
BHO的出现帮助程序员更好的打造个性化浏览器或者为本身的程序实现了方便简洁的交互功能,能够说,若是没有BHO接口的诞生,咱们今天就不能用一些工具实现个性化IE的功能了。从某一方面来看,BHO的确是各类缤纷网络互动功能的幕后功臣,可是一切事物都是有两面性的,这个恒古不变的真理一样对BHO有效,因而就有了今天让安全界头痛的“浏览器劫持”的攻击手段诞生。
看看前面我提到的BHO接口特性,你想到了什么?BHO能够获知和实现浏览器的大部分事件和功能,也就是说,它能够利用少许的代码控制浏览器行为。程序员能够设计出一个BHO按钮以实现用户点击时通知浏览器跳转到某个页面完成交互功能,固然就能够进一步写出控制浏览器跳转到他想让用户去的页面,这就是最初的“浏览器劫持”的成因:BHO劫持。安全
在描述BHO劫持以前,咱们先要对BHO接口的启动作个简单介绍:符合BHO接口标准的程序代码被写为DLL动态连接库形式在注册表里注册为COM对象,还要在BHO接口的注册表入口处进行组件注册,之后每次IE启动时都会经过这里描述的注册信息调用加载这个DLL文件,而这个DLL文件就所以成为IE的一个模块(BHO组件),与IE共享一个运行周期,直到IE被关闭。网络
IE启动时,会加载任何BHO组件,这些组件直接进入IE领域,而IE则成为它们的父进程和载体,今后IE的每个事件都会经过IUnknown接口传递到BHO用以提供交互的IObjectWithSite接口里,这是BHO实现与IE交互的入口函数。
BHO接收到IE接口传递来的参数后开始判断IE正在作什么,理论上BHO能够获取IE的大部分事件,而后根据程序员编写的代码,BHO持有对特定事件作出反应的决定权,例如一个能够实现“中文网址”的BHO,就是经过GetSite方法获取到IE当前打开的站点URL(或经过IURLSearchHook接口来获知),若是BHO发现获取到的URL和内置的判断条件匹配,该BHO就会启用SetSite方法强制IE跳转到程序员设定的页面去,这个过程就是利用about:blank篡改主页的“浏览器劫持”方法之一,它的实现原理其实很简单,程序员编写一个恶意BHO组件,当它获取到IE窗口的当前站点为“about:blank”时就强制IE内部跳转到指定的广告页面,因而闹出了不久以前沸沸扬扬的“IE空白页劫持事件”。ide
了解了这种相似恶做剧的做案手段,要解决它就容易了,只要找到并删除这个隐藏在系统里的BHO程序便可。
除了这类“广告软件”性质的BHO,还有一种利用IURLSearchHook接口实现的另外一类更隐蔽的BHO,这种BHO从某些方面来讲大概不算BHO,由于它并非响应IUnknown,而是等待IE建立IURLSearchHook来启动。IURLSearchHook被浏览器用来转换一个未知的URL协议地址,当浏览器企图去打开一个未知协议的URL地址时,浏览器首先尝试从这个地址获得当前的协议,若是不成功,浏览器将寻找系统里全部注册为“URL Search Hook”(资源搜索钩子,USH)的对象并把这个IE不能理解的地址发送过去,若是某个USH对象“认识”这个地址,它就返回一个特定的标识告诉IE它知道怎么打开这个地址,而后IE就根据约定的方法调用它,最终打开这个地址。其实USH对象并不陌生,咱们一些偷懒的用户就常常为了省事而不输入“http://”,可是IE最终仍是能认出并打开某个地址,就是USH的功劳,可是这一点又被恶意程序员拿来磨刀了,经过建立本身的USH对象,恶意程序员可以命令IE在找不到一些网站时自动跳转到事先设置的站点里,若是这个站点带毒或者挂马,用户就完了。函数
这类BHO的解决方法和前面同样,只是它比较隐蔽,除非用户常常偷懒,不然可能直到系统崩溃也不会知道本身已经感染了这种东西。也许你会说,只要用户的输入永远不会让IE没法识别,这种渗透不就白费了?可是事实不容乐观,咱们没法得知BHO做者还会不会经过其余方法拦截IE,说不定每隔一段时间就让IE弹出一个广告呢?工具
上面说了这么多BHO和IE合做搞破坏的事例,可能会给读者形成一种“BHO必须在IE传递数据后才能行动”的误解,然而事实并不是如此,浏览器自身也是一个标准的可执行程序,而BHO只是借用这个程序进程启动的DLL,它并不是API那种要用的时候就让你过来忙活,忙活完了就一脚踹开的奴隶形态DLL,前面说过了,BHO是一种在浏览器加载时一同启动的例程,它至关于一种自身运行逻辑不太明确的子进程(里面都是对IE事件的响应和操做代码),这个特性就形成了BHO DLL和API DLL本质的区别,BHO并不须要全部事件都必须依赖这个你们伙,它能够有本身决定的权利,只要适当的修改,就能用BHO实现相似DLL木马的功能,固然,这并非说咱们就能在IE眼皮下公然的肆无忌弹干坏事的,因为BHO自身是做为IE子进程启动的,它就必须受到一些限制,例如程序员不能在里面本身建立网络链接,这样会致使IE报错崩溃并供出你写的DLL,惧怕BHO成为另外一种后门的用户能够松口气了,要在BHO里实现Winsock大概只能在IE休息的时候才能够,可是会有哪一个用户开着个开空IE什么事情都不作呢?网站
但这并非说BHO就必定能无害了,虽然用它不能作到远程控制,可是别忘记,BHO能看到IE的全部东西,也就能任意的访问用户文件和注册表,在这个条件成立的前提下,入侵者能够编写代码查找用户隐私,而后在适当时候经过SetSite提交出去——谁叫如今Webmail这么流行呢?这就是为何许多厂商发布诸如“中文网址”、“网络搜索”、“IE定制”、“IE监视”这些功能的BHO的同时都保证“不搜集用户隐私”的缘由,只要你想要,BHO就能获得一切。加密
有些人也许会想,既然BHO是微软浏览器的权利,那我不用IE了,我用Opera、Firefox不行?对于这点当然无可厚非,可是你用不用Windows?用不用共享软件?若是你用Windows,那么,你仍然可能处于被BHO接触到的世界,由于Windows自己就是和IE紧密结合的,这就把“IE进程”的范围给扩大了,细心的用户大概会发现,IE里能直接访问“个人电脑”,“个人电脑”窗口也能迅速变成IE,由于它们实质都是依赖于IE内核的,正由于这个缘由,BHO能够在你打开一个文件夹时跟着偷偷启动。同时,如今的网络正处于一种“共享软件捆绑战略”大肆实施的时代,你再当心也不能避免某些共享软件固定捆绑了BHO的行为,安装后你才会发现文件夹上又多了个什么“助手”、“搜索”了。要想完全逃开BHO的围困,大概只能放弃使用Windows了。
Hook,你钩住浏览器了
正如《侏》里的这句话同样,入侵者也在不断寻找他们的新出路,虽然上面我说了这么多BHO的负面事例,可是真正的危机并非只有BHO的,在一些使用BHO行不通的场合里,入侵者开始投掷他们的钩子。
什么是钩子?让咱们先看看它的官方定义:
钩子(Hook),是Windows消息处理机制的一个平台,应用程序能够在上面设置子程以监视指定窗口的某种消息,并且所监视的窗口能够是其余进程所建立的。当消息到达后,在目标窗口处理函数以前处理它。钩子机制容许应用程序截获处理window消息或特定事件。
钩子其实是一个处理消息的程序段,经过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先获得控制权。这时钩子函数便可以加工处理(改变)该消息,也能够不做处理而继续传递该消息,还能够强制结束消息的传递。
可能上面的官方定义对一部分读者理解有点困难,其实,钩子就像是一切程序的“先知”,一个实现了钩子的程序自身虽然也是普通程序,可是它总能在别的程序获得数据以前就已经知道了一切,这是为何呢?对Windows系统有必定了解的读者应该知道,Windows系统是一个经过“信息处理机制”运做的系统,在这个系统里传递的数据都是经过“消息”(Message)的形式发送的,各个消息都遵循了官方的约定,不然就不能让系统产生回应。并且这个传递步骤是颠倒的,例如咱们关闭了某个程序,咱们可能会认为是程序本身关闭后通知系统的,其实否则,当用户点击关闭按钮的时候,Windows就会把一个叫作WM_CLOSE的消息传递给这个程序,程序接收到消息后就执行卸载自身例程的操做。理解了这点,就能知道钩子的原理了,所谓钩子程序,就是利用了系统提供的Hook API,让本身比每个程序都提早接收到系统消息,而后作出处理,若是一个钩子拦截了系统给某个程序的WM_CLOSE消息,那么这个程序就会由于接收不到关闭消息而没法关闭自身。除了消息之外,钩子还能够拦截API,像咱们都熟悉的屏幕翻译软件就是Hook了一些文本输出函数如TextOutA而达到了目的。
技术让编程人员能够轻松获取其余程序的一些有用数据或传递相关数据,像如今常见的一些游戏外挂,它们就是利用Hook技术钩住了游戏窗体,而后就能够识别游戏里面的行为和模拟发送按键鼠标消息,最终实现电脑本身玩游戏的功能。把这个技术应用到浏览器上面,就成了另外一种控制浏览器行为的方法。
钩子有两种,本地钩子(Local Hook)和全局钩子(Global Hook),本地钩子只在本进程里起做用,故不属于讨论范围;全局钩子代码必须以DLL形式编写,以便在钩子生效时被其它进程所加载调用,所以咱们看到的大部分Hook程序都是DLL形式的。
其实以前提到的BHO也能够视为一种针对IE的钩子,它钩的是IE的事件,这就是IE与BHO交互的起点,可是对于再复杂一点的操做,例如判断IE下载的是GIF图片仍是JPEG图片,BHO无能为力,由于它仅仅知道IE的事件为DownloadBegin和DownloadComplete,对于具体内容,IE自己是不会告诉它的,不然IE岂不是要忙死了?至少我也没见过哪一个领导还须要向秘书汇报中午吃了鸡肉仍是鸭肉的吧,BHO可不是IE的老婆,或者说IE没有气管炎。
因此,为了获得IE的更多数据,程序员开始钩IE了。与BHO不一样,钩子不须要被动的等待IE事件,它直接和IE造成上司对下属的关系,此次轮到IE要作什么都得通过它批准了。Hook形式的控制不须要DLL文件必须与IE的注册表入口产生组件关系,它能够是一个独立的DLL,经过Rundll32.exe或自带的Loader EXE启动,并且因为它属于Hook形式,在钩子有效的状况下会被系统自动插入其余程序的进程中,是否是有点像DLL木马呢?
IE钩子程序载入进程后便能获知全部的消息类型、API和内容,一旦发现某个符合要求的消息,如IE执行了某个事件,或者用户输入了特定内容,钩子的处理代码就开始工做了,它先拦截系统发送给IE的消息,而后分析消息内容,根据不一样消息内容做出修改后再发给IE,就完成了一次Hook篡改过程。用著名的3721实名搜索作例子,一些人会觉得它是采用了BHO或者IURLSearchHook完成中文域名的识别跳转的,其实它是用了可以第一个获得Windows消息的Hook技术,这样一来就能够避免被其余的竞争对手抢先解析域名了:3721的主程序就是一个Hook DLL,它监视IE地址栏的消息,一旦用户输入的是中文,它便在其余BHO类插件工做以前拦截了这个消息,并调用自身代码完成中文域名到英文URL的转换工做,而后返回(也可能与本身的BHO DLL配合)一个让IE跳转到英文URL的消息,完成域名的翻译任务。
IE钩子能帮助程序员用少许代码完成更多的IE交互工做,可是一旦这个钩子被用于犯罪,其后果也是严重的,恶意程序员能够写一个拦截IE输入的键盘钩子,达到窃取密码的做用,这样不管你是用HTTP明文协议仍是SecurityHTTP加密协议都不能逃避密码被盗的下场了,由于它抓的是你在IE里的输入,后面的数据传输已经不重要了。
Winsock LSP
全称为“Windows Socket Layered Service Provider”(分层服务提供商),这是Winsock 2.0才有的功能,它须要Winsock支持服务提供商接口(Service Provider Interface,SPI)才能实现,SPI是一种不能独立工做的技术,它依赖于系统商已经存在的基本协议提供商,如TCP/IP协议等,在这些协议上派分出的子协议即为“分层协议”,如SSL等,它们必须经过必定的接口函数调用,LSP就是这些协议的接口。
经过LSP,咱们能够比分析基本协议更简单的获得咱们想要的数据内容,如直接获得系统上运行的浏览器当前正在进行传输的地址和内容,无论这个浏览器是IE,仍是Opera或Firefox,由于LSP是直接从Winsock获取信息的,即便不用微软生产的汽车,至少你这辆汽车一直是在微软建造的公路上跑的吧。
LSP用在正途上能够方便程序员们编写监视系统网络通信状况的Sniffer,但是如今常见的LSP都被用于浏览器劫持,使用户又多了个噩梦。
亡羊补牢,仍是居安思危?
也许大部分家庭用户都是在经历过一次入侵或中毒事件后才知道安全防范的重要性的,能亡羊补牢固然是好事,可是若是能对本身的要求提升一点,作到未雨绸缪岂不是更好?咱们老是依赖于别人的技术,依赖于模式化的杀毒手段,但那些始终都是别人的东西,控制权不能掌握在本身手上,这并非很好的事情,也许,该是暂时放弃游戏挂级、搜集明星电影,好好研读一下安全方面和系统原理书籍的时候了,不然在这个不安全的网络中,咱们随时可能会迷失本身。
可能有人会想,又在发感慨了。也许是的,由于清除“浏览器劫持”通常都须要手工进行,虽然如今已经有了多个检测浏览器劫持的工具如HijackThis、Browser Hijack Recover等软件面世,可是若是你抱着和以往使用杀毒工具那样“一开扫描就安枕无忧”想法的话,你会发现本身真的会迷失了,因为BHO的特殊性(别忘记,它是合法的),这些工具只会把系统的进程、BHO项目、启动项、LSP等须要有必定技术基础方能理解的东西显示给你,而后由你本身决定IE的明天,若是你未曾重视过安全技术,那么就会以为这些工具如同另外一种折磨你的病毒了。
学,仍是不学?这是个必须考虑的问题……
网页插件 BHO启动,查找.删除
查找BHO
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects
能够找到全部的BHO
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\
中能够找到BHO对应的注册项
其中的InprocServer32的默认值为BHO所对应的dll文件.
删除BHO
关闭IE浏览器.
运行regsvr32 /u XXX.dll
删除对应的dll文件
BHO原理:
BHO就是Browser Helper Object(浏览器辅助对象)
BHO关联原理 (BHO关联的是SHDOCVW,也就是说不仅关联IE,下面所有用IE来讲明)
1.IE的窗口打开时,先寻找HKLM下的SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\ 里的CLSID,这些CLSID,都对应着相应的BHO插件,而后根据这个CLSID到HKCR下的CLSIDs里找到此插件的信息,包括文件位置等。
2.IE根据找到的CLSID信息建立 BHO 对象,而且查找 IObjectWithSite 接口. (这个接口很是简单,只有SetSite和GetSite两个方法)
3.IE把IWebBrowser2(浏览器插件)传到 BHO 的 SetSite 方法,用户在此方法中可挂载本身的事件处理方法。
4.窗口关闭时,IE把 null 传到 BHO 的 SetSite 方法,此方法用来去掉挂载的事件处理方法。
编写BHO流程
一、建立IObjectWithSite显式接口,建立 COM 类型,实现继承IObjectWithSite接口
二、实现此接口并在SetSite方法里加上所要挂载的事件
三、处理事件
四、注册此BHO到注册表中HKLM下的Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects;(HKCR下的CLSIDs是根据上面的路径自动注册的)
五、.net 下须设置此BHO项目的 配置属性_>生成 中为Interop注册为True,这样才能将.net 类库文件注册到COM
http://hi.baidu.com/fanyu_fei/item/696a3e262fed5e0276272c03#