一种网页防挂马的方法

文档序号:6469258阅读:337来源:国知局
专利名称:一种网页防挂马的方法
技术领域
本发明涉及计算机病毒防治领域,尤其涉及一种防御网页挂马方法。
背景技术
所谓挂马行为,就是有目的利用第三方软件的漏洞,构造能够触 发漏洞的包含危险代码的数据,使得能够下载执行病毒。常见的利用 大多存在于浏览器或浏览器控件中。而第三方软件的漏洞基本上都是 由于程序员在编写程序时的一些不谨慎造成的,主要表现为对输入 的字符串没有做正确的长度检查,这多半会导致栈溢出;对指针的处 理不正确,比如释放了某个指针指向的内存,但是忘记将该指针设置 为NULL,随后又错误使用这个指针,这可能会导致堆的数据被破坏; 无符号数和有符号数的不正确转换,这很有可能会导致整数溢出。总 结一下,导致漏洞的原因主要是栈溢出、整数溢出、堆数据的破坏 等。
当前,检测第三方软件漏洞导致的挂马行为,主要是网页防挂马 方法。
现有网页防挂马方法的主要思想就是通过拦截正浏览器的一些 操作(比如下载文件,创建进程等等),对这些操作涉及到的文件进 行数字签名验证,可信验证等一系列的验证,如果验证不通过,则提 示用户,让用户来决定是否要执行对应的操作。
上述网页防挂马的方法有如下优缺点优点是,这种网页防挂马 能够拦截绝大多数的挂马行为。缺点是,拦截过于广泛,缺乏针对性, 所有拦截到的操作都需要用户来决定是否继续,拦截的精确度太低, 大部分的工作还要由用户来做。

发明内容
本发明克服了现有技术中的不足,提供一种更加精确的网页防挂 马的方法。
为了解决上述技术问题,通过以下技术方案实现 一种网页防挂 马的方法,包括如下步骤-
A、 监视JavaScript的内存分配情况,判断被分配的堆是否覆盖 到了 0x0A0A0A0A、 0x0C0C0C0C、 0x0D0D0D0D三个地址 之一;如果是,进入步骤B,如果否,进入步骤H;
B、 挂接一些网络API函数和恶意代码常用或者必须用到的 API函数,进入步骤C;
C、 当所述API函数被调用时,判断API函数的返回地址是否 跟0x0A0A0A0A、 0x0C0C0C0C、 0x0D0D0D0D三个地址之 一在同一个内存块内;如果是,进入步骤D,如果否,进入 步骤E;
D、 网页己经被挂马,进入步骤G;
E、 调用VirtualQuery来获取返回地址所在内存块的属性,判断 该内存块属性的Type是否为MEM一IMAGE;如果是,进入 步骤F,如果否,进入步骤D;
F、 将返回地址所在模块的内存中的数据与该模块对应磁盘文 件的数据进行比较;如果相同,进入步骤H,如果不相同, 进入步骤D;
G、 挂接的API函数返回失败,拦截挂马使用所述API函数对
应的原始函数进行的有危害的操作,达到防御的目的; H、未检测到网页被挂马,步骤B中挂接的API函数对原始函 数放行,即调用原始函数完成相应的功能。 上述方法的理论基础是检测第三方软件是否被挂马,等同于检
测是否有第三方软件的漏洞被触发。现有的利用第三方软件漏洞挂马
行为绝大多数都使用了 JavaScript的HeapSpray技术。而上述方法可
以精确、有效检测使用了 JavaScript的HeapSpray技术所进行的漏洞
利用,因此,上述方法可以进一步精确地检测网页挂马行为。
进一步的技术方案是
执行完所述步骤H后进入步骤I,
I、拦截一些关键函数,判断其返回地址是否在栈空间里;如果 是,拦截挂马使用所述关键函数进行的有危害的操作,达到防御的目 的,如果否,对所拦截的关键函数放行。
通过上述步骤I的检测,可以再进一步检测是否有栈溢出漏洞被 利用,使检测网页挂马的广度得以提高。
再进一步的技术方案是
执行完所述步骤H后执行步骤I,,
I'、拦截若干关键函数,判断其返回地址是否在栈空间里;如果 是,拦截挂马使用所述关键函数进行的有危害的操作,达到防御的目 的,如果否,对所拦截的关键函数放行,并进入步骤J;
J、拦截若干关键函数,判断其返回地址的页属性是否含有 PAGE—EXECUTE 、 PAGE EXECUTE READ 、
PAGE一EXECUTE一READWRITE 、 PAGE—EXECUTE—WRITECOPY
中的任意一个;如果是,对该步骤J中所拦截的关键函数放行,如果 否,拦截挂马使用所拦截关键函数进行的有危害的操作,达到防御的 目的。
通过上述步骤J的检测,可以更进一步根据内存页属性来判断是 否有漏洞被利用,使检测网页挂马的广度再次提高。


