QQ尾巴的原理分析及其防御
以下是资料介绍,如需要完整的请充值下载.
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
资料介绍:
病毒的生命周期
计算机病毒的产生过程可分为:程序设计-传播-潜伏-触发-运行-实行攻击。计算机病毒拥有一个生命周期,从生成开始到完全根除结束。下面我们描述病毒生命周期的各个时期。
1. 开发期:在几年前,制造一个病毒需要计算机编程语言的知识。但是今天了解一点计算机编程知识的人都可以制造一个病毒。通常计算机病毒是一些误入歧途的、试图传播计算机病毒和破坏计算机的个人或组织制造的。
2. 传染期:在一个病毒制造出来后,病毒的编写者将其拷贝并确认其已被传播出去。通常的办法是感染一个流行的程序,再将其放入BBS站点上、校园和其他大型组织当中分发其复制物。
3. 潜伏期:病毒是自然地复制的。一个设计良好的病毒可以在它活化前长时期里被复制。这就给了它充裕的传播时间。这时病毒的危害在于暗中占据存储空间。
4. 发作期:带有破坏机制的病毒会在遇至(某一特定条件时发作,一旦遇上某种条件,比如某个日期或出现了用户采取的某特定行为,病毒就被活化了。没有感染程序的病毒属于没有活化,这时病毒的危害在于暗中占据存储空间。
5. 发现期:这一段并非总是这样做,但通常如此。当一个病毒被检测到并被隔离出来后,它被送到计算机安全协会或反病毒厂家,在那里病毒被通报和描述给反病毒研究工作者。通常发现病毒是在病毒成为计算机社会的灾难之前完成的。
6. 消化期:在这一阶段,反病毒开发人员修改他们的软件以使其可以检测到新发现的病毒。这段时间的长短取决于开发人员的素质和病毒的类型。
7. 消亡期:若是所有用户安装了最新版的杀毒软件,那么任何病毒都将被扫除。这样没有什么病毒可以广泛地传播,但有一些病毒在消失之前有一个很长的消亡期。至今,还没有哪种病毒已经完全消失,但是某些病毒已经在很长时间里不再是一个重要的威胁了。[5]
QQ尾巴病毒
2.2.1 病毒原理
QQ尾巴从本质上应该是种恶意病毒。此病毒其实是在一些恶意网站上嵌入了一段恶意代码,利用Windows系统下的Internet Explorer的iFrame系统漏洞自动运行恶意木马程序,从而达到侵入用户系统,进而借助QQ发送垃圾信息的目的。病毒在用户发QQ消息时先截获这段消息。并在后面添加自己的恶意文字。病毒通过浏览器漏洞,欺骗用户单击网址,让用户运行恶意程序这些运行了的程序会留在用户的系统中,自动监控QQ聊天窗口,发送按钮等。当用户发送消息时他就将之截获,并在后面添加病毒自身指定的内容再发送出去,这样就成了QQ尾巴。
QQ尾巴的假消息通常都是以下几句的一种:
1.HOHO~~ HTTP://www.mm*****.com/刚刚朋友给我发来这个东东。你不看看就后悔哦,嘿嘿,也发给你的朋友吧。呵呵,其实我觉得这个网站真不错,你看看HTTP://WWW.KTV***.com/. copyright think58 [来源:http://think58.com]
2.想不想来点摇滚粗口舞曲,中华DJ第一站,网址告诉你 HTTP://WWW.qq33***.com.不要告诉别人~哈哈,真正算得上是国内最棒的DJ站点。
3. HTTP://WWW.hao***.com/帮忙看看这个网站打不打得开。
4. HTTP://NI***.126.COM 看看啊。我最近照的照片~ 才扫描到网上的。看看我是不是变了样?
钩子技术
3.1钩子的概念
我们知道,在DOS操作系统下编程,如果想截获某种系统功能,可以采取系统中断的方法。但在Windows操作系统,中断描述符表在保护模式下是受系统保护的,在应用程序层次是不能再通过修改中断向量来截获系统中断了。不过,Windows操作系统却提供了钩子来完成截获中断的功能。Windows钩子(Windows Hook)点,应用程序可以这里安装一个监视子程序,这样就可以在系统中的消息流到达目的窗口过程前监控它们。Windows操作系统是建立在事件驱动机制之上的,系统各部分之间的沟通也都是通过消息的相互传递而实现的。如果需要对在进程外传递的消进行拦截处理,Windows钩子正好可以大展身手,用它可以轻松截获并处理在其他应用程序之间传递的消息,并此可以完成一些普通应用程序难以实现的特殊功能。
3.2钩子类型 [资料来源:THINK58.com]
Windows钩子可以分成两种类型:线程钩子和全局钩子。线程钩子只能监视某个线程,而全局钩子则可对在当系统下运行的所有线程进行监视。显然,线程钩子可以看作是全局钩子的一个子集,全局钩子虽然功能强大,但时实现起来也复杂一些:其钩子函数的实现必须封装在动态链接库DLL(Dynamic Link Library)中才可以使用。
WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。利用它们,你可以捕捉自己进程或其它进程发生的事件。通过“钩挂”,你可以给WINDOWS一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生你感兴趣的事件时,WINDOWS都将调用该函数。一共有两种类型的钩子:局部的和远程的。
局部钩子仅钩挂自己进程的事件。
远程的钩子还可以钩挂其它进程发生的事件。
远程的钩子又有两种: 基于线程的钩子:它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。
系统范围的钩子将捕捉系统中所有进程将发生的事件消息。
安装钩子函数将会影响系统的性能。监测“系统范围事件”的系统钩子特别明显。因为系统在处理所有的相关事件时都将调用你的钩子函数,这样你的系统将会明显的减慢。所以应谨慎使用,用完后立即卸载。还有,由于你可以预先截获其它进程的消息,所以一旦你的钩子函数出了问题的话必将影响其它的进程。记住:功能强大也意味着使用时要负责任。[8]
在正确使用钩子函数前,我们先讲解钩子函数的工作原理。当你创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果你安装的是一个局部钩子,那么你进程中的钩子函数将被调用。如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以如果你想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。当然有两个例外:工作日志钩子和工作日志回放钩子。这两个钩子的钩子函数必须在安装钩子的线程中。原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。所以如果把回调函数放在DLL中,输入的事件被放在几个线程中记录,所以我们无法保证得到正确的次序。所以解决的办法是:把钩子函数放到单个的线程中,譬如安装钩子的线程。[14]
钩子一共有14种,以下是它们被调用的时机:
WH_CALLWNDPROC 当调用SendMessage时 ;
WH_CALLWNDPROCRET 当SendMessage的调用返回时 ;
WH_GETMESSAGE 当调用GetMessage 或 PeekMessage时 ;
WH_KEYBOARD 当调用GetMessage 或 PeekMessage 来从消息队列中查询WM_KEYUP 或 WM_KEYDOWN 消息时 ;
WH_MOUSE 当调用GetMessage 或 PeekMessage 来从消息队列中查询鼠标事件消息时 ;
WH_HARDWARE 当调用GetMessage 或 PeekMessage 来从消息队列种查询非鼠标、键盘消息时 ;
WH_MSGFILTER 当对话框、菜单或滚动条要处理一个消息时。该钩子是局部的。它是为那些有自己的消息处理过程的控件对象设计的;
WH_SYSMSGFILTER 和WH_MSGFILTER一样,只不过是系统范围的 ;
WH_JOURNALRECORD 当WINDOWS从硬件队列中获得消息时 ;
WH_JOURNALPLAYBACK 当一个事件从系统的硬件输入队列中被请求时 ;
WH_SHELL 当关于WINDOWS外壳事件发生时,譬如任务条需要重画它的按钮;
WH_CBT 当基于计算机的训练(CBT)事件发生时;
WH_FOREGROUNDIDLE 由WINDOWS自己使用,一般的应用程序很少使用 ;
WH_DEBUG 用来给钩子函数除错 。
现在我们知道了一些基本的理论,现在开始讲解如何安装/卸载一个钩子。
要安装一个钩子,你可以调用SetWindowHookEx函数。该函数的原型如下:
SetWindowsHookEx proto HookType:DWORD, pHookProc:DWORD, hInstance:DWORD, ThreadID:DWORD
HookType 是我们上面列出的值之一,譬如: WH_MOUSE, WH_KEYBOARD 。
pHookProc 是钩子函数的地址。如果使用的是远程的钩子,就必须放在一个DLL中,否则放在本身代码中 。 think58 [来源:http://www.think58.com]
hInstance 钩子函数所在DLL的实例句柄。如果是一个局部的钩子,该值为NULL。
ThreadID 是你安装该钩子函数后想监控的线程的ID号。该参数可以决定该钩子是局部的还是系统范围的。如果该值为NULL,那么该钩子将被解释成系统范围内的,那它就可以监控所有的进程及它们的线程。如果你指定了你自己进程中的某个线程ID 号,那该钩子是一个局部的钩子。如果该线程ID是另一个进程中某个线程的ID,那该钩子是一个全局的远程钩子。这里有两个特殊情况:WH_JOURNALRECORD 和 WH_JOURNALPLAYBACK总是代表局部的系统范围的钩子,之所以说是局部,是因为它们没有必要放到一个DLL中。WH_SYSMSGFILTER 总是一个系统范围内的远程钩子。其实它和WH_MSGFILTER钩子类似,如果把参数ThreadID设成0的话,它们就完全一样了。【5】
如果该函数调用成功的话,将在eax中返回钩子的句柄,否则返回NULL。你必须保存该句柄,因为后面我们还要它来卸载钩子。
要卸载一个钩子时调用UnhookWidowHookEx函数,该函数仅有一个参数,就是欲卸载的钩子的句柄。如果调用成功的话,在eax中返回非0值,否则返回NULL。
现在知道了如何安装和卸载一个钩子了,接下来我们将看看钩子函数。.
只要安装的钩子的消息事件类型发生,WINDOWS就将调用钩子函数。譬如安装的钩子是WH_MOUSE类型,那么只要有一个鼠标事件发生时,该钩子函数就会被调用。不管安装的时那一类型钩子,钩子函数的原型都时是一样的:
HookProc proto nCode:DWORD, wParam:DWORD, lParam:DWORD
nCode 指定是否需要处理该消息 ;
wParam 和 lParam 包含该消息的附加消息 ;
HookProc 可以看作是一个函数名的占位符。只要函数的原型一致,你可以给该函数取任何名字。至于以上的几个参数及返回值的具体含义各种类型的钩子都不相同。譬如:
WH_CALLWNDPROC
nCode 只能是HC_ACTION,它代表有一个消息发送给了一个窗口 ;
wParam 如果非0,代表正被发送的消息 ;
lParam 指向CWPSTRUCT型结构体变量的指针 ;
return value: 未使用,返回0 。
WH_MOUSE
nCode 为HC_ACTION 或 HC_NOREMOVE ;
wParam 包含鼠标的事件消息;
lParam 指向MOUSEHOOKSTRUCT型结构体变量的指针 ;
return value: 如果不处理返回0,否则返回非0值。
计算机病毒的产生过程可分为:程序设计-传播-潜伏-触发-运行-实行攻击。计算机病毒拥有一个生命周期,从生成开始到完全根除结束。下面我们描述病毒生命周期的各个时期。
1. 开发期:在几年前,制造一个病毒需要计算机编程语言的知识。但是今天了解一点计算机编程知识的人都可以制造一个病毒。通常计算机病毒是一些误入歧途的、试图传播计算机病毒和破坏计算机的个人或组织制造的。
2. 传染期:在一个病毒制造出来后,病毒的编写者将其拷贝并确认其已被传播出去。通常的办法是感染一个流行的程序,再将其放入BBS站点上、校园和其他大型组织当中分发其复制物。
3. 潜伏期:病毒是自然地复制的。一个设计良好的病毒可以在它活化前长时期里被复制。这就给了它充裕的传播时间。这时病毒的危害在于暗中占据存储空间。
4. 发作期:带有破坏机制的病毒会在遇至(某一特定条件时发作,一旦遇上某种条件,比如某个日期或出现了用户采取的某特定行为,病毒就被活化了。没有感染程序的病毒属于没有活化,这时病毒的危害在于暗中占据存储空间。
5. 发现期:这一段并非总是这样做,但通常如此。当一个病毒被检测到并被隔离出来后,它被送到计算机安全协会或反病毒厂家,在那里病毒被通报和描述给反病毒研究工作者。通常发现病毒是在病毒成为计算机社会的灾难之前完成的。
copyright think58 [资料来源:www.THINK58.com]
6. 消化期:在这一阶段,反病毒开发人员修改他们的软件以使其可以检测到新发现的病毒。这段时间的长短取决于开发人员的素质和病毒的类型。
7. 消亡期:若是所有用户安装了最新版的杀毒软件,那么任何病毒都将被扫除。这样没有什么病毒可以广泛地传播,但有一些病毒在消失之前有一个很长的消亡期。至今,还没有哪种病毒已经完全消失,但是某些病毒已经在很长时间里不再是一个重要的威胁了。[5]
QQ尾巴病毒
2.2.1 病毒原理
QQ尾巴从本质上应该是种恶意病毒。此病毒其实是在一些恶意网站上嵌入了一段恶意代码,利用Windows系统下的Internet Explorer的iFrame系统漏洞自动运行恶意木马程序,从而达到侵入用户系统,进而借助QQ发送垃圾信息的目的。病毒在用户发QQ消息时先截获这段消息。并在后面添加自己的恶意文字。病毒通过浏览器漏洞,欺骗用户单击网址,让用户运行恶意程序这些运行了的程序会留在用户的系统中,自动监控QQ聊天窗口,发送按钮等。当用户发送消息时他就将之截获,并在后面添加病毒自身指定的内容再发送出去,这样就成了QQ尾巴。
QQ尾巴的假消息通常都是以下几句的一种:
1.HOHO~~ HTTP://www.mm*****.com/刚刚朋友给我发来这个东东。你不看看就后悔哦,嘿嘿,也发给你的朋友吧。呵呵,其实我觉得这个网站真不错,你看看HTTP://WWW.KTV***.com/. copyright think58 [来源:http://think58.com]
2.想不想来点摇滚粗口舞曲,中华DJ第一站,网址告诉你 HTTP://WWW.qq33***.com.不要告诉别人~哈哈,真正算得上是国内最棒的DJ站点。
3. HTTP://WWW.hao***.com/帮忙看看这个网站打不打得开。
4. HTTP://NI***.126.COM 看看啊。我最近照的照片~ 才扫描到网上的。看看我是不是变了样?
钩子技术
3.1钩子的概念
我们知道,在DOS操作系统下编程,如果想截获某种系统功能,可以采取系统中断的方法。但在Windows操作系统,中断描述符表在保护模式下是受系统保护的,在应用程序层次是不能再通过修改中断向量来截获系统中断了。不过,Windows操作系统却提供了钩子来完成截获中断的功能。Windows钩子(Windows Hook)点,应用程序可以这里安装一个监视子程序,这样就可以在系统中的消息流到达目的窗口过程前监控它们。Windows操作系统是建立在事件驱动机制之上的,系统各部分之间的沟通也都是通过消息的相互传递而实现的。如果需要对在进程外传递的消进行拦截处理,Windows钩子正好可以大展身手,用它可以轻松截获并处理在其他应用程序之间传递的消息,并此可以完成一些普通应用程序难以实现的特殊功能。
3.2钩子类型 [资料来源:THINK58.com]
Windows钩子可以分成两种类型:线程钩子和全局钩子。线程钩子只能监视某个线程,而全局钩子则可对在当系统下运行的所有线程进行监视。显然,线程钩子可以看作是全局钩子的一个子集,全局钩子虽然功能强大,但时实现起来也复杂一些:其钩子函数的实现必须封装在动态链接库DLL(Dynamic Link Library)中才可以使用。
WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。利用它们,你可以捕捉自己进程或其它进程发生的事件。通过“钩挂”,你可以给WINDOWS一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生你感兴趣的事件时,WINDOWS都将调用该函数。一共有两种类型的钩子:局部的和远程的。
局部钩子仅钩挂自己进程的事件。
远程的钩子还可以钩挂其它进程发生的事件。
远程的钩子又有两种: 基于线程的钩子:它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。
系统范围的钩子将捕捉系统中所有进程将发生的事件消息。
安装钩子函数将会影响系统的性能。监测“系统范围事件”的系统钩子特别明显。因为系统在处理所有的相关事件时都将调用你的钩子函数,这样你的系统将会明显的减慢。所以应谨慎使用,用完后立即卸载。还有,由于你可以预先截获其它进程的消息,所以一旦你的钩子函数出了问题的话必将影响其它的进程。记住:功能强大也意味着使用时要负责任。[8]
think58 [版权所有:http://think58.com]
在正确使用钩子函数前,我们先讲解钩子函数的工作原理。当你创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果你安装的是一个局部钩子,那么你进程中的钩子函数将被调用。如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以如果你想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。当然有两个例外:工作日志钩子和工作日志回放钩子。这两个钩子的钩子函数必须在安装钩子的线程中。原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。所以如果把回调函数放在DLL中,输入的事件被放在几个线程中记录,所以我们无法保证得到正确的次序。所以解决的办法是:把钩子函数放到单个的线程中,譬如安装钩子的线程。[14]
钩子一共有14种,以下是它们被调用的时机:
WH_CALLWNDPROC 当调用SendMessage时 ;
WH_CALLWNDPROCRET 当SendMessage的调用返回时 ;
WH_GETMESSAGE 当调用GetMessage 或 PeekMessage时 ;
WH_KEYBOARD 当调用GetMessage 或 PeekMessage 来从消息队列中查询WM_KEYUP 或 WM_KEYDOWN 消息时 ;
本文来自think58 [资料来源:http://www.THINK58.com]
WH_MOUSE 当调用GetMessage 或 PeekMessage 来从消息队列中查询鼠标事件消息时 ;
WH_HARDWARE 当调用GetMessage 或 PeekMessage 来从消息队列种查询非鼠标、键盘消息时 ;
WH_MSGFILTER 当对话框、菜单或滚动条要处理一个消息时。该钩子是局部的。它是为那些有自己的消息处理过程的控件对象设计的;
WH_SYSMSGFILTER 和WH_MSGFILTER一样,只不过是系统范围的 ;
WH_JOURNALRECORD 当WINDOWS从硬件队列中获得消息时 ;
WH_JOURNALPLAYBACK 当一个事件从系统的硬件输入队列中被请求时 ;
WH_SHELL 当关于WINDOWS外壳事件发生时,譬如任务条需要重画它的按钮;
WH_CBT 当基于计算机的训练(CBT)事件发生时;
WH_FOREGROUNDIDLE 由WINDOWS自己使用,一般的应用程序很少使用 ;
WH_DEBUG 用来给钩子函数除错 。
现在我们知道了一些基本的理论,现在开始讲解如何安装/卸载一个钩子。
要安装一个钩子,你可以调用SetWindowHookEx函数。该函数的原型如下:
SetWindowsHookEx proto HookType:DWORD, pHookProc:DWORD, hInstance:DWORD, ThreadID:DWORD
HookType 是我们上面列出的值之一,譬如: WH_MOUSE, WH_KEYBOARD 。
pHookProc 是钩子函数的地址。如果使用的是远程的钩子,就必须放在一个DLL中,否则放在本身代码中 。 think58 [来源:http://www.think58.com]
hInstance 钩子函数所在DLL的实例句柄。如果是一个局部的钩子,该值为NULL。
ThreadID 是你安装该钩子函数后想监控的线程的ID号。该参数可以决定该钩子是局部的还是系统范围的。如果该值为NULL,那么该钩子将被解释成系统范围内的,那它就可以监控所有的进程及它们的线程。如果你指定了你自己进程中的某个线程ID 号,那该钩子是一个局部的钩子。如果该线程ID是另一个进程中某个线程的ID,那该钩子是一个全局的远程钩子。这里有两个特殊情况:WH_JOURNALRECORD 和 WH_JOURNALPLAYBACK总是代表局部的系统范围的钩子,之所以说是局部,是因为它们没有必要放到一个DLL中。WH_SYSMSGFILTER 总是一个系统范围内的远程钩子。其实它和WH_MSGFILTER钩子类似,如果把参数ThreadID设成0的话,它们就完全一样了。【5】
如果该函数调用成功的话,将在eax中返回钩子的句柄,否则返回NULL。你必须保存该句柄,因为后面我们还要它来卸载钩子。
要卸载一个钩子时调用UnhookWidowHookEx函数,该函数仅有一个参数,就是欲卸载的钩子的句柄。如果调用成功的话,在eax中返回非0值,否则返回NULL。
现在知道了如何安装和卸载一个钩子了,接下来我们将看看钩子函数。.
只要安装的钩子的消息事件类型发生,WINDOWS就将调用钩子函数。譬如安装的钩子是WH_MOUSE类型,那么只要有一个鼠标事件发生时,该钩子函数就会被调用。不管安装的时那一类型钩子,钩子函数的原型都时是一样的:
think58.com
[来源:http://www.think58.com]
HookProc proto nCode:DWORD, wParam:DWORD, lParam:DWORD
nCode 指定是否需要处理该消息 ;
wParam 和 lParam 包含该消息的附加消息 ;
HookProc 可以看作是一个函数名的占位符。只要函数的原型一致,你可以给该函数取任何名字。至于以上的几个参数及返回值的具体含义各种类型的钩子都不相同。譬如:
WH_CALLWNDPROC
nCode 只能是HC_ACTION,它代表有一个消息发送给了一个窗口 ;
wParam 如果非0,代表正被发送的消息 ;
lParam 指向CWPSTRUCT型结构体变量的指针 ;
return value: 未使用,返回0 。
WH_MOUSE
nCode 为HC_ACTION 或 HC_NOREMOVE ;
wParam 包含鼠标的事件消息;
lParam 指向MOUSEHOOKSTRUCT型结构体变量的指针 ;
return value: 如果不处理返回0,否则返回非0值。