图1是本发明网页防挂马方法的流程图。 下面结合附图和实施例具体介绍本发明网页防挂马的方法。
具体实施例方式
一般来说,漏洞可分为两个大类第一类是通过破坏内存数据来 触发的漏洞,比如栈溢出,堆数据破坏等等;第二类是组件本身就提
供下载任意文件的接口。本申请的网页防挂马方法主要是针对第一类 漏洞的触发检测。而在第一类漏洞的漏洞利用代码中,绝大部分都使
用了 JavaScript的HeapSpray技术。所以,检测并拦截利用HeapSpmy 的恶意代码是非常有必要的。在使用HeapSpray的时候, 一般会将 EIP指向堆区的0x0C0C0C0C位置,然后用JavaScript申请大量堆 内存,并用包含着0x90和shellcode的"内存片"覆盖这些内存。 通常,JavaScript会从内存低址向高址分配内存,因此申请内存超过 200MB (200MB =200 X 1024X 1024 = 0x0C800000 > 0x0C0C0C0C) 后,0x0C0C0C0C将被含有shdlcode的内存片覆盖。只要内存片中 的0x90能够命中0x0C0C0C0C的位置,shellcode就能最终得到执 行。也就是说,在HeapSpmy的恶意代码中,都有以下这么几个共 同的特点-
1、都会分配大量相同的、含有shellcode的堆内存。
2 、这些堆内存会覆盖0x0A0A0A0A、 0x0C0C0C0C 、 0x0D0D0D0D
三个地址之一。
3、就功能上来看,这些恶意代码都是为了下载木马到本地执行。
根据前文所述的造成漏洞的原因以及HeapSpmy技术的特点,本 发明具体实现防御网页挂马的技术方案如下,结合图h
A、 监视JavaScript的内存分配情况,判断被分配的堆覆是否盖到
了 0x0A0A0A0A、 0x0C0C0C0C、 0x0D0D0D0D三个地址之一; 如果是,进入步骤B,如果否,进入步骤H。 JavaScript通过 JScript.dll来解释并执行脚本,JScriptdll通过调用 SysAllocStringByteLen来为字符串分配内存;所以只需挂接 SysAllocStringByteLen就可以监视JavaScript的内存分配了 。
B、 挂接一些网络API函数和恶意代码常用或者必须用到的API函 数,进入步骤C。从平常分析木马下载器的经验来看,病毒下 载文件无非使用三个系列的API函数Socket系列函数、 URLDownloadToFileA, WinINet系列函数。如果利用socket 系列函数下载,则WSAStartup是其必须调用的函数,如果使 用WinINet系列函数下载,IntemetOpen是其必须调用的函数。 所以,挂接并拦截WSAStartup、 URLDownloadToFileA以及 IntemetOpen就可以监视到shellcode是否要下载文件。另外, 除了这些网络API函数, 一些shellcode常用或者说必须用的 API函数也可以监视,比如LoadLibraryA。
C、 当被挂接的API函数被调用时,判断API函数的返回地址是否 跟0x0A0A0A0A、 0x0C0C0C0C、 0x0D0D0D0D三个地址之一
在同一个内存块内;如果是,进入步骤D,如果否,进入步骤 E。通过对一些shellcode的研究发现,目前已知shellcode的执
行有两种方式 一是直接执行,二是将自己拷贝到其它的内存
区域,然后跳过去执行。对于第一种执行方式,其返回地址肯
定是跟0x0A0A0A0A、 0x0C0C0C0C、 0x0D0D0D0D三个地址 之一在同一个内存块内,因此,在此步骤中,如果是,进入步 骤D。对于第二种执行方式,内存拷贝的目的内存有两种可能 一是,这块内存不属于任何模块;二是,这块内存属于某一个 模块。为了解决这个问题,我们可以调用VirtualQuery来获取 返回地址所在内存块的属性,如果该内存块属性的Type不为 MEM_IMAGE,那可以肯定是shellcode调用了被我们挂接的 API,网页已经被挂马。如果Type是MEM一IMAGE,我们可以 将返回地址所在模块的内存中的数据与磁盘上的数据进行比 较,如果不相同,那可以肯定是shellcode调用了被我们挂接的 API,网页已经被挂马,如下述步骤E、 F所述。
D、 网页已经被挂马,进入步骤G。
E、 调用VirtualQuery来获取返回地址所在内存块的属性,判断该 内存块属性的Type是否为MEM—IMAGE;如果是,进入步骤 F,如果否,进入步骤D。
F、 将返回地址所在模块的内存中的数据与该模块对应磁盘文件的 数据进行比较;如果相同,进入步骤H,如果不相同,进入步 骤D。
G、 挂接的API函数返回失败,拦截挂马使用所述API函数对应的 原始函数进行的有危害的操作,达到防御的目的。此步骤完成 对已发现的木马进行拦截。例如挂接API函数为 MYURLDownloadToFile、 MYLoadLibrary等,则挂接API函数 直接返回失败,拦截挂马使用原始函数URLDownloadToFile、 LoadLibrary等进行的有危害的操作。
H、 未检测到网页被挂马,步骤B中挂接的API函数对原始函数进 行放行,即调用原始函数完成相应的功能。
如该具体实施方式
部分第一段中所述,步骤A-H的执行可以针对 HeapSpray漏洞利用进行检测。为了进一步提高防挂马的检测广度, 还可以进一步针对栈溢出漏洞进行检测和防御,以及根据内存页属性 进行防御,具体步骤是
执行完所述步骤H后进入步骤I,
I、拦截一些关键函数,判断其返回地址是否在栈空间里;如果 是,拦截挂马使用所述关键函数进行的有危害的操作,达到防御的目 的,如果否,对所拦截的关键函数放行。
执行完上述步骤I可以选择再进入步骤J,根据内存页属性进行 防御。当然也可以不再执行步骤J。该步骤J是在上述步骤I中执行 完"对所拦截的关键函数放行"后执行。
J、拦截一些关键函数,判断其返回地址的页属性是否含有 PAGE EXECUTE 、 PAGEEXECUTE—READ 、
PAGE_EXECUTE—READWRITE 、 PAGE_EXECUTE—WRITECOPY 中的任意一个;如果是,对该步骤J中所拦截的关键函数放行,如果 否,拦截挂马使用所拦截关键函数进行的有危害的操作,达到防御的目的。
上述步骤I和步骤J中所说的关键函数一般包括WSAStartup、 URLDownloadToFileA、 InternetOpen或者LoadLibraryA等等。
当然,也可以不执行上述步骤I,而直接根据内存页属性进行防
御。也就是,执行完所述步骤H后进入步骤J',
J,、拦截一些关键函数,判断其返回地址的页属性是否含有 PAGE—EXECUTE 、 PAGE—EXECUTE—READ 、
PAGE一EXECUTE一READWRITE 、 PAGE—EXECUTE—WRITECOPY 中的任意一个;如果是,对该步骤J中所拦截的关键函数放行,如果 否,拦截挂马使用所拦截关键函数进行的有危害的操作,达到防御的 目的。
最后,为了更准确的拦截网页挂马行为,如果上述方法没有检测 到网页挂马,可以在执行完本发明的网页防挂马方法以后,在利用现 有的网页防挂马方法进行检测,这样一来,网页防挂马的精确性会更 高。
以上步骤仅用以说明而非限制本发明的技术方案。不脱离本发明 精神和范围的任何修改或局部替换,应涵盖在本发明的权利要求范围 当中。
权利要求
1、一种网页防挂马的方法,其特征在于,包括如下步骤A、监视JavaScript的内存分配情况,判断被分配的堆是否覆盖到了0x0A0A0A0A、0x0C0C0C0C、0x0D0D0D0D三个地址之一;如果是,进入步骤B,如果否,进入步骤H;B、挂接若干网络API函数和恶意代码常用或者必须用到的API函数,进入步骤C;C、当所述API函数被调用时,判断API函数的返回地址是否跟0x0A0A0A0A、0x0C0C0C0C、0x0D0D0D0D三个地址之一在同一个内存块内;如果是,进入步骤D,如果否,进入步骤E;D、网页已经被挂马,进入步骤G;E、调用VirtualQuery来获取返回地址所在内存块的属性,判断该内存块属性的Type是否为MEM_IMAGE;如果是,进入步骤F,如果否,进入步骤D;F、将返回地址所在模块的内存中的数据与该模块对应磁盘文件的数据进行比较;如果相同,进入步骤H,如果不相同,进入步骤D;G、挂接的API函数返回失败,拦截挂马使用所述API函数对应的原始函数进行的有危害的操作,达到防御的目的;H、未检测到网页被挂马,步骤B中挂接的API函数对原始函数放行,即调用原始函数完成相应的功能。
2、 根据权利要求l所述的网页防挂马的方法,其特征在于, 执行完所述步骤H后进入步骤I,I、拦截若干关键函数,判断其返回地址是否在栈空间里;如果是, 拦截挂马使用所述关键函数进行的有危害的操作,达到防御的目的, 如果否,对所拦截的关键函数放行。
3、 根据权利要求l所述的网页防挂马的方法,其特征在于,执行完所述步骤h后执行步骤r,r、拦截若干关键函数,判断其返回地址是否在栈空间里;如果是,拦截挂马使用所述关键函数进行的有危害的操作,达到防御的目的,如果否,对所拦截的关键函数放行,并进入步骤J;J、拦截若干关键函数,判断其返回地址的页属性是否含有 PAGE—EXECUTE 、 PAGE_EXECUTE_READ 、 PAGE—EXECUTE_READWRITE 、 PAGE—EXECUTE—WRITECOPY中的任意一个;如果是,对该步骤J中所 拦截的关键函数放行,如果否,拦截挂马使用所拦截关键函数进行的 有危害的操作,达到防御的目的。
4、 根据权利要求l所述的网页防挂马的方法,其特征在于, 执行完所述步骤H后进入步骤J',J'、拦截若干关键函数,判断其返回地址的页属性是否含有 PAGE—EXECUTE 、 PAGE—EXECUTE—READ 、 PAGE—EXECUTE—READWRITE 、 PAGE—EXECUTE—WRITECOPY中的任意一个;如果是,对该步骤J,中所 拦截的关键函数放行,如果否,拦截挂马使用所拦截关键函数进行的 有危害的操作,达到防御的目的。
5、 根据权利要求2-4中任意一项所述的网页防挂马的方法,其特 征在于,所述关键函数包括WSAStart叩、URLDownloadToFileA、 InternetOpen 或者LoadLibraryA。
6、 根据权利要求1-4中任意一项所述的网页防挂马的方法,其特 征在于,步骤A中,通过挂接SysAllocStringByteLen监视JavaScript的内 存分配。
7、 根据权利要求1-4中任意一项所述的网页防挂马的方法,其特 征在于,所述原始函数包括WSAStartup、 URLDownloadToFileA、 InternetOpen 或者LoadLibraryA。
全文摘要
本发明涉及一种防御网页挂马方法。网页防挂马的方法包括如下步骤A.监视JavaScript的内存分配情况,判断被分配的堆是否覆盖到了0x0A0A0A0A、0x0C0C0C0C或0x0D0D0D0D;是,进入B,否,进入H;B.挂接一些API函数;C.判断API函数的返回地址是否跟0x0A0A0A0A或0x0C0C0C0C或0x0D0D0D0D在同一个内存内;是,进入D,否,进入E;D.进入步骤G;E.判断该内存块属性的Type是否为MEM_IMAGE;是,进F,否,进D;F.比较存中的数据和磁盘文件数据;相同,进H,不同,进D;G.拦截有危害的操作;H.对原始函数放行。上述方法可以进一步精确地检测网页挂马行为。
文档编号G06F21/00GK101388057SQ200810198999
公开日2009年3月18日 申请日期2008年10月7日 优先权日2008年10月7日
发明者李成科, 虎 程, 陈志强 申请人:珠海金山软件股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